blob: 164b7f851b4b16d91401bc746b87e7ddbcfdcea3 [file] [log] [blame]
[email protected]e34400c32012-01-24 02:49:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]ab838892009-06-30 18:49:055#include "net/socket/client_socket_pool_base.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
tbansalf82cc8e2015-10-14 20:05:497#include <stdint.h>
dchengc7eeda422015-12-26 03:56:488#include <utility>
[email protected]51fdc7c2012-04-10 19:19:489#include <vector>
10
[email protected]6ecf2b92011-12-15 01:14:5211#include "base/bind.h"
12#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5913#include "base/callback.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
mmenke33d24423d2015-05-19 19:41:0915#include "base/logging.h"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1317#include "base/memory/weak_ptr.h"
Alexander Timin4f9c35c2018-11-01 20:15:2018#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4819#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4520#include "base/single_thread_task_runner.h"
Avi Drissman4365a4782018-12-28 19:26:2421#include "base/stl_util.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0326#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4827#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5928#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0629#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3130#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0931#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3532#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0733#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0034#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1935#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0036#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5637#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4638#include "net/log/test_net_log_entry.h"
39#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0940#include "net/socket/client_socket_factory.h"
41#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2642#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2843#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5444#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1745#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4446#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1047#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0148#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0149#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3850#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4851#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0952#include "testing/gtest/include/gtest/gtest.h"
53
robpercival214763f2016-07-01 23:27:0154using net::test::IsError;
55using net::test::IsOk;
56
[email protected]51fdc7c2012-04-10 19:19:4857using ::testing::Invoke;
58using ::testing::Return;
59
[email protected]f6d1d6eb2009-06-24 20:16:0960namespace net {
61
62namespace {
63
[email protected]211d21722009-07-22 15:48:5364const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2065const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5966constexpr base::TimeDelta kUnusedIdleSocketTimeout =
67 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0168
[email protected]034df0f32013-01-07 23:17:4869// Make sure |handle| sets load times correctly when it has been assigned a
70// reused socket.
71void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
72 LoadTimingInfo load_timing_info;
73 // Only pass true in as |is_reused|, as in general, HttpStream types should
74 // have stricter concepts of reuse than socket pools.
75 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
76
77 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1978 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4879
[email protected]b258e0792013-01-12 07:11:5980 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
81 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4882}
83
84// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3385// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4886// of a connection where |is_reused| is false may consider the connection
87// reused.
88void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
89 EXPECT_FALSE(handle.is_reused());
90
91 LoadTimingInfo load_timing_info;
92 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
93
94 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1995 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4896
[email protected]b258e0792013-01-12 07:11:5997 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
98 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
99 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48100
101 TestLoadTimingInfoConnectedReused(handle);
102}
103
104// Make sure |handle| sets load times correctly, in the case that it does not
105// currently have a socket.
106void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
107 // Should only be set to true once a socket is assigned, if at all.
108 EXPECT_FALSE(handle.is_reused());
109
110 LoadTimingInfo load_timing_info;
111 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
112
113 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19114 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48115
[email protected]b258e0792013-01-12 07:11:59116 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
117 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48118}
119
[email protected]df4b4ef2010-07-12 18:25:21120class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20121 public:
Chris Watkins7a41d3552017-12-01 02:13:27122 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48123
[email protected]df4b4ef2010-07-12 18:25:21124 private:
125 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27126 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21127};
[email protected]7fc5b09a2010-02-27 00:07:38128typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49129
[email protected]3268023f2011-05-05 00:08:10130class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09131 public:
[email protected]034df0f32013-01-07 23:17:48132 explicit MockClientSocket(net::NetLog* net_log)
133 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28134 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20135 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30136 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09137
[email protected]0dc88b32014-03-26 20:12:28138 // Sets whether the socket has unread data. If true, the next call to Read()
139 // will return 1 byte and IsConnectedAndIdle() will return false.
140 void set_has_unread_data(bool has_unread_data) {
141 has_unread_data_ = has_unread_data;
142 }
143
[email protected]3f55aa12011-12-07 02:03:33144 // Socket implementation.
dchengb03027d2014-10-21 12:00:20145 int Read(IOBuffer* /* buf */,
146 int len,
Brad Lassey3a814172018-04-26 03:30:21147 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28148 if (has_unread_data_ && len > 0) {
149 has_unread_data_ = false;
150 was_used_to_convey_data_ = true;
151 return 1;
152 }
[email protected]e86df8dc2013-03-30 13:18:28153 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33154 }
[email protected]ab838892009-06-30 18:49:05155
[email protected]a2b2cfc2017-12-06 09:06:08156 int Write(
157 IOBuffer* /* buf */,
158 int len,
Brad Lassey3a814172018-04-26 03:30:21159 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08160 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01161 was_used_to_convey_data_ = true;
162 return len;
[email protected]ab838892009-06-30 18:49:05163 }
Avi Drissman13fc8932015-12-20 04:40:46164 int SetReceiveBufferSize(int32_t size) override { return OK; }
165 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05166
[email protected]dbf036f2011-12-06 23:33:24167 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21168 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24169 connected_ = true;
170 return OK;
171 }
[email protected]f6d1d6eb2009-06-24 20:16:09172
dchengb03027d2014-10-21 12:00:20173 void Disconnect() override { connected_ = false; }
174 bool IsConnected() const override { return connected_; }
175 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28176 return connected_ && !has_unread_data_;
177 }
[email protected]0b7648c2009-07-06 20:14:01178
dchengb03027d2014-10-21 12:00:20179 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16180 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09181 }
[email protected]f6d1d6eb2009-06-24 20:16:09182
dchengb03027d2014-10-21 12:00:20183 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35184 return ERR_UNEXPECTED;
185 }
186
tfarina428341112016-09-22 13:38:20187 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02188
dchengb03027d2014-10-21 12:00:20189 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37190 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20191 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
192 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03193 void GetConnectionAttempts(ConnectionAttempts* out) const override {
194 out->clear();
195 }
196 void ClearConnectionAttempts() override {}
197 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49198 int64_t GetTotalReceivedBytes() const override {
199 NOTIMPLEMENTED();
200 return 0;
201 }
Paul Jensen0f49dec2017-12-12 23:39:58202 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45203
[email protected]f6d1d6eb2009-06-24 20:16:09204 private:
205 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28206 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20207 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01208 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09209
[email protected]ab838892009-06-30 18:49:05210 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09211};
212
[email protected]5fc08e32009-07-15 17:09:57213class TestConnectJob;
214
[email protected]f6d1d6eb2009-06-24 20:16:09215class MockClientSocketFactory : public ClientSocketFactory {
216 public:
[email protected]ab838892009-06-30 18:49:05217 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09218
danakj655b66c2016-04-16 00:51:38219 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04220 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41221 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19222 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41223 NOTREACHED();
danakj655b66c2016-04-16 00:51:38224 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41225 }
226
Helen Lid5bb9222018-04-12 15:33:09227 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07228 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38229 std::unique_ptr<
230 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07231 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19232 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09233 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09234 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09235 }
236
danakj655b66c2016-04-16 00:51:38237 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
238 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27239 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21240 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13241 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09242 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38243 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09244 }
Matt Menkefd956922019-02-04 23:44:03245
246 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
247 std::unique_ptr<StreamSocket> nested_socket,
248 const HostPortPair& host_and_port,
249 const SSLConfig& ssl_config,
250 const SSLClientSocketContext& context) override {
251 NOTIMPLEMENTED();
252 return std::unique_ptr<SSLClientSocket>();
253 }
254
Helen Liac3c51e2018-04-24 00:02:13255 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
256 std::unique_ptr<ClientSocketHandle> transport_socket,
257 const std::string& user_agent,
258 const HostPortPair& endpoint,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00259 const ProxyServer& proxy_server,
Helen Liac3c51e2018-04-24 00:02:13260 HttpAuthController* http_auth_controller,
261 bool tunnel,
262 bool using_spdy,
263 NextProto negotiated_protocol,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00264 ProxyDelegate* proxy_delegate,
Helen Liac3c51e2018-04-24 00:02:13265 bool is_https_proxy,
266 const NetworkTrafficAnnotationTag& traffic_annotation) override {
267 NOTIMPLEMENTED();
268 return nullptr;
269 }
[email protected]f6d1d6eb2009-06-24 20:16:09270
Matt Menke52cd95a2019-02-08 06:16:27271 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
272 std::unique_ptr<StreamSocket> stream_socket,
273 const std::string& user_agent,
274 const HostPortPair& endpoint,
275 const ProxyServer& proxy_server,
276 HttpAuthController* http_auth_controller,
277 bool tunnel,
278 bool using_spdy,
279 NextProto negotiated_protocol,
280 ProxyDelegate* proxy_delegate,
281 bool is_https_proxy,
282 const NetworkTrafficAnnotationTag& traffic_annotation) override {
283 NOTIMPLEMENTED();
284 return nullptr;
285 }
286
[email protected]5fc08e32009-07-15 17:09:57287 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55288
[email protected]5fc08e32009-07-15 17:09:57289 void SignalJobs();
290
[email protected]03b7c8c2013-07-20 04:38:55291 void SignalJob(size_t job);
292
293 void SetJobLoadState(size_t job, LoadState load_state);
294
Matt Menke141b87f22019-01-30 02:43:03295 // Sets the HasConnectionEstablished value of the specified job to true,
296 // without invoking the callback.
297 void SetJobHasEstablishedConnection(size_t job);
298
[email protected]f6d1d6eb2009-06-24 20:16:09299 int allocation_count() const { return allocation_count_; }
300
[email protected]f6d1d6eb2009-06-24 20:16:09301 private:
302 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57303 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09304};
305
[email protected]ab838892009-06-30 18:49:05306class TestConnectJob : public ConnectJob {
307 public:
308 enum JobType {
309 kMockJob,
310 kMockFailingJob,
311 kMockPendingJob,
312 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57313 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13314 kMockRecoverableJob,
315 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18316 kMockAdditionalErrorStateJob,
317 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28318 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05319 };
320
[email protected]994d4932010-07-12 17:55:13321 // The kMockPendingJob uses a slight delay before allowing the connect
322 // to complete.
323 static const int kPendingConnectDelay = 2;
324
[email protected]ab838892009-06-30 18:49:05325 TestConnectJob(JobType job_type,
326 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49327 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34328 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05329 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30330 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17331 NetLog* net_log)
tfarina428341112016-09-22 13:38:20332 : ConnectJob(
tfarina428341112016-09-22 13:38:20333 request.priority(),
Matt Menke1751ba72019-02-09 02:23:46334 timeout_duration,
335 CommonConnectJobParams(
336 group_name,
337 request.socket_tag(),
338 request.respect_limits() ==
339 ClientSocketPool::RespectLimits::ENABLED,
340 nullptr /* client_socket_factory */,
341 nullptr /* host_resolver */,
342 nullptr /* proxy_delegate */,
343 SSLClientSocketContext(),
Daniel McArdleda3fa942019-02-15 16:41:21344 SSLClientSocketContext(),
Matt Menke1751ba72019-02-09 02:23:46345 nullptr /* socket_performance_watcher_factory */,
346 nullptr /* network_quality_estimator */,
347 net_log,
348 nullptr /* websocket_endpoint_lock_manager */),
tfarina428341112016-09-22 13:38:20349 delegate,
davidbenb7048f092016-11-30 21:20:26350 NetLogWithSource::Make(net_log,
351 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58352 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05353 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18354 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03355 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39356 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15357 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05358
[email protected]974ebd62009-08-03 23:14:34359 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13360 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34361 }
362
[email protected]03b7c8c2013-07-20 04:38:55363 void set_load_state(LoadState load_state) { load_state_ = load_state; }
364
Matt Menke141b87f22019-01-30 02:43:03365 void set_has_established_connection() {
366 DCHECK(!has_established_connection_);
367 has_established_connection_ = true;
368 }
369
[email protected]03b7c8c2013-07-20 04:38:55370 // From ConnectJob:
371
dchengb03027d2014-10-21 12:00:20372 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21373
Matt Menke141b87f22019-01-30 02:43:03374 bool HasEstablishedConnection() const override {
375 return has_established_connection_;
376 }
377
dchengb03027d2014-10-21 12:00:20378 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18379 if (store_additional_error_state_) {
380 // Set all of the additional error state fields in some way.
381 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43382 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45383 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43384 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18385 }
386 }
387
[email protected]974ebd62009-08-03 23:14:34388 private:
[email protected]03b7c8c2013-07-20 04:38:55389 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05390
dchengb03027d2014-10-21 12:00:20391 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05392 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21393 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19394 NetLogSource());
danakj655b66c2016-04-16 00:51:38395 SetSocket(std::unique_ptr<StreamSocket>(
396 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05397 switch (job_type_) {
398 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13399 return DoConnect(true /* successful */, false /* sync */,
400 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05401 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13402 return DoConnect(false /* error */, false /* sync */,
403 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05404 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57405 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47406
407 // Depending on execution timings, posting a delayed task can result
408 // in the task getting executed the at the earliest possible
409 // opportunity or only after returning once from the message loop and
410 // then a second call into the message loop. In order to make behavior
411 // more deterministic, we change the default delay to 2ms. This should
412 // always require us to wait for the second call into the message loop.
413 //
414 // N.B. The correct fix for this and similar timing problems is to
415 // abstract time for the purpose of unittests. Unfortunately, we have
416 // a lot of third-party components that directly call the various
417 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45418 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05419 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49420 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
421 weak_factory_.GetWeakPtr(), true /* successful */,
422 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53423 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05424 return ERR_IO_PENDING;
425 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57426 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45427 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05428 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49429 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
430 weak_factory_.GetWeakPtr(), false /* error */,
431 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53432 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05433 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57434 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55435 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57436 client_socket_factory_->WaitForSignal(this);
437 waiting_success_ = true;
438 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13439 case kMockRecoverableJob:
440 return DoConnect(false /* error */, false /* sync */,
441 true /* recoverable */);
442 case kMockPendingRecoverableJob:
443 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45444 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13445 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49446 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
447 weak_factory_.GetWeakPtr(), false /* error */,
448 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53449 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13450 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18451 case kMockAdditionalErrorStateJob:
452 store_additional_error_state_ = true;
453 return DoConnect(false /* error */, false /* sync */,
454 false /* recoverable */);
455 case kMockPendingAdditionalErrorStateJob:
456 set_load_state(LOAD_STATE_CONNECTING);
457 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45458 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18459 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49460 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
461 weak_factory_.GetWeakPtr(), false /* error */,
462 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53463 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18464 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28465 case kMockUnreadDataJob: {
466 int ret = DoConnect(true /* successful */, false /* sync */,
467 false /* recoverable */);
468 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
469 return ret;
470 }
[email protected]ab838892009-06-30 18:49:05471 default:
472 NOTREACHED();
danakj655b66c2016-04-16 00:51:38473 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05474 return ERR_FAILED;
475 }
476 }
477
Lily Chen02ef29a2018-11-30 16:31:43478 void ChangePriorityInternal(RequestPriority priority) override {}
479
[email protected]e772db3f2010-07-12 18:11:13480 int DoConnect(bool succeed, bool was_async, bool recoverable) {
481 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03482 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05483 if (succeed) {
Bence Békybdbb0e72018-08-07 21:42:59484 socket()->Connect(CompletionOnceCallback());
[email protected]e772db3f2010-07-12 18:11:13485 } else if (recoverable) {
486 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40487 } else {
[email protected]e772db3f2010-07-12 18:11:13488 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38489 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05490 }
[email protected]2ab05b52009-07-01 23:57:58491
492 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30493 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05494 return result;
495 }
496
[email protected]5fc08e32009-07-15 17:09:57497 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05498 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57499 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21500 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03501 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18502 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05503
[email protected]d5492c52013-11-10 20:44:39504 base::WeakPtrFactory<TestConnectJob> weak_factory_;
505
[email protected]ab838892009-06-30 18:49:05506 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
507};
508
[email protected]d80a4322009-08-14 07:07:49509class TestConnectJobFactory
510 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05511 public:
[email protected]034df0f32013-01-07 23:17:48512 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
513 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05514 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48515 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48516 client_socket_factory_(client_socket_factory),
517 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33518 }
[email protected]ab838892009-06-30 18:49:05519
Chris Watkins7a41d3552017-12-01 02:13:27520 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05521
522 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
523
[email protected]51fdc7c2012-04-10 19:19:48524 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
525 job_types_ = job_types;
526 CHECK(!job_types_->empty());
527 }
528
[email protected]974ebd62009-08-03 23:14:34529 void set_timeout_duration(base::TimeDelta timeout_duration) {
530 timeout_duration_ = timeout_duration;
531 }
532
[email protected]3f55aa12011-12-07 02:03:33533 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55534
danakj655b66c2016-04-16 00:51:38535 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05536 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49537 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13538 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48539 EXPECT_TRUE(!job_types_ || !job_types_->empty());
540 TestConnectJob::JobType job_type = job_type_;
541 if (job_types_ && !job_types_->empty()) {
542 job_type = job_types_->front();
543 job_types_->pop_front();
544 }
danakj655b66c2016-04-16 00:51:38545 return std::unique_ptr<ConnectJob>(
546 new TestConnectJob(job_type, group_name, request, timeout_duration_,
547 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05548 }
549
550 private:
551 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48552 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34553 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57554 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48555 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05556
557 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
558};
559
560class TestClientSocketPool : public ClientSocketPool {
561 public:
[email protected]12322e7e2013-08-15 17:49:26562 typedef TestSocketParams SocketParams;
563
[email protected]ab838892009-06-30 18:49:05564 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53565 int max_sockets,
[email protected]ab838892009-06-30 18:49:05566 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16567 base::TimeDelta unused_idle_socket_timeout,
568 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49569 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41570 : base_(NULL,
571 max_sockets,
572 max_sockets_per_group,
573 unused_idle_socket_timeout,
574 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38575 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05576
Chris Watkins7a41d3552017-12-01 02:13:27577 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13578
dchengb03027d2014-10-21 12:00:20579 int RequestSocket(const std::string& group_name,
580 const void* params,
ttuttle859dc7a2015-04-23 19:42:29581 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54582 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15583 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20584 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03585 CompletionOnceCallback callback,
tfarina428341112016-09-22 13:38:20586 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21587 const scoped_refptr<TestSocketParams>* casted_socket_params =
588 static_cast<const scoped_refptr<TestSocketParams>*>(params);
589 return base_.RequestSocket(group_name, *casted_socket_params, priority,
Bence Béky5a8662b2018-07-03 13:04:03590 socket_tag, respect_limits, handle,
591 std::move(callback), net_log);
[email protected]ab838892009-06-30 18:49:05592 }
593
dchengb03027d2014-10-21 12:00:20594 void RequestSockets(const std::string& group_name,
595 const void* params,
596 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57597 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03598 const scoped_refptr<TestSocketParams>* casted_params =
599 static_cast<const scoped_refptr<TestSocketParams>*>(params);
600
Charlie Harrison55ce6082018-05-14 02:25:57601 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03602 }
603
rdsmith29dbad12017-02-17 02:22:18604 void SetPriority(const std::string& group_name,
605 ClientSocketHandle* handle,
606 RequestPriority priority) override {
607 base_.SetPriority(group_name, handle, priority);
608 }
609
dchengb03027d2014-10-21 12:00:20610 void CancelRequest(const std::string& group_name,
611 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49612 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05613 }
614
dchengb03027d2014-10-21 12:00:20615 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38616 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20617 int id) override {
dchengc7eeda422015-12-26 03:56:48618 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24619 }
620
dchengb03027d2014-10-21 12:00:20621 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05622
dchengb03027d2014-10-21 12:00:20623 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48624
dchengb03027d2014-10-21 12:00:20625 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05626
xunjieli92feb332017-03-03 17:19:23627 void CloseIdleSocketsInGroup(const std::string& group_name) override {
628 base_.CloseIdleSocketsInGroup(group_name);
629 }
630
dchengb03027d2014-10-21 12:00:20631 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05632
dchengb03027d2014-10-21 12:00:20633 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49634 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05635 }
636
dchengb03027d2014-10-21 12:00:20637 LoadState GetLoadState(const std::string& group_name,
638 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49639 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05640 }
641
dchengb03027d2014-10-21 12:00:20642 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52643 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48644 }
645
dchengb03027d2014-10-21 12:00:20646 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52647 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48648 }
649
danakj655b66c2016-04-16 00:51:38650 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59651 const std::string& name,
652 const std::string& type,
mostynbba063d6032014-10-09 11:01:13653 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27654 return base_.GetInfoAsValue(name, type);
655 }
656
[email protected]d80a4322009-08-14 07:07:49657 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20658
Lily Chenecebf932018-11-02 17:15:43659 int NumNeverAssignedConnectJobsInGroup(const std::string& group_name) const {
660 return base_.NumNeverAssignedConnectJobsInGroup(group_name);
661 }
662
[email protected]8159a1c2012-06-07 00:00:10663 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
664 return base_.NumUnassignedConnectJobsInGroup(group_name);
665 }
666
[email protected]974ebd62009-08-03 23:14:34667 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49668 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34669 }
670
[email protected]2c2bef152010-10-13 00:55:03671 int NumActiveSocketsInGroup(const std::string& group_name) const {
672 return base_.NumActiveSocketsInGroup(group_name);
673 }
674
Lily Chenecebf932018-11-02 17:15:43675 bool RequestInGroupWithHandleHasJobForTesting(
676 const std::string& group_name,
677 const ClientSocketHandle* handle) const {
678 return base_.RequestInGroupWithHandleHasJobForTesting(group_name, handle);
679 }
680
[email protected]2abfe90a2010-08-25 17:49:51681 bool HasGroup(const std::string& group_name) const {
682 return base_.HasGroup(group_name);
683 }
684
[email protected]9bf28db2009-08-29 01:35:16685 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
686
[email protected]06d94042010-08-25 01:45:22687 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54688
[email protected]043b68c82013-08-22 23:41:52689 bool CloseOneIdleConnectionInHigherLayeredPool() {
690 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48691 }
692
[email protected]ab838892009-06-30 18:49:05693 private:
[email protected]d80a4322009-08-14 07:07:49694 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05695
696 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
697};
698
[email protected]a937a06d2009-08-19 21:19:24699} // namespace
700
[email protected]a937a06d2009-08-19 21:19:24701namespace {
702
[email protected]5fc08e32009-07-15 17:09:57703void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26704 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57705 (*it)->Signal();
706 }
707 waiting_jobs_.clear();
708}
709
[email protected]03b7c8c2013-07-20 04:38:55710void MockClientSocketFactory::SignalJob(size_t job) {
711 ASSERT_LT(job, waiting_jobs_.size());
712 waiting_jobs_[job]->Signal();
713 waiting_jobs_.erase(waiting_jobs_.begin() + job);
714}
715
716void MockClientSocketFactory::SetJobLoadState(size_t job,
717 LoadState load_state) {
718 ASSERT_LT(job, waiting_jobs_.size());
719 waiting_jobs_[job]->set_load_state(load_state);
720}
721
Matt Menke141b87f22019-01-30 02:43:03722void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
723 ASSERT_LT(job, waiting_jobs_.size());
724 waiting_jobs_[job]->set_has_established_connection();
725}
726
Bence Béky98447b12018-05-08 03:14:01727class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09728 protected:
Alex Clarke0def2092018-12-10 12:01:45729 ClientSocketPoolBaseTest()
730 : TestWithScopedTaskEnvironment(
731 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
732 params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54733 connect_backup_jobs_enabled_ =
734 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
735 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
736 }
[email protected]2431756e2010-09-29 20:26:13737
dcheng67be2b1f2014-10-27 21:47:29738 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54739 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
740 connect_backup_jobs_enabled_);
741 }
[email protected]c9d6a1d2009-07-14 16:15:20742
[email protected]211d21722009-07-22 15:48:53743 void CreatePool(int max_sockets, int max_sockets_per_group) {
Tarun Bansala7635092019-02-20 10:00:59744 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
745 kUnusedIdleSocketTimeout,
746 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16747 }
748
749 void CreatePoolWithIdleTimeouts(
750 int max_sockets, int max_sockets_per_group,
751 base::TimeDelta unused_idle_socket_timeout,
752 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20753 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48754 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
755 &net_log_);
[email protected]2431756e2010-09-29 20:26:13756 pool_.reset(new TestClientSocketPool(max_sockets,
757 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13758 unused_idle_socket_timeout,
759 used_idle_socket_timeout,
760 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20761 }
[email protected]f6d1d6eb2009-06-24 20:16:09762
mmenked3641e12016-01-28 16:06:15763 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33764 const std::string& group_name,
765 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15766 ClientSocketPool::RespectLimits respect_limits) {
767 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
768 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33769 }
770
771 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15772 return StartRequestWithIgnoreLimits(
773 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09774 }
775
[email protected]2431756e2010-09-29 20:26:13776 int GetOrderOfRequest(size_t index) const {
777 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09778 }
779
[email protected]2431756e2010-09-29 20:26:13780 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
781 return test_base_.ReleaseOneConnection(keep_alive);
782 }
783
784 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
785 test_base_.ReleaseAllConnections(keep_alive);
786 }
787
788 TestSocketRequest* request(int i) { return test_base_.request(i); }
789 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38790 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42791 return test_base_.requests();
792 }
rdsmith29dbad12017-02-17 02:22:18793 // Only counts the requests that get sockets asynchronously;
794 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13795 size_t completion_count() const { return test_base_.completion_count(); }
796
vishal.b62985ca92015-04-17 08:45:51797 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54798 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09799 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04800 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21801 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38802 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13803 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09804};
805
[email protected]5fc08e32009-07-15 17:09:57806TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53807 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20808
[email protected]6ecf2b92011-12-15 01:14:52809 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06810 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51811 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48812 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53813
Paul Jensen8d6f87ec2018-01-13 00:46:54814 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15815 ClientSocketPool::RespectLimits::ENABLED,
816 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09817 EXPECT_TRUE(handle.is_initialized());
818 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48819 TestLoadTimingInfoConnectedNotReused(handle);
820
[email protected]f6d1d6eb2009-06-24 20:16:09821 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48822 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30823
mmenke43758e62015-05-04 21:09:46824 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40825 log.GetEntries(&entries);
826
827 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00828 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53829 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00830 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
831 NetLogEventPhase::NONE));
832 EXPECT_TRUE(LogContainsEvent(entries, 2,
833 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
834 NetLogEventPhase::NONE));
835 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09836}
837
[email protected]ab838892009-06-30 18:49:05838TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53839 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20840
[email protected]ab838892009-06-30 18:49:05841 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51842 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53843
[email protected]2431756e2010-09-29 20:26:13844 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52845 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18846 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13847 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43848 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45849 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13850 handle.set_ssl_error_response_info(info);
851 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:54852 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15853 ClientSocketPool::RespectLimits::ENABLED,
854 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13855 EXPECT_FALSE(handle.socket());
856 EXPECT_FALSE(handle.is_ssl_error());
857 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48858 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30859
mmenke43758e62015-05-04 21:09:46860 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40861 log.GetEntries(&entries);
862
863 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00864 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17865 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00866 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
867 NetLogEventPhase::NONE));
868 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09869}
870
[email protected]211d21722009-07-22 15:48:53871TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
872 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
873
[email protected]9e743cd2010-03-16 07:03:53874 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30875
robpercival214763f2016-07-01 23:27:01876 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
877 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
878 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
879 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53880
[email protected]2431756e2010-09-29 20:26:13881 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53882 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13883 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53884
robpercival214763f2016-07-01 23:27:01885 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
886 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
887 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53888
[email protected]2431756e2010-09-29 20:26:13889 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53890
[email protected]2431756e2010-09-29 20:26:13891 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53892 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13893 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53894
895 EXPECT_EQ(1, GetOrderOfRequest(1));
896 EXPECT_EQ(2, GetOrderOfRequest(2));
897 EXPECT_EQ(3, GetOrderOfRequest(3));
898 EXPECT_EQ(4, GetOrderOfRequest(4));
899 EXPECT_EQ(5, GetOrderOfRequest(5));
900 EXPECT_EQ(6, GetOrderOfRequest(6));
901 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17902
903 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13904 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53905}
906
907TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
908 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
909
[email protected]9e743cd2010-03-16 07:03:53910 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30911
[email protected]211d21722009-07-22 15:48:53912 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01913 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
914 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
915 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
916 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53917
[email protected]2431756e2010-09-29 20:26:13918 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53919 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13920 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53921
922 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01923 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53924
[email protected]2431756e2010-09-29 20:26:13925 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53926
[email protected]2431756e2010-09-29 20:26:13927 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53928 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13929 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53930
931 EXPECT_EQ(1, GetOrderOfRequest(1));
932 EXPECT_EQ(2, GetOrderOfRequest(2));
933 EXPECT_EQ(3, GetOrderOfRequest(3));
934 EXPECT_EQ(4, GetOrderOfRequest(4));
935 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17936
937 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13938 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53939}
940
941TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
942 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
943
robpercival214763f2016-07-01 23:27:01944 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
945 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
946 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
947 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53948
[email protected]2431756e2010-09-29 20:26:13949 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53950 client_socket_factory_.allocation_count());
951
robpercival214763f2016-07-01 23:27:01952 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
953 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
954 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53955
[email protected]2431756e2010-09-29 20:26:13956 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53957
[email protected]2431756e2010-09-29 20:26:13958 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53959
960 // First 4 requests don't have to wait, and finish in order.
961 EXPECT_EQ(1, GetOrderOfRequest(1));
962 EXPECT_EQ(2, GetOrderOfRequest(2));
963 EXPECT_EQ(3, GetOrderOfRequest(3));
964 EXPECT_EQ(4, GetOrderOfRequest(4));
965
[email protected]ac790b42009-12-02 04:31:31966 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
967 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53968 EXPECT_EQ(7, GetOrderOfRequest(5));
969 EXPECT_EQ(6, GetOrderOfRequest(6));
970 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17971
972 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13973 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53974}
975
rdsmith29dbad12017-02-17 02:22:18976// Test reprioritizing a request before completion doesn't interfere with
977// its completion.
978TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
979 CreatePool(kDefaultMaxSockets, 1);
980
981 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
982 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
983 EXPECT_TRUE(request(0)->handle()->socket());
984 EXPECT_FALSE(request(1)->handle()->socket());
985
Lily Chenecebf932018-11-02 17:15:43986 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18987
988 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
989
990 EXPECT_TRUE(request(1)->handle()->socket());
991}
992
993// Reprioritize a request up past another one and make sure that changes the
994// completion order.
995TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
996 CreatePool(kDefaultMaxSockets, 1);
997
998 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
999 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1000 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1001 EXPECT_TRUE(request(0)->handle()->socket());
1002 EXPECT_FALSE(request(1)->handle()->socket());
1003 EXPECT_FALSE(request(2)->handle()->socket());
1004
1005 request(2)->handle()->SetPriority(HIGHEST);
1006
1007 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1008
1009 EXPECT_EQ(1, GetOrderOfRequest(1));
1010 EXPECT_EQ(3, GetOrderOfRequest(2));
1011 EXPECT_EQ(2, GetOrderOfRequest(3));
1012}
1013
1014// Reprioritize a request without changing relative priorities and check
1015// that the order doesn't change.
1016TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1017 CreatePool(kDefaultMaxSockets, 1);
1018
1019 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1020 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1021 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1022 EXPECT_TRUE(request(0)->handle()->socket());
1023 EXPECT_FALSE(request(1)->handle()->socket());
1024 EXPECT_FALSE(request(2)->handle()->socket());
1025
1026 request(2)->handle()->SetPriority(MEDIUM);
1027
1028 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1029
1030 EXPECT_EQ(1, GetOrderOfRequest(1));
1031 EXPECT_EQ(2, GetOrderOfRequest(2));
1032 EXPECT_EQ(3, GetOrderOfRequest(3));
1033}
1034
1035// Reprioritize a request past down another one and make sure that changes the
1036// completion order.
1037TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1038 CreatePool(kDefaultMaxSockets, 1);
1039
1040 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1041 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1042 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1043 EXPECT_TRUE(request(0)->handle()->socket());
1044 EXPECT_FALSE(request(1)->handle()->socket());
1045 EXPECT_FALSE(request(2)->handle()->socket());
1046
1047 request(1)->handle()->SetPriority(LOW);
1048
1049 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1050
1051 EXPECT_EQ(1, GetOrderOfRequest(1));
1052 EXPECT_EQ(3, GetOrderOfRequest(2));
1053 EXPECT_EQ(2, GetOrderOfRequest(3));
1054}
1055
1056// Reprioritize a request to the same level as another and confirm it is
1057// put after the old request.
1058TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1059 CreatePool(kDefaultMaxSockets, 1);
1060
1061 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1062 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1063 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1064 EXPECT_TRUE(request(0)->handle()->socket());
1065 EXPECT_FALSE(request(1)->handle()->socket());
1066 EXPECT_FALSE(request(2)->handle()->socket());
1067
1068 request(1)->handle()->SetPriority(MEDIUM);
1069
1070 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1071
1072 EXPECT_EQ(1, GetOrderOfRequest(1));
1073 EXPECT_EQ(3, GetOrderOfRequest(2));
1074 EXPECT_EQ(2, GetOrderOfRequest(3));
1075}
1076
[email protected]211d21722009-07-22 15:48:531077TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1078 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1079
robpercival214763f2016-07-01 23:27:011080 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1081 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1082 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1083 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[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
robpercival214763f2016-07-01 23:27:011088 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1089 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1090 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531091
[email protected]2431756e2010-09-29 20:26:131092 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531093
[email protected]2431756e2010-09-29 20:26:131094 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531095 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131096 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531097
1098 // First 4 requests don't have to wait, and finish in order.
1099 EXPECT_EQ(1, GetOrderOfRequest(1));
1100 EXPECT_EQ(2, GetOrderOfRequest(2));
1101 EXPECT_EQ(3, GetOrderOfRequest(3));
1102 EXPECT_EQ(4, GetOrderOfRequest(4));
1103
1104 // Request ("b", 7) has the highest priority, but we can't make new socket for
1105 // group "b", because it has reached the per-group limit. Then we make
1106 // socket for ("c", 6), because it has higher priority than ("a", 4),
1107 // and we still can't make a socket for group "b".
1108 EXPECT_EQ(5, GetOrderOfRequest(5));
1109 EXPECT_EQ(6, GetOrderOfRequest(6));
1110 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171111
1112 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131113 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531114}
1115
1116// Make sure that we count connecting sockets against the total limit.
1117TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1118 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1119
robpercival214763f2016-07-01 23:27:011120 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1121 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1122 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531123
1124 // Create one asynchronous request.
1125 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011126 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531127
[email protected]6b175382009-10-13 06:47:471128 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1129 // actually become pending until 2ms after they have been created. In order
1130 // to flush all tasks, we need to wait so that we know there are no
1131 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451132 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471133
[email protected]211d21722009-07-22 15:48:531134 // The next synchronous request should wait for its turn.
1135 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011136 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531137
[email protected]2431756e2010-09-29 20:26:131138 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531139
[email protected]2431756e2010-09-29 20:26:131140 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531141 client_socket_factory_.allocation_count());
1142
1143 EXPECT_EQ(1, GetOrderOfRequest(1));
1144 EXPECT_EQ(2, GetOrderOfRequest(2));
1145 EXPECT_EQ(3, GetOrderOfRequest(3));
1146 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171147 EXPECT_EQ(5, GetOrderOfRequest(5));
1148
1149 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131150 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531151}
1152
[email protected]6427fe22010-04-16 22:27:411153TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1154 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1155 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1156
robpercival214763f2016-07-01 23:27:011157 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1158 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1159 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1160 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411161
1162 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1163
1164 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1165
robpercival214763f2016-07-01 23:27:011166 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1167 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411168
1169 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1170
[email protected]2431756e2010-09-29 20:26:131171 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411172 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131173 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411174 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131175 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1176 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411177 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1178}
1179
[email protected]d7027bb2010-05-10 18:58:541180TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1181 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1182 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1183
1184 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521185 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131186 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541187 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151188 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201189 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541190
1191 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241192 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521193 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201194 EXPECT_EQ(
1195 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541196 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201197 ClientSocketPool::RespectLimits::ENABLED,
1198 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541199 }
1200
1201 // One will be stalled, cancel all the handles now.
1202 // This should hit the OnAvailableSocketSlot() code where we previously had
1203 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241204 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541205 handles[i].Reset();
1206}
1207
[email protected]eb5a99382010-07-11 03:18:261208TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541209 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1210 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1211
[email protected]eb5a99382010-07-11 03:18:261212 {
1213 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521214 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261215 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Raul Tambre8c1981d2019-02-08 02:22:261216 EXPECT_EQ(OK, handles[i].Init(base::NumberToString(i), params_,
Paul Jensen8d6f87ec2018-01-13 00:46:541217 DEFAULT_PRIORITY, SocketTag(),
1218 ClientSocketPool::RespectLimits::ENABLED,
1219 callbacks[i].callback(), pool_.get(),
1220 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261221 }
1222
1223 // Force a stalled group.
1224 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521225 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201226 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541227 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201228 ClientSocketPool::RespectLimits::ENABLED,
1229 callback.callback(), pool_.get(),
1230 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261231
1232 // Cancel the stalled request.
1233 stalled_handle.Reset();
1234
1235 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1236 EXPECT_EQ(0, pool_->IdleSocketCount());
1237
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]43a21b82010-06-10 21:30:541241 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1242 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261243}
[email protected]43a21b82010-06-10 21:30:541244
[email protected]eb5a99382010-07-11 03:18:261245TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1246 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1247 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1248
1249 {
1250 ClientSocketHandle handles[kDefaultMaxSockets];
1251 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521252 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201253 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541254 handles[i].Init(
Raul Tambre8c1981d2019-02-08 02:22:261255 base::NumberToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541256 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1257 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261258 }
1259
1260 // Force a stalled group.
1261 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1262 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521263 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201264 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541265 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201266 ClientSocketPool::RespectLimits::ENABLED,
1267 callback.callback(), pool_.get(),
1268 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261269
1270 // Since it is stalled, it should have no connect jobs.
1271 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431272 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101273 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261274
1275 // Cancel the stalled request.
1276 handles[0].Reset();
1277
[email protected]eb5a99382010-07-11 03:18:261278 // Now we should have a connect job.
1279 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431280 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101281 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261282
1283 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011284 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261285
1286 EXPECT_EQ(kDefaultMaxSockets + 1,
1287 client_socket_factory_.allocation_count());
1288 EXPECT_EQ(0, pool_->IdleSocketCount());
1289 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431290 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101291 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261292
1293 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541294 }
1295
[email protected]eb5a99382010-07-11 03:18:261296 EXPECT_EQ(1, pool_->IdleSocketCount());
1297}
[email protected]43a21b82010-06-10 21:30:541298
[email protected]eb5a99382010-07-11 03:18:261299TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1300 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1301 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541302
[email protected]eb5a99382010-07-11 03:18:261303 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521304 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261305 {
[email protected]51fdc7c2012-04-10 19:19:481306 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261307 ClientSocketHandle handles[kDefaultMaxSockets];
1308 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521309 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201310 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541311 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201312 ClientSocketPool::RespectLimits::ENABLED,
1313 callback.callback(), pool_.get(),
1314 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261315 }
1316
1317 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1318 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481319 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261320
1321 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201322 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541323 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201324 ClientSocketPool::RespectLimits::ENABLED,
1325 callback.callback(), pool_.get(),
1326 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481327 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261328
1329 // Dropping out of scope will close all handles and return them to idle.
1330 }
[email protected]43a21b82010-06-10 21:30:541331
1332 // But if we wait for it, the released idle sockets will be closed in
1333 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011334 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261335
1336 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1337 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541338}
1339
1340// Regression test for http://crbug.com/40952.
1341TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1342 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221343 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541344 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1345
1346 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1347 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521348 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201349 EXPECT_EQ(
Raul Tambre8c1981d2019-02-08 02:22:261350 OK, handle.Init(base::NumberToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541351 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201352 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541353 }
1354
1355 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281356 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541357
1358 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1359 // reuse a socket.
1360 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1361 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521362 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541363
1364 // "0" is special here, since it should be the first entry in the sorted map,
1365 // which is the one which we would close an idle socket for. We shouldn't
1366 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201367 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:541368 handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201369 ClientSocketPool::RespectLimits::ENABLED,
1370 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541371
1372 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1373 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1374}
1375
[email protected]ab838892009-06-30 18:49:051376TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531377 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091378
robpercival214763f2016-07-01 23:27:011379 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1380 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1381 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1382 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1383 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1384 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1385 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1386 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091387
[email protected]2431756e2010-09-29 20:26:131388 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201389 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1390 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131391 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1392 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091393
[email protected]c9d6a1d2009-07-14 16:15:201394 EXPECT_EQ(1, GetOrderOfRequest(1));
1395 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031396 EXPECT_EQ(8, GetOrderOfRequest(3));
1397 EXPECT_EQ(6, GetOrderOfRequest(4));
1398 EXPECT_EQ(4, GetOrderOfRequest(5));
1399 EXPECT_EQ(3, GetOrderOfRequest(6));
1400 EXPECT_EQ(5, GetOrderOfRequest(7));
1401 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171402
1403 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131404 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091405}
1406
[email protected]ab838892009-06-30 18:49:051407TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531408 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091409
robpercival214763f2016-07-01 23:27:011410 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1411 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1412 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1413 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1414 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1415 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1416 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091417
[email protected]2431756e2010-09-29 20:26:131418 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091419
[email protected]2431756e2010-09-29 20:26:131420 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011421 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201422
[email protected]2431756e2010-09-29 20:26:131423 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201424 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131425 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1426 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091427}
1428
1429// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051430// The pending connect job will be cancelled and should not call back into
1431// ClientSocketPoolBase.
1432TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531433 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201434
[email protected]ab838892009-06-30 18:49:051435 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131436 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521437 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151438 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541439 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151440 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201441 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131442 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091443}
1444
[email protected]ab838892009-06-30 18:49:051445TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531446 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201447
[email protected]ab838892009-06-30 18:49:051448 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061449 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521450 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091451
mmenked3641e12016-01-28 16:06:151452 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541453 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151454 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201455 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091456
1457 handle.Reset();
1458
[email protected]6ecf2b92011-12-15 01:14:521459 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131460 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541461 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151462 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201463 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091464
robpercival214763f2016-07-01 23:27:011465 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091466 EXPECT_FALSE(callback.have_result());
1467
1468 handle.Reset();
1469}
1470
[email protected]ab838892009-06-30 18:49:051471TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531472 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091473
robpercival214763f2016-07-01 23:27:011474 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1475 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1476 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1477 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1478 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1479 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1480 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091481
1482 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201483 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131484 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1485 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091486
[email protected]2431756e2010-09-29 20:26:131487 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091488
[email protected]c9d6a1d2009-07-14 16:15:201489 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1490 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131491 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1492 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091493
[email protected]c9d6a1d2009-07-14 16:15:201494 EXPECT_EQ(1, GetOrderOfRequest(1));
1495 EXPECT_EQ(2, GetOrderOfRequest(2));
1496 EXPECT_EQ(5, GetOrderOfRequest(3));
1497 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131498 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1499 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201500 EXPECT_EQ(4, GetOrderOfRequest(6));
1501 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171502
1503 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131504 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091505}
1506
mmenke33d24423d2015-05-19 19:41:091507// Function to be used as a callback on socket request completion. It first
1508// disconnects the successfully connected socket from the first request, and
1509// then reuses the ClientSocketHandle to request another socket.
1510//
1511// |nested_callback| is called with the result of the second socket request.
1512void RequestSocketOnComplete(ClientSocketHandle* handle,
1513 TestClientSocketPool* pool,
1514 TestConnectJobFactory* test_connect_job_factory,
1515 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411516 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091517 int first_request_result) {
robpercival214763f2016-07-01 23:27:011518 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091519
1520 test_connect_job_factory->set_job_type(next_job_type);
1521
1522 // Don't allow reuse of the socket. Disconnect it and then release it.
1523 if (handle->socket())
1524 handle->socket()->Disconnect();
1525 handle->Reset();
1526
mmenked3641e12016-01-28 16:06:151527 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091528 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541529 int rv = handle->Init("a", params, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151530 ClientSocketPool::RespectLimits::ENABLED,
Bence Békya4a50932018-08-10 13:39:411531 nested_callback->callback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091532 if (rv != ERR_IO_PENDING) {
1533 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411534 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091535 } else {
1536 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521537 }
mmenke33d24423d2015-05-19 19:41:091538}
[email protected]f6d1d6eb2009-06-24 20:16:091539
mmenke33d24423d2015-05-19 19:41:091540// Tests the case where a second socket is requested in a completion callback,
1541// and the second socket connects asynchronously. Reuses the same
1542// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581543TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531544 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201545
[email protected]0b7648c2009-07-06 20:14:011546 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061547 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091548 TestCompletionCallback second_result_callback;
1549 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541550 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1551 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091552 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1553 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411554 &second_result_callback),
tfarina428341112016-09-22 13:38:201555 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011556 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091557
robpercival214763f2016-07-01 23:27:011558 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581559}
[email protected]f6d1d6eb2009-06-24 20:16:091560
mmenke33d24423d2015-05-19 19:41:091561// Tests the case where a second socket is requested in a completion callback,
1562// and the second socket connects synchronously. Reuses the same
1563// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581564TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531565 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201566
[email protected]0b7648c2009-07-06 20:14:011567 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061568 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091569 TestCompletionCallback second_result_callback;
1570 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541571 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1572 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091573 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1574 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411575 &second_result_callback),
tfarina428341112016-09-22 13:38:201576 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011577 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581578
robpercival214763f2016-07-01 23:27:011579 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091580}
1581
1582// Make sure that pending requests get serviced after active requests get
1583// cancelled.
[email protected]ab838892009-06-30 18:49:051584TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201586
[email protected]0b7648c2009-07-06 20:14:011587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091588
robpercival214763f2016-07-01 23:27:011589 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1590 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1591 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1592 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1593 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1594 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1595 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091596
[email protected]c9d6a1d2009-07-14 16:15:201597 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1598 // Let's cancel them.
1599 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131600 ASSERT_FALSE(request(i)->handle()->is_initialized());
1601 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091602 }
1603
[email protected]f6d1d6eb2009-06-24 20:16:091604 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131605 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011606 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131607 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091608 }
1609
[email protected]2431756e2010-09-29 20:26:131610 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1611 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091612}
1613
1614// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051615TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531616 const size_t kMaxSockets = 5;
1617 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201618
[email protected]0b7648c2009-07-06 20:14:011619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091620
[email protected]211d21722009-07-22 15:48:531621 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1622 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091623
1624 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531625 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011626 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091627
[email protected]211d21722009-07-22 15:48:531628 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011629 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091630}
1631
mmenke9d72fe42017-05-18 22:36:071632// Make sure that pending requests that complete synchronously get serviced
1633// after active requests fail. See https://crbug.com/723748
1634TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1635 const size_t kNumberOfRequests = 10;
1636 const size_t kMaxSockets = 1;
1637 CreatePool(kMaxSockets, kMaxSockets);
1638
1639 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1640
1641 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1642
1643 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1644
1645 // Queue up all the other requests
1646 for (size_t i = 1; i < kNumberOfRequests; ++i)
1647 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1648
1649 // Make sure all requests fail, instead of hanging.
1650 for (size_t i = 0; i < kNumberOfRequests; ++i)
1651 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1652}
1653
[email protected]5fc08e32009-07-15 17:09:571654TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531655 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571656
1657 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1658
[email protected]2431756e2010-09-29 20:26:131659 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521660 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541661 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151662 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201663 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011664 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571665
1666 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131667 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571668
Paul Jensen8d6f87ec2018-01-13 00:46:541669 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151670 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201671 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011672 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1673 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571674
[email protected]2431756e2010-09-29 20:26:131675 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481676 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571677 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1678}
1679
xunjieli26619e72016-11-23 19:39:551680TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551681 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1682 ClientSocketHandle handle;
1683 TestCompletionCallback callback;
1684 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541685 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551686 ClientSocketPool::RespectLimits::ENABLED,
1687 callback.callback(), pool_.get(), log.bound());
1688 EXPECT_THAT(rv, IsOk());
1689 handle.Reset();
1690 EXPECT_EQ(1, pool_->IdleSocketCount());
1691 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551692}
1693
xunjieli92feb332017-03-03 17:19:231694TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231695 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1696 TestCompletionCallback callback;
1697 BoundTestNetLog log;
1698 ClientSocketHandle handle1;
Paul Jensen8d6f87ec2018-01-13 00:46:541699 int rv = handle1.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231700 ClientSocketPool::RespectLimits::ENABLED,
1701 callback.callback(), pool_.get(), log.bound());
1702 EXPECT_THAT(rv, IsOk());
1703 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541704 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231705 ClientSocketPool::RespectLimits::ENABLED,
1706 callback.callback(), pool_.get(), log.bound());
1707 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541708 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231709 ClientSocketPool::RespectLimits::ENABLED,
1710 callback.callback(), pool_.get(), log.bound());
1711 EXPECT_THAT(rv, IsOk());
1712 handle1.Reset();
1713 handle2.Reset();
1714 handle3.Reset();
1715 EXPECT_EQ(3, pool_->IdleSocketCount());
1716 pool_->CloseIdleSocketsInGroup("a");
1717 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231718}
1719
xunjieli26619e72016-11-23 19:39:551720TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551721 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1722 ClientSocketHandle handle;
1723 TestCompletionCallback callback;
1724 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541725 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551726 ClientSocketPool::RespectLimits::ENABLED,
1727 callback.callback(), pool_.get(), log.bound());
1728 EXPECT_THAT(rv, IsOk());
1729 StreamSocket* socket = handle.socket();
1730 handle.Reset();
1731 EXPECT_EQ(1, pool_->IdleSocketCount());
1732
1733 // Disconnect socket now to make the socket unusable.
1734 socket->Disconnect();
1735 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541736 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551737 ClientSocketPool::RespectLimits::ENABLED,
1738 callback.callback(), pool_.get(), log.bound());
1739 EXPECT_THAT(rv, IsOk());
1740 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551741}
1742
[email protected]2b7523d2009-07-29 20:29:231743// Regression test for http://crbug.com/17985.
1744TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1745 const int kMaxSockets = 3;
1746 const int kMaxSocketsPerGroup = 2;
1747 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1748
[email protected]ac790b42009-12-02 04:31:311749 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231750
robpercival214763f2016-07-01 23:27:011751 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1752 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231753
1754 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011755 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231756
1757 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011758 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231759
1760 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011761 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1762 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231763
[email protected]eb5a99382010-07-11 03:18:261764 // Release the first two sockets from "a". Because this is a keepalive,
1765 // the first release will unblock the pending request for "a". The
1766 // second release will unblock a request for "c", becaue it is the next
1767 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131768 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1769 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231770
1771 // Closing idle sockets should not get us into trouble, but in the bug
1772 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411773 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541774 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261775
[email protected]2da659e2013-05-23 20:51:341776 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281777 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231778}
1779
[email protected]4d3b05d2010-01-27 21:27:291780TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531781 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571782
1783 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131784 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521785 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511786 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541787 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151788 ClientSocketPool::RespectLimits::ENABLED,
1789 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011790 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131791 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481792 TestLoadTimingInfoNotConnected(handle);
1793
robpercival214763f2016-07-01 23:27:011794 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131795 EXPECT_TRUE(handle.is_initialized());
1796 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481797 TestLoadTimingInfoConnectedNotReused(handle);
1798
[email protected]2431756e2010-09-29 20:26:131799 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481800 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301801
mmenke43758e62015-05-04 21:09:461802 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401803 log.GetEntries(&entries);
1804
1805 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001806 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171807 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001808 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1809 NetLogEventPhase::NONE));
1810 EXPECT_TRUE(LogContainsEvent(entries, 2,
1811 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1812 NetLogEventPhase::NONE));
1813 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571814}
1815
[email protected]4d3b05d2010-01-27 21:27:291816TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571817 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531818 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571819
1820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131821 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521822 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511823 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181824 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131825 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431826 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451827 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131828 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151829 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541830 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151831 ClientSocketPool::RespectLimits::ENABLED,
1832 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131833 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011834 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131835 EXPECT_FALSE(handle.is_ssl_error());
1836 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301837
mmenke43758e62015-05-04 21:09:461838 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401839 log.GetEntries(&entries);
1840
1841 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001842 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171843 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001844 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1845 NetLogEventPhase::NONE));
1846 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571847}
1848
mmenke6be122f2015-03-09 22:22:471849// Check that an async ConnectJob failure does not result in creation of a new
1850// ConnectJob when there's another pending request also waiting on its own
1851// ConnectJob. See http://crbug.com/463960.
1852TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1853 CreatePool(2, 2);
1854 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1855
robpercival214763f2016-07-01 23:27:011856 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1857 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471858
robpercival214763f2016-07-01 23:27:011859 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1860 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471861
1862 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1863}
1864
[email protected]4d3b05d2010-01-27 21:27:291865TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101866 // TODO(eroman): Add back the log expectations! Removed them because the
1867 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531868 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571869
1870 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131871 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521872 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131873 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521874 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571875
[email protected]2431756e2010-09-29 20:26:131876 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541877 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151878 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201879 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511880 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201881 EXPECT_EQ(
1882 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541883 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201884 ClientSocketPool::RespectLimits::ENABLED,
1885 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571886
[email protected]2431756e2010-09-29 20:26:131887 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571888
[email protected]fd7b7c92009-08-20 19:38:301889
1890 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301891
robpercival214763f2016-07-01 23:27:011892 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131893 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301894
1895 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531896 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571897}
1898
[email protected]4d3b05d2010-01-27 21:27:291899TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341900 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1901
[email protected]17a0c6c2009-08-04 00:07:041902 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1903
robpercival214763f2016-07-01 23:27:011904 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1905 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1906 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1907 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341908
1909 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131910 (*requests())[2]->handle()->Reset();
1911 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341912 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1913
[email protected]2431756e2010-09-29 20:26:131914 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341915 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1916
[email protected]2431756e2010-09-29 20:26:131917 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261918 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341919}
1920
[email protected]5fc08e32009-07-15 17:09:571921// When requests and ConnectJobs are not coupled, the request will get serviced
1922// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291923TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531924 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571925
1926 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321927 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571928
[email protected]2431756e2010-09-29 20:26:131929 std::vector<TestSocketRequest*> request_order;
1930 size_t completion_count; // unused
1931 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541932 int rv =
1933 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1934 ClientSocketPool::RespectLimits::ENABLED,
1935 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011936 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1937 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571938
1939 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1940 // without a job.
1941 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1942
[email protected]2431756e2010-09-29 20:26:131943 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541944 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151945 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201946 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011947 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131948 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541949 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151950 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201951 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011952 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571953
1954 // Both Requests 2 and 3 are pending. We release socket 1 which should
1955 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331956 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341957 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281958 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331959 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011960 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331961 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571962
1963 // Signal job 2, which should service request 3.
1964
1965 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011966 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571967
[email protected]2431756e2010-09-29 20:26:131968 ASSERT_EQ(3U, request_order.size());
1969 EXPECT_EQ(&req1, request_order[0]);
1970 EXPECT_EQ(&req2, request_order[1]);
1971 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571972 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1973}
1974
1975// The requests are not coupled to the jobs. So, the requests should finish in
1976// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291977TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571979 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321980 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571981
[email protected]2431756e2010-09-29 20:26:131982 std::vector<TestSocketRequest*> request_order;
1983 size_t completion_count; // unused
1984 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541985 int rv =
1986 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1987 ClientSocketPool::RespectLimits::ENABLED,
1988 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011989 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571990
[email protected]2431756e2010-09-29 20:26:131991 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541992 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151993 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201994 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011995 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571996
1997 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321998 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571999
[email protected]2431756e2010-09-29 20:26:132000 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542001 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152002 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202003 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012004 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572005
robpercival214763f2016-07-01 23:27:012006 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2007 EXPECT_THAT(req2.WaitForResult(), IsOk());
2008 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572009
[email protected]2431756e2010-09-29 20:26:132010 ASSERT_EQ(3U, request_order.size());
2011 EXPECT_EQ(&req1, request_order[0]);
2012 EXPECT_EQ(&req2, request_order[1]);
2013 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572014}
2015
[email protected]03b7c8c2013-07-20 04:38:552016// Test GetLoadState in the case there's only one socket request.
2017TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532018 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552019 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572020
[email protected]2431756e2010-09-29 20:26:132021 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522022 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542023 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152024 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202025 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012026 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552027 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572028
[email protected]03b7c8c2013-07-20 04:38:552029 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2030 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2031
2032 // No point in completing the connection, since ClientSocketHandles only
2033 // expect the LoadState to be checked while connecting.
2034}
2035
2036// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002037// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552038TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2039 CreatePool(2, 2);
2040 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2041
2042 ClientSocketHandle handle;
2043 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542044 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152045 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202046 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012047 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002048 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2049
2050 ClientSocketHandle handle2;
2051 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542052 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152053 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202054 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012055 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002056 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2057
2058 // Check that both handles report the state of the first job.
2059 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2060 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2061
2062 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2063
2064 // Check that both handles change to LOAD_STATE_CONNECTING.
2065 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2066 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2067}
2068
2069// Test that the second connection request does not affect the pool's load
2070// status.
2071TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2072 CreatePool(2, 2);
2073 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2074
2075 ClientSocketHandle handle;
2076 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542077 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152078 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202079 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012080 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572081
[email protected]2431756e2010-09-29 20:26:132082 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522083 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542084 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152085 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202086 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012087 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002088 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552089
[email protected]03b7c8c2013-07-20 04:38:552090 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2091 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2092
haavardm835c1d62015-04-22 08:18:002093 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552094 // second handle switches to the state of the remaining ConnectJob.
2095 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012096 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002097 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552098}
2099
2100// Test GetLoadState in the case the per-group limit is reached.
2101TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2102 CreatePool(2, 1);
2103 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2104
2105 ClientSocketHandle handle;
2106 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542107 int rv = handle.Init("a", params_, MEDIUM, SocketTag(),
mmenked3641e12016-01-28 16:06:152108 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202109 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012110 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552111 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2112
2113 // Request another socket from the same pool, buth with a higher priority.
2114 // The first request should now be stalled at the socket group limit.
2115 ClientSocketHandle handle2;
2116 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542117 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152118 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202119 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012120 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552121 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2122 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2123
2124 // The first handle should remain stalled as the other socket goes through
2125 // the connect process.
2126
2127 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2128 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2129 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2130
2131 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012132 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552133 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2134
2135 // Closing the second socket should cause the stalled handle to finally get a
2136 // ConnectJob.
2137 handle2.socket()->Disconnect();
2138 handle2.Reset();
2139 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2140}
2141
2142// Test GetLoadState in the case the per-pool limit is reached.
2143TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2144 CreatePool(2, 2);
2145 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2146
2147 ClientSocketHandle handle;
2148 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542149 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152150 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202151 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012152 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552153
2154 // Request for socket from another pool.
2155 ClientSocketHandle handle2;
2156 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542157 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152158 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202159 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012160 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552161
2162 // Request another socket from the first pool. Request should stall at the
2163 // socket pool limit.
2164 ClientSocketHandle handle3;
2165 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542166 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152167 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202168 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012169 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552170
2171 // The third handle should remain stalled as the other sockets in its group
2172 // goes through the connect process.
2173
2174 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2175 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2176
2177 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2178 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2179 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2180
2181 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012182 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552183 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2184
2185 // Closing a socket should allow the stalled handle to finally get a new
2186 // ConnectJob.
2187 handle.socket()->Disconnect();
2188 handle.Reset();
2189 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572190}
2191
[email protected]e772db3f2010-07-12 18:11:132192TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2193 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2194 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2195
[email protected]2431756e2010-09-29 20:26:132196 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522197 TestCompletionCallback callback;
2198 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
Paul Jensen8d6f87ec2018-01-13 00:46:542199 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152200 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202201 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132202 EXPECT_TRUE(handle.is_initialized());
2203 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132204}
2205
2206TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2207 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2208
2209 connect_job_factory_->set_job_type(
2210 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132211 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522212 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132213 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542214 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152215 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202216 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132217 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012218 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132219 EXPECT_TRUE(handle.is_initialized());
2220 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132221}
2222
[email protected]e60e47a2010-07-14 03:37:182223TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2224 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2225 connect_job_factory_->set_job_type(
2226 TestConnectJob::kMockAdditionalErrorStateJob);
2227
[email protected]2431756e2010-09-29 20:26:132228 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522229 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132230 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:542231 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152232 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202233 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132234 EXPECT_FALSE(handle.is_initialized());
2235 EXPECT_FALSE(handle.socket());
2236 EXPECT_TRUE(handle.is_ssl_error());
2237 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182238}
2239
2240TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2241 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2242
2243 connect_job_factory_->set_job_type(
2244 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132245 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522246 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132247 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542248 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152249 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202250 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132251 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012252 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132253 EXPECT_FALSE(handle.is_initialized());
2254 EXPECT_FALSE(handle.socket());
2255 EXPECT_TRUE(handle.is_ssl_error());
2256 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182257}
2258
martijn003cd612016-05-19 22:24:382259// Make sure we can reuse sockets.
2260TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412261 CreatePoolWithIdleTimeouts(
2262 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032263 base::TimeDelta(), // Time out unused sockets immediately.
2264 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2265
2266 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2267
2268 ClientSocketHandle handle;
2269 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542270 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152271 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202272 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012273 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032274 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012275 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032276
2277 // Use and release the socket.
Bence Békybdbb0e72018-08-07 21:42:592278 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382279 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482280 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032281 handle.Reset();
2282
2283 // Should now have one idle socket.
2284 ASSERT_EQ(1, pool_->IdleSocketCount());
2285
2286 // Request a new socket. This should reuse the old socket and complete
2287 // synchronously.
vishal.b62985ca92015-04-17 08:45:512288 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:542289 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152290 ClientSocketPool::RespectLimits::ENABLED,
Bence Békybdbb0e72018-08-07 21:42:592291 CompletionOnceCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012292 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032293 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482294 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032295
2296 ASSERT_TRUE(pool_->HasGroup("a"));
2297 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2298 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2299
mmenke43758e62015-05-04 21:09:462300 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032301 log.GetEntries(&entries);
2302 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002303 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032304}
2305
martijn003cd612016-05-19 22:24:382306// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172307TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032308 CreatePoolWithIdleTimeouts(
2309 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2310 base::TimeDelta(), // Time out unused sockets immediately
2311 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412312
2313 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2314
2315 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2316
2317 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522318 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542319 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152320 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202321 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012322 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412323 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2324
2325 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522326 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542327 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152328 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202329 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012330 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412331 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2332
2333 // Cancel one of the requests. Wait for the other, which will get the first
2334 // job. Release the socket. Run the loop again to make sure the second
2335 // socket is sitting idle and the first one is released (since ReleaseSocket()
2336 // just posts a DoReleaseSocket() task).
2337
2338 handle.Reset();
robpercival214763f2016-07-01 23:27:012339 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412340 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592341 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382342 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412343 handle2.Reset();
2344
[email protected]e7b1c6d2c2012-05-05 00:54:032345 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2346 // actually become pending until 2ms after they have been created. In order
2347 // to flush all tasks, we need to wait so that we know there are no
2348 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452349 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412350
[email protected]e7b1c6d2c2012-05-05 00:54:032351 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412352 ASSERT_EQ(2, pool_->IdleSocketCount());
2353
2354 // Request a new socket. This should cleanup the unused and timed out ones.
2355 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512356 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522357 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542358 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152359 ClientSocketPool::RespectLimits::ENABLED,
2360 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012361 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2362 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412363 EXPECT_FALSE(handle.is_reused());
2364
[email protected]e7b1c6d2c2012-05-05 00:54:032365 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412366 ASSERT_TRUE(pool_->HasGroup("a"));
2367 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2368 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2369
mmenke43758e62015-05-04 21:09:462370 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412371 log.GetEntries(&entries);
2372 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002373 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412374}
2375
[email protected]2041cf342010-02-19 03:15:592376// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162377// because of multiple releasing disconnected sockets.
2378TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2379 CreatePoolWithIdleTimeouts(
2380 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2381 base::TimeDelta(), // Time out unused sockets immediately.
2382 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2383
2384 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2385
2386 // Startup 4 connect jobs. Two of them will be pending.
2387
[email protected]2431756e2010-09-29 20:26:132388 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522389 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542390 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152391 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202392 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012393 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162394
[email protected]2431756e2010-09-29 20:26:132395 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522396 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542397 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152398 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202399 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012400 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162401
[email protected]2431756e2010-09-29 20:26:132402 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522403 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542404 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152405 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202406 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012407 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162408
[email protected]2431756e2010-09-29 20:26:132409 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522410 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542411 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152412 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202413 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012414 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162415
2416 // Release two disconnected sockets.
2417
[email protected]2431756e2010-09-29 20:26:132418 handle.socket()->Disconnect();
2419 handle.Reset();
2420 handle2.socket()->Disconnect();
2421 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162422
robpercival214763f2016-07-01 23:27:012423 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132424 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012425 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132426 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162427}
2428
[email protected]d7027bb2010-05-10 18:58:542429// Regression test for http://crbug.com/42267.
2430// When DoReleaseSocket() is processed for one socket, it is blocked because the
2431// other stalled groups all have releasing sockets, so no progress can be made.
2432TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2433 CreatePoolWithIdleTimeouts(
2434 4 /* socket limit */, 4 /* socket limit per group */,
2435 base::TimeDelta(), // Time out unused sockets immediately.
2436 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2437
2438 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2439
2440 // Max out the socket limit with 2 per group.
2441
[email protected]2431756e2010-09-29 20:26:132442 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522443 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132444 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522445 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542446
2447 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542448 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152449 ClientSocketPool::RespectLimits::ENABLED,
2450 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202451 NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542452 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152453 ClientSocketPool::RespectLimits::ENABLED,
2454 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202455 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542456 }
[email protected]b89f7e42010-05-20 20:37:002457
[email protected]d7027bb2010-05-10 18:58:542458 // Make 4 pending requests, 2 per group.
2459
2460 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202461 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542462 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202463 ClientSocketPool::RespectLimits::ENABLED,
2464 callback_a[i].callback(), pool_.get(),
2465 NetLogWithSource()));
2466 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542467 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202468 ClientSocketPool::RespectLimits::ENABLED,
2469 callback_b[i].callback(), pool_.get(),
2470 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542471 }
2472
2473 // Release b's socket first. The order is important, because in
2474 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2475 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2476 // first, which has a releasing socket, so it refuses to start up another
2477 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132478 handle_b[0].socket()->Disconnect();
2479 handle_b[0].Reset();
2480 handle_a[0].socket()->Disconnect();
2481 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542482
2483 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282484 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542485
[email protected]2431756e2010-09-29 20:26:132486 handle_b[1].socket()->Disconnect();
2487 handle_b[1].Reset();
2488 handle_a[1].socket()->Disconnect();
2489 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542490
2491 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012492 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2493 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542494 }
2495}
2496
[email protected]fd4fe0b2010-02-08 23:02:152497TEST_F(ClientSocketPoolBaseTest,
2498 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2499 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2500
2501 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2502
robpercival214763f2016-07-01 23:27:012503 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2504 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2505 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2506 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152507
robpercival214763f2016-07-01 23:27:012508 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2509 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132510 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152511
2512 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132513 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012514 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152515
[email protected]2431756e2010-09-29 20:26:132516 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132518 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152519
2520 EXPECT_EQ(1, GetOrderOfRequest(1));
2521 EXPECT_EQ(2, GetOrderOfRequest(2));
2522 EXPECT_EQ(3, GetOrderOfRequest(3));
2523 EXPECT_EQ(4, GetOrderOfRequest(4));
2524
2525 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132526 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152527}
2528
[email protected]6ecf2b92011-12-15 01:14:522529class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042530 public:
[email protected]2431756e2010-09-29 20:26:132531 TestReleasingSocketRequest(TestClientSocketPool* pool,
2532 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182533 bool reset_releasing_handle)
2534 : pool_(pool),
2535 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042536 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522537
Chris Watkins7a41d3552017-12-01 02:13:272538 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042539
2540 ClientSocketHandle* handle() { return &handle_; }
2541
Bence Béky8ddc2492018-06-13 01:02:042542 CompletionOnceCallback callback() {
2543 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2544 base::Unretained(this));
2545 }
[email protected]4f1e4982010-03-02 18:31:042546
2547 private:
[email protected]6ecf2b92011-12-15 01:14:522548 void OnComplete(int result) {
2549 SetResult(result);
2550 if (reset_releasing_handle_)
2551 handle_.Reset();
2552
mmenked3641e12016-01-28 16:06:152553 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Bence Béky8ddc2492018-06-13 01:02:042554 EXPECT_EQ(
2555 expected_result_,
2556 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2557 ClientSocketPool::RespectLimits::ENABLED,
2558 CompletionOnceCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522559 }
2560
[email protected]2431756e2010-09-29 20:26:132561 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182562 int expected_result_;
2563 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042564 ClientSocketHandle handle_;
2565 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042566};
2567
[email protected]e60e47a2010-07-14 03:37:182568
2569TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2570 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2571
robpercival214763f2016-07-01 23:27:012572 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2573 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2574 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182575
[email protected]2431756e2010-09-29 20:26:132576 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182577 client_socket_factory_.allocation_count());
2578
2579 connect_job_factory_->set_job_type(
2580 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2581 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202582 EXPECT_EQ(
2583 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542584 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202585 ClientSocketPool::RespectLimits::ENABLED,
2586 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182587 // The next job should complete synchronously
2588 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2589
robpercival214763f2016-07-01 23:27:012590 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182591 EXPECT_FALSE(req.handle()->is_initialized());
2592 EXPECT_FALSE(req.handle()->socket());
2593 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432594 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182595}
2596
[email protected]b6501d3d2010-06-03 23:53:342597// http://crbug.com/44724 regression test.
2598// We start releasing the pool when we flush on network change. When that
2599// happens, the only active references are in the ClientSocketHandles. When a
2600// ConnectJob completes and calls back into the last ClientSocketHandle, that
2601// callback can release the last reference and delete the pool. After the
2602// callback finishes, we go back to the stack frame within the now-deleted pool.
2603// Executing any code that refers to members of the now-deleted pool can cause
2604// crashes.
2605TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2606 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2607 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2608
2609 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522610 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152611 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542612 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152613 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202614 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342615
[email protected]7af985a2012-12-14 22:40:422616 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342617
2618 // We'll call back into this now.
2619 callback.WaitForResult();
2620}
2621
[email protected]a7e38572010-06-07 18:22:242622TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2623 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2624 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2625
2626 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522627 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152628 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542629 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152630 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202631 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012632 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242633 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2634
[email protected]7af985a2012-12-14 22:40:422635 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242636
2637 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282638 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242639
mmenked3641e12016-01-28 16:06:152640 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542641 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152642 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202643 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012644 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242645 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2646}
2647
[email protected]6ecf2b92011-12-15 01:14:522648class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142649 public:
Bence Béky8ddc2492018-06-13 01:02:042650 ConnectWithinCallback(const std::string& group_name,
2651 const scoped_refptr<TestSocketParams>& params,
2652 TestClientSocketPool* pool)
2653 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142654
Chris Watkins7a41d3552017-12-01 02:13:272655 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142656
2657 int WaitForNestedResult() {
2658 return nested_callback_.WaitForResult();
2659 }
2660
Bence Béky8ddc2492018-06-13 01:02:042661 CompletionOnceCallback callback() {
2662 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2663 base::Unretained(this));
2664 }
[email protected]6ecf2b92011-12-15 01:14:522665
[email protected]06f92462010-08-31 19:24:142666 private:
[email protected]6ecf2b92011-12-15 01:14:522667 void OnComplete(int result) {
2668 SetResult(result);
tfarina428341112016-09-22 13:38:202669 EXPECT_EQ(
2670 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542671 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202672 ClientSocketPool::RespectLimits::ENABLED,
2673 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522674 }
2675
[email protected]06f92462010-08-31 19:24:142676 const std::string group_name_;
2677 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132678 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142679 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522680 TestCompletionCallback nested_callback_;
2681
2682 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142683};
2684
2685TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2686 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2687
2688 // First job will be waiting until it gets aborted.
2689 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2690
2691 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132692 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152693 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542694 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152695 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202696 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142697
2698 // Second job will be started during the first callback, and will
2699 // asynchronously complete with OK.
2700 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422701 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012702 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2703 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142704}
2705
Matt Menke141b87f22019-01-30 02:43:032706TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
2707 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2708 pool_->EnableConnectBackupJobs();
2709
2710 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2711 ClientSocketHandle handle;
2712 TestCompletionCallback callback;
2713 EXPECT_EQ(ERR_IO_PENDING,
2714 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2715 ClientSocketPool::RespectLimits::ENABLED,
2716 callback.callback(), pool_.get(), NetLogWithSource()));
2717 // The backup timer fires but doesn't start a new ConnectJob while resolving
2718 // the hostname.
2719 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2720 FastForwardBy(base::TimeDelta::FromMilliseconds(
2721 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2722 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2723
2724 // Once the ConnectJob has finished resolving the hostname, the backup timer
2725 // will create a ConnectJob when it fires.
2726 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2727 FastForwardBy(base::TimeDelta::FromMilliseconds(
2728 ClientSocketPool::kMaxConnectRetryIntervalMs));
2729 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2730}
2731
2732// Test that no backup socket is created when a ConnectJob connects before it
2733// completes.
2734TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
2735 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2736 pool_->EnableConnectBackupJobs();
2737
2738 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2739 ClientSocketHandle handle;
2740 TestCompletionCallback callback;
2741 EXPECT_EQ(ERR_IO_PENDING,
2742 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2743 ClientSocketPool::RespectLimits::ENABLED,
2744 callback.callback(), pool_.get(), NetLogWithSource()));
2745 // The backup timer fires but doesn't start a new ConnectJob while resolving
2746 // the hostname.
2747 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2748 FastForwardBy(base::TimeDelta::FromMilliseconds(
2749 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2750 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2751
2752 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2753 client_socket_factory_.SetJobHasEstablishedConnection(0);
2754 FastForwardBy(base::TimeDelta::FromMilliseconds(
2755 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2756 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2757}
2758
[email protected]25eea382010-07-10 23:55:262759// Cancel a pending socket request while we're at max sockets,
2760// and verify that the backup socket firing doesn't cause a crash.
2761TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2762 // Max 4 sockets globally, max 4 sockets per group.
2763 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222764 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262765
[email protected]4baaf9d2010-08-31 15:15:442766 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2767 // timer.
[email protected]25eea382010-07-10 23:55:262768 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2769 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522770 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152771 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542772 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152773 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202774 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262775
2776 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2777 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2778 ClientSocketHandle handles[kDefaultMaxSockets];
2779 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522780 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542781 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202782 ClientSocketPool::RespectLimits::ENABLED,
2783 callback.callback(), pool_.get(),
2784 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262785 }
2786
fdoray5eeb7642016-06-22 16:11:282787 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262788
2789 // Cancel the pending request.
2790 handle.Reset();
2791
2792 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452793 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002794 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262795
[email protected]25eea382010-07-10 23:55:262796 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2797}
2798
[email protected]3f00be82010-09-27 19:50:022799TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442800 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2801 pool_->EnableConnectBackupJobs();
2802
2803 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2804 // timer.
2805 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2806 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522807 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152808 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542809 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152810 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202811 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442812 ASSERT_TRUE(pool_->HasGroup("bar"));
2813 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
Lily Chenecebf932018-11-02 17:15:432814 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102815 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442816
2817 // Cancel the socket request. This should cancel the backup timer. Wait for
2818 // the backup time to see if it indeed got canceled.
2819 handle.Reset();
2820 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452821 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002822 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]4baaf9d2010-08-31 15:15:442823 ASSERT_TRUE(pool_->HasGroup("bar"));
2824 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2825}
2826
[email protected]3f00be82010-09-27 19:50:022827TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2828 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2829 pool_->EnableConnectBackupJobs();
2830
2831 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2832 // timer.
2833 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2834 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522835 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152836 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542837 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152838 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202839 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2841 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522842 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202843 EXPECT_EQ(
2844 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542845 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202846 ClientSocketPool::RespectLimits::ENABLED,
2847 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022848 ASSERT_TRUE(pool_->HasGroup("bar"));
2849 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2850
2851 // Cancel request 1 and then complete request 2. With the requests finished,
2852 // the backup timer should be cancelled.
2853 handle.Reset();
robpercival214763f2016-07-01 23:27:012854 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022855 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452856 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002857 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022858}
2859
[email protected]eb5a99382010-07-11 03:18:262860// Test delayed socket binding for the case where we have two connects,
2861// and while one is waiting on a connect, the other frees up.
2862// The socket waiting on a connect should switch immediately to the freed
2863// up socket.
2864TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2865 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2866 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2867
2868 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522869 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132870 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542871 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152872 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202873 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012874 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262875
2876 // No idle sockets, no pending jobs.
2877 EXPECT_EQ(0, pool_->IdleSocketCount());
2878 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2879
2880 // Create a second socket to the same host, but this one will wait.
2881 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2882 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132883 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542884 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152885 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202886 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262887 // No idle sockets, and one connecting job.
2888 EXPECT_EQ(0, pool_->IdleSocketCount());
2889 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2890
2891 // Return the first handle to the pool. This will initiate the delayed
2892 // binding.
2893 handle1.Reset();
2894
fdoray5eeb7642016-06-22 16:11:282895 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262896
2897 // Still no idle sockets, still one pending connect job.
2898 EXPECT_EQ(0, pool_->IdleSocketCount());
2899 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2900
2901 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012902 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262903
2904 // And we can see there is still one job waiting.
2905 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2906
2907 // Finally, signal the waiting Connect.
2908 client_socket_factory_.SignalJobs();
2909 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2910
fdoray5eeb7642016-06-22 16:11:282911 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262912}
2913
2914// Test delayed socket binding when a group is at capacity and one
2915// of the group's sockets frees up.
2916TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2917 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2918 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2919
2920 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522921 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132922 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542923 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152924 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202925 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012926 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262927
2928 // No idle sockets, no pending jobs.
2929 EXPECT_EQ(0, pool_->IdleSocketCount());
2930 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2931
2932 // Create a second socket to the same host, but this one will wait.
2933 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2934 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132935 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542936 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152937 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202938 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262939 // No idle sockets, and one connecting job.
2940 EXPECT_EQ(0, pool_->IdleSocketCount());
2941 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2942
2943 // Return the first handle to the pool. This will initiate the delayed
2944 // binding.
2945 handle1.Reset();
2946
fdoray5eeb7642016-06-22 16:11:282947 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262948
2949 // Still no idle sockets, still one pending connect job.
2950 EXPECT_EQ(0, pool_->IdleSocketCount());
2951 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2952
2953 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012954 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262955
2956 // And we can see there is still one job waiting.
2957 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2958
2959 // Finally, signal the waiting Connect.
2960 client_socket_factory_.SignalJobs();
2961 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2962
fdoray5eeb7642016-06-22 16:11:282963 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262964}
2965
2966// Test out the case where we have one socket connected, one
2967// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512968// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262969// should complete, by taking the first socket's idle socket.
2970TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2971 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2972 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2973
2974 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522975 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132976 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542977 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152978 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202979 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012980 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262981
2982 // No idle sockets, no pending jobs.
2983 EXPECT_EQ(0, pool_->IdleSocketCount());
2984 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2985
2986 // Create a second socket to the same host, but this one will wait.
2987 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2988 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132989 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542990 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152991 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202992 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262993 // No idle sockets, and one connecting job.
2994 EXPECT_EQ(0, pool_->IdleSocketCount());
2995 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2996
2997 // Return the first handle to the pool. This will initiate the delayed
2998 // binding.
2999 handle1.Reset();
3000
fdoray5eeb7642016-06-22 16:11:283001 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263002
3003 // Still no idle sockets, still one pending connect job.
3004 EXPECT_EQ(0, pool_->IdleSocketCount());
3005 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3006
3007 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013008 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263009
3010 // And we can see there is still one job waiting.
3011 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3012
3013 // Finally, signal the waiting Connect.
3014 client_socket_factory_.SignalJobs();
3015 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3016
fdoray5eeb7642016-06-22 16:11:283017 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263018}
3019
[email protected]2abfe90a2010-08-25 17:49:513020// Cover the case where on an available socket slot, we have one pending
3021// request that completes synchronously, thereby making the Group empty.
3022TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3023 const int kUnlimitedSockets = 100;
3024 const int kOneSocketPerGroup = 1;
3025 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3026
3027 // Make the first request asynchronous fail.
3028 // This will free up a socket slot later.
3029 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3030
3031 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523032 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203033 EXPECT_EQ(
3034 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543035 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203036 ClientSocketPool::RespectLimits::ENABLED,
3037 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513038 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3039
3040 // Make the second request synchronously fail. This should make the Group
3041 // empty.
3042 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3043 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523044 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513045 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3046 // when created.
tfarina428341112016-09-22 13:38:203047 EXPECT_EQ(
3048 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543049 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203050 ClientSocketPool::RespectLimits::ENABLED,
3051 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513052
3053 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3054
robpercival214763f2016-07-01 23:27:013055 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3056 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513057 EXPECT_FALSE(pool_->HasGroup("a"));
3058}
3059
[email protected]e1b54dc2010-10-06 21:27:223060TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3061 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3062
3063 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3064
3065 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523066 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203067 EXPECT_EQ(
3068 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543069 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203070 ClientSocketPool::RespectLimits::ENABLED,
3071 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223072
3073 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523074 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203075 EXPECT_EQ(
3076 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543077 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203078 ClientSocketPool::RespectLimits::ENABLED,
3079 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223080 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523081 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203082 EXPECT_EQ(
3083 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543084 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203085 ClientSocketPool::RespectLimits::ENABLED,
3086 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223087
robpercival214763f2016-07-01 23:27:013088 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3089 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3090 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223091
3092 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:593093 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383094 TRAFFIC_ANNOTATION_FOR_TESTS));
Bence Békybdbb0e72018-08-07 21:42:593095 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383096 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223097
3098 handle1.Reset();
3099 handle2.Reset();
3100 handle3.Reset();
3101
tfarina428341112016-09-22 13:38:203102 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543103 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203104 ClientSocketPool::RespectLimits::ENABLED,
3105 callback1.callback(), pool_.get(), NetLogWithSource()));
3106 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543107 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203108 ClientSocketPool::RespectLimits::ENABLED,
3109 callback2.callback(), pool_.get(), NetLogWithSource()));
3110 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543111 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203112 ClientSocketPool::RespectLimits::ENABLED,
3113 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223114
3115 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3116 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3117 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3118}
3119
[email protected]2c2bef152010-10-13 00:55:033120TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3121 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3122 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3123
Charlie Harrison55ce6082018-05-14 02:25:573124 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033125
3126 ASSERT_TRUE(pool_->HasGroup("a"));
3127 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433128 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103129 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033130 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3131
3132 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523133 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203134 EXPECT_EQ(
3135 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543136 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203137 ClientSocketPool::RespectLimits::ENABLED,
3138 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033139
3140 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523141 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203142 EXPECT_EQ(
3143 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543144 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203145 ClientSocketPool::RespectLimits::ENABLED,
3146 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033147
3148 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433149 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103150 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033151 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3152
robpercival214763f2016-07-01 23:27:013153 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3154 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033155 handle1.Reset();
3156 handle2.Reset();
3157
3158 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433159 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103160 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033161 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3162}
3163
3164TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3165 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3166 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3167
3168 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523169 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203170 EXPECT_EQ(
3171 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543172 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203173 ClientSocketPool::RespectLimits::ENABLED,
3174 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033175
3176 ASSERT_TRUE(pool_->HasGroup("a"));
3177 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433178 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103179 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033180 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3181
Charlie Harrison55ce6082018-05-14 02:25:573182 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033183
3184 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433185 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103186 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033187 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3188
3189 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523190 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203191 EXPECT_EQ(
3192 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543193 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203194 ClientSocketPool::RespectLimits::ENABLED,
3195 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033196
3197 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433198 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103199 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033200 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3201
robpercival214763f2016-07-01 23:27:013202 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3203 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033204 handle1.Reset();
3205 handle2.Reset();
3206
3207 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433208 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103209 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033210 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3211}
3212
3213TEST_F(ClientSocketPoolBaseTest,
3214 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3215 CreatePool(4, 4);
3216 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3217
3218 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523219 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203220 EXPECT_EQ(
3221 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543222 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203223 ClientSocketPool::RespectLimits::ENABLED,
3224 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033225
3226 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523227 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203228 EXPECT_EQ(
3229 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543230 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203231 ClientSocketPool::RespectLimits::ENABLED,
3232 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033233
3234 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523235 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203236 EXPECT_EQ(
3237 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543238 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203239 ClientSocketPool::RespectLimits::ENABLED,
3240 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033241
3242 ASSERT_TRUE(pool_->HasGroup("a"));
3243 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433244 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103245 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033246 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3247
Charlie Harrison55ce6082018-05-14 02:25:573248 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033249
3250 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433251 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103252 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033253 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3254
robpercival214763f2016-07-01 23:27:013255 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3256 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3257 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033258 handle1.Reset();
3259 handle2.Reset();
3260 handle3.Reset();
3261
3262 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433263 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103264 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033265 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3266}
3267
3268TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3269 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3270 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3271
3272 ASSERT_FALSE(pool_->HasGroup("a"));
3273
Charlie Harrison55ce6082018-05-14 02:25:573274 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033275
3276 ASSERT_TRUE(pool_->HasGroup("a"));
3277 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433278 EXPECT_EQ(kDefaultMaxSockets, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103279 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033280
3281 ASSERT_FALSE(pool_->HasGroup("b"));
3282
Charlie Harrison55ce6082018-05-14 02:25:573283 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033284
3285 ASSERT_FALSE(pool_->HasGroup("b"));
3286}
3287
3288TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3289 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3290 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3291
3292 ASSERT_FALSE(pool_->HasGroup("a"));
3293
3294 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573295 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033296
3297 ASSERT_TRUE(pool_->HasGroup("a"));
3298 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103299 EXPECT_EQ(kDefaultMaxSockets - 1,
Lily Chenecebf932018-11-02 17:15:433300 pool_->NumNeverAssignedConnectJobsInGroup("a"));
3301 EXPECT_EQ(kDefaultMaxSockets - 1,
[email protected]8159a1c2012-06-07 00:00:103302 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483303 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033304
3305 ASSERT_FALSE(pool_->HasGroup("b"));
3306
Charlie Harrison55ce6082018-05-14 02:25:573307 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033308
3309 ASSERT_TRUE(pool_->HasGroup("b"));
3310 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483311 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033312}
3313
3314TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3315 CreatePool(4, 4);
3316 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3317
3318 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523319 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203320 EXPECT_EQ(
3321 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543322 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203323 ClientSocketPool::RespectLimits::ENABLED,
3324 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013325 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033326 handle1.Reset();
3327
3328 ASSERT_TRUE(pool_->HasGroup("a"));
3329 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433330 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103331 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033332 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3333
Charlie Harrison55ce6082018-05-14 02:25:573334 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033335
3336 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433337 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103338 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033339 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3340}
3341
3342TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3343 CreatePool(4, 4);
3344 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3345
3346 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523347 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203348 EXPECT_EQ(
3349 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543350 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203351 ClientSocketPool::RespectLimits::ENABLED,
3352 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013353 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033354
3355 ASSERT_TRUE(pool_->HasGroup("a"));
3356 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433357 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103358 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033359 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3360 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3361
Charlie Harrison55ce6082018-05-14 02:25:573362 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033363
3364 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433365 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103366 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033367 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3368 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3369}
3370
3371TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3372 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3373 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3374
3375 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573376 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033377
3378 ASSERT_TRUE(pool_->HasGroup("a"));
3379 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433380 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103381 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033382 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3383
3384 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573385 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033386
3387 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433388 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103389 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033390 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3391}
3392
[email protected]3c819f522010-12-02 02:03:123393TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3394 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3395 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3396
3397 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573398 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123399
3400 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523401
3402 connect_job_factory_->set_job_type(
3403 TestConnectJob::kMockAdditionalErrorStateJob);
3404 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573405 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523406
3407 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123408}
3409
[email protected]8159a1c2012-06-07 00:00:103410TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033411 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433412 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033413
Charlie Harrison55ce6082018-05-14 02:25:573414 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033415
3416 ASSERT_TRUE(pool_->HasGroup("a"));
3417 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433418 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103419 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433420 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033421 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3422
Charlie Harrison55ce6082018-05-14 02:25:573423 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033424 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433425 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103426 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433427 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033428 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3429
3430 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523431 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203432 EXPECT_EQ(
3433 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543434 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203435 ClientSocketPool::RespectLimits::ENABLED,
3436 callback1.callback(), pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433437
3438 client_socket_factory_.SignalJob(0);
3439 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3440
3441 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3442 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3443 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3444 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3445 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033446
3447 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523448 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433449 EXPECT_EQ(
3450 ERR_IO_PENDING,
3451 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3452 ClientSocketPool::RespectLimits::ENABLED,
3453 callback2.callback(), pool_.get(), NetLogWithSource()));
3454 client_socket_factory_.SignalJob(0);
3455 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033456
[email protected]8159a1c2012-06-07 00:00:103457 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433458 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103459 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3460 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3461 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3462
[email protected]2c2bef152010-10-13 00:55:033463 handle1.Reset();
3464 handle2.Reset();
3465
[email protected]8159a1c2012-06-07 00:00:103466 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433467 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103468 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433469 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033470 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3471
Charlie Harrison55ce6082018-05-14 02:25:573472 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033473 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433474 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103475 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433476 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033477 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3478}
3479
3480TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3481 CreatePool(4, 4);
3482 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3483
Charlie Harrison55ce6082018-05-14 02:25:573484 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033485
3486 ASSERT_TRUE(pool_->HasGroup("a"));
3487 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433488 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103489 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033490 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3491
Charlie Harrison55ce6082018-05-14 02:25:573492 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033493 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433494 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103495 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033496 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3497
Charlie Harrison55ce6082018-05-14 02:25:573498 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033499 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433500 EXPECT_EQ(3, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103501 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033502 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3503
Charlie Harrison55ce6082018-05-14 02:25:573504 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033505 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433506 EXPECT_EQ(3, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103507 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033508 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3509}
3510
3511TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3512 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433513 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033514
Charlie Harrison55ce6082018-05-14 02:25:573515 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033516
3517 ASSERT_TRUE(pool_->HasGroup("a"));
3518 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433519 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103520 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033521 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3522
3523 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523524 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203525 EXPECT_EQ(
3526 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543527 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203528 ClientSocketPool::RespectLimits::ENABLED,
3529 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033530
3531 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433532 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103533 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033534 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3535
Lily Chenecebf932018-11-02 17:15:433536 client_socket_factory_.SignalJobs();
3537 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3538
3539 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3540 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3541 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3542 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3543 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033544
[email protected]0dc88b32014-03-26 20:12:283545 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483546 // starts, it has a connect start time.
3547 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033548 handle1.Reset();
3549
3550 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3551}
3552
[email protected]034df0f32013-01-07 23:17:483553// Checks that fully connected preconnect jobs have no connect times, and are
3554// marked as reused.
3555TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3556 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3557 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573558 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483559
3560 ASSERT_TRUE(pool_->HasGroup("a"));
3561 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433562 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]034df0f32013-01-07 23:17:483563 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3564 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3565
3566 ClientSocketHandle handle;
3567 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203568 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543569 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203570 ClientSocketPool::RespectLimits::ENABLED,
3571 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483572
3573 // Make sure the idle socket was used.
3574 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3575
3576 TestLoadTimingInfoConnectedReused(handle);
3577 handle.Reset();
3578 TestLoadTimingInfoNotConnected(handle);
3579}
3580
[email protected]dcbe168a2010-12-02 03:14:463581// http://crbug.com/64940 regression test.
3582TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3583 const int kMaxTotalSockets = 3;
3584 const int kMaxSocketsPerGroup = 2;
3585 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433586 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463587
3588 // Note that group name ordering matters here. "a" comes before "b", so
3589 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3590
3591 // Set up one idle socket in "a".
3592 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523593 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203594 EXPECT_EQ(
3595 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543596 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203597 ClientSocketPool::RespectLimits::ENABLED,
3598 callback1.callback(), pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433599 ASSERT_TRUE(pool_->HasGroup("a"));
3600 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3601 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3602 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3603 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463604
Lily Chenecebf932018-11-02 17:15:433605 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013606 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:433607 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3608 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3609 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3610 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3611
[email protected]dcbe168a2010-12-02 03:14:463612 handle1.Reset();
3613 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3614
3615 // Set up two active sockets in "b".
3616 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523617 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203618 EXPECT_EQ(
3619 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543620 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203621 ClientSocketPool::RespectLimits::ENABLED,
3622 callback1.callback(), pool_.get(), NetLogWithSource()));
3623 EXPECT_EQ(
3624 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543625 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203626 ClientSocketPool::RespectLimits::ENABLED,
3627 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463628
Lily Chenecebf932018-11-02 17:15:433629 ASSERT_TRUE(pool_->HasGroup("b"));
3630 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("b"));
3631 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3632 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
3633 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3634
3635 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013636 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3637 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463638 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433639 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103640 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463641 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3642
3643 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3644 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3645 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3646 // sockets for "a", and "b" should still have 2 active sockets.
3647
Charlie Harrison55ce6082018-05-14 02:25:573648 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463649 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433650 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103651 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463652 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3653 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3654 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433655 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103656 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463657 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3658 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3659
3660 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3661 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3662 // "a" should result in closing 1 for "b".
3663 handle1.Reset();
3664 handle2.Reset();
3665 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3666 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3667
Charlie Harrison55ce6082018-05-14 02:25:573668 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463669 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433670 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103671 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463672 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3673 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3674 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433675 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103676 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463677 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3678 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3679}
3680
[email protected]b7b8be42011-07-12 12:46:413681TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073682 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3683 pool_->EnableConnectBackupJobs();
3684
3685 // Make the ConnectJob hang until it times out, shorten the timeout.
3686 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3687 connect_job_factory_->set_timeout_duration(
3688 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573689 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073690 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433691 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103692 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073693 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073694
[email protected]b7b8be42011-07-12 12:46:413695 // Verify the backup timer doesn't create a backup job, by making
3696 // the backup job a pending job instead of a waiting job, so it
3697 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073698 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453699 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443700 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343701 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283702 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073703 EXPECT_FALSE(pool_->HasGroup("a"));
3704}
3705
[email protected]b7b8be42011-07-12 12:46:413706TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073707 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3708 pool_->EnableConnectBackupJobs();
3709
3710 // Make the ConnectJob hang forever.
3711 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573712 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073713 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433714 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103715 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073716 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283717 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073718
3719 // Make the backup job be a pending job, so it completes normally.
3720 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3721 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523722 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153723 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543724 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153725 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203726 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413727 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073728 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433729 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103730 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073731 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3732 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013733 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073734
3735 // The hung connect job should still be there, but everything else should be
3736 // complete.
3737 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433738 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3739 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073740 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3741 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3742}
3743
[email protected]0dc88b32014-03-26 20:12:283744// Tests that a preconnect that starts out with unread data can still be used.
3745// http://crbug.com/334467
3746TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3748 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3749
Charlie Harrison55ce6082018-05-14 02:25:573750 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283751
3752 ASSERT_TRUE(pool_->HasGroup("a"));
3753 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433754 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283755 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3756 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3757
3758 // Fail future jobs to be sure that handle receives the preconnected socket
3759 // rather than closing it and making a new one.
3760 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3761 ClientSocketHandle handle;
3762 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203763 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543764 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203765 ClientSocketPool::RespectLimits::ENABLED,
3766 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283767
3768 ASSERT_TRUE(pool_->HasGroup("a"));
3769 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433770 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283771 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3772 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433773 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283774
3775 // Drain the pending read.
Bence Békybdbb0e72018-08-07 21:42:593776 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283777
3778 TestLoadTimingInfoConnectedReused(handle);
3779 handle.Reset();
3780
3781 // The socket should be usable now that it's idle again.
3782 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3783}
3784
Lily Chenecebf932018-11-02 17:15:433785TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
3786 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3787 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3788
3789 ClientSocketHandle handle1;
3790 TestCompletionCallback callback1;
3791 EXPECT_EQ(
3792 ERR_IO_PENDING,
3793 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3794 ClientSocketPool::RespectLimits::ENABLED,
3795 callback1.callback(), pool_.get(), NetLogWithSource()));
3796
3797 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3798 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3799 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3800 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3801
3802 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3803}
3804
3805TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
3806 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3807 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3808
3809 ClientSocketHandle handle1;
3810 TestCompletionCallback callback1;
3811 EXPECT_EQ(
3812 ERR_IO_PENDING,
3813 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3814 ClientSocketPool::RespectLimits::ENABLED,
3815 callback1.callback(), pool_.get(), NetLogWithSource()));
3816
3817 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3818 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3819 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3820 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3821
3822 ClientSocketHandle handle2;
3823 TestCompletionCallback callback2;
3824 EXPECT_EQ(
3825 ERR_IO_PENDING,
3826 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3827 ClientSocketPool::RespectLimits::ENABLED,
3828 callback2.callback(), pool_.get(), NetLogWithSource()));
3829
3830 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3831 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3832 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3833 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3834
3835 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3836 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3837
3838 // One job completes. The other request should still have its job.
3839 client_socket_factory_.SignalJob(0);
3840 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3841
3842 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3843 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3844 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3845 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3846 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3847
3848 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3849}
3850
3851TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
3852 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3853 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3854
3855 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
3856
3857 ASSERT_TRUE(pool_->HasGroup("a"));
3858 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3859 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3860 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3861 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3862
3863 ClientSocketHandle handle1;
3864 TestCompletionCallback callback1;
3865 EXPECT_EQ(
3866 ERR_IO_PENDING,
3867 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3868 ClientSocketPool::RespectLimits::ENABLED,
3869 callback1.callback(), pool_.get(), NetLogWithSource()));
3870
3871 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3872 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3873 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3874 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3875
3876 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3877}
3878
3879TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
3880 CreatePool(kDefaultMaxSockets, 1);
3881 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3882
3883 ClientSocketHandle handle1;
3884 TestCompletionCallback callback1;
3885 EXPECT_EQ(
3886 ERR_IO_PENDING,
3887 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3888 ClientSocketPool::RespectLimits::ENABLED,
3889 callback1.callback(), pool_.get(), NetLogWithSource()));
3890
3891 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3892 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3893 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3894 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3895
3896 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3897
3898 // Insert a higher priority request
3899 ClientSocketHandle handle2;
3900 TestCompletionCallback callback2;
3901 EXPECT_EQ(
3902 ERR_IO_PENDING,
3903 handle2.Init("a", params_, HIGHEST, SocketTag(),
3904 ClientSocketPool::RespectLimits::ENABLED,
3905 callback2.callback(), pool_.get(), NetLogWithSource()));
3906
3907 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3908 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3909 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3910 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3911
3912 // The highest priority request should steal the job from the default priority
3913 // request.
3914 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3915 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3916}
3917
3918TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
3919 CreatePool(3, 3);
3920 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3921
3922 ClientSocketHandle handle_lowest;
3923 TestCompletionCallback callback_lowest;
3924 EXPECT_EQ(ERR_IO_PENDING,
3925 handle_lowest.Init("a", params_, LOWEST, SocketTag(),
3926 ClientSocketPool::RespectLimits::ENABLED,
3927 callback_lowest.callback(), pool_.get(),
3928 NetLogWithSource()));
3929
3930 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3931 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3932 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3933 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3934
3935 ClientSocketHandle handle_highest;
3936 TestCompletionCallback callback_highest;
3937 EXPECT_EQ(ERR_IO_PENDING,
3938 handle_highest.Init("a", params_, HIGHEST, SocketTag(),
3939 ClientSocketPool::RespectLimits::ENABLED,
3940 callback_highest.callback(), pool_.get(),
3941 NetLogWithSource()));
3942
3943 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3944 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3945 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3946 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3947
3948 ClientSocketHandle handle_low;
3949 TestCompletionCallback callback_low;
3950 EXPECT_EQ(ERR_IO_PENDING,
3951 handle_low.Init("a", params_, LOW, SocketTag(),
3952 ClientSocketPool::RespectLimits::ENABLED,
3953 callback_low.callback(), pool_.get(),
3954 NetLogWithSource()));
3955
3956 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3957 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3958 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3959 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3960
3961 ClientSocketHandle handle_lowest2;
3962 TestCompletionCallback callback_lowest2;
3963 EXPECT_EQ(ERR_IO_PENDING,
3964 handle_lowest2.Init("a", params_, LOWEST, SocketTag(),
3965 ClientSocketPool::RespectLimits::ENABLED,
3966 callback_lowest2.callback(), pool_.get(),
3967 NetLogWithSource()));
3968
3969 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3970 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3971 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3972 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3973
3974 // The top three requests in the queue should have jobs.
3975 EXPECT_TRUE(
3976 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
3977 EXPECT_TRUE(
3978 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
3979 EXPECT_TRUE(
3980 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
3981 EXPECT_FALSE(
3982 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
3983
3984 // Add another request with medium priority. It should steal the job from the
3985 // lowest priority request with a job.
3986 ClientSocketHandle handle_medium;
3987 TestCompletionCallback callback_medium;
3988 EXPECT_EQ(ERR_IO_PENDING,
3989 handle_medium.Init("a", params_, MEDIUM, SocketTag(),
3990 ClientSocketPool::RespectLimits::ENABLED,
3991 callback_medium.callback(), pool_.get(),
3992 NetLogWithSource()));
3993
3994 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3995 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3996 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3997 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3998 EXPECT_TRUE(
3999 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
4000 EXPECT_TRUE(
4001 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_medium));
4002 EXPECT_TRUE(
4003 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
4004 EXPECT_FALSE(
4005 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
4006 EXPECT_FALSE(
4007 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
4008}
4009
4010TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4011 CreatePool(kDefaultMaxSockets, 1);
4012 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4013
4014 ClientSocketHandle handle1;
4015 TestCompletionCallback callback1;
4016 EXPECT_EQ(
4017 ERR_IO_PENDING,
4018 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4019 ClientSocketPool::RespectLimits::ENABLED,
4020 callback1.callback(), pool_.get(), NetLogWithSource()));
4021
4022 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4023 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4024 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4025 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4026
4027 ClientSocketHandle handle2;
4028 TestCompletionCallback callback2;
4029 EXPECT_EQ(
4030 ERR_IO_PENDING,
4031 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4032 ClientSocketPool::RespectLimits::ENABLED,
4033 callback2.callback(), pool_.get(), NetLogWithSource()));
4034
4035 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4036 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4037 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4038 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4039
4040 // The second request doesn't get a job because we are at the limit.
4041 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4042 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4043
4044 // Reprioritizing the second request places it above the first, and it steals
4045 // the job from the first request.
4046 pool_->SetPriority("a", &handle2, HIGHEST);
4047 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4048 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4049}
4050
4051TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4052 CreatePool(kDefaultMaxSockets, 1);
4053 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4054
4055 ClientSocketHandle handle1;
4056 TestCompletionCallback callback1;
4057 EXPECT_EQ(
4058 ERR_IO_PENDING,
4059 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4060 ClientSocketPool::RespectLimits::ENABLED,
4061 callback1.callback(), pool_.get(), NetLogWithSource()));
4062
4063 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4064 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4065 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4066 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4067
4068 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4069
4070 ClientSocketHandle handle2;
4071 TestCompletionCallback callback2;
4072 EXPECT_EQ(
4073 ERR_IO_PENDING,
4074 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4075 ClientSocketPool::RespectLimits::ENABLED,
4076 callback2.callback(), pool_.get(), NetLogWithSource()));
4077
4078 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4079 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4080 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4081 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4082
4083 // The second request doesn't get a job because we are the limit.
4084 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4085 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4086
4087 // The second request should get a job upon cancelling the first request.
4088 handle1.Reset();
4089 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4090 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4091 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4092 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4093
4094 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4095}
4096
4097TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4098 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4099 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4100
4101 ClientSocketHandle handle1;
4102 TestCompletionCallback callback1;
4103 EXPECT_EQ(
4104 ERR_IO_PENDING,
4105 handle1.Init("a", params_, HIGHEST, SocketTag(),
4106 ClientSocketPool::RespectLimits::ENABLED,
4107 callback1.callback(), pool_.get(), NetLogWithSource()));
4108
4109 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4110 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4111 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4112 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4113
4114 ClientSocketHandle handle2;
4115 TestCompletionCallback callback2;
4116 EXPECT_EQ(
4117 ERR_IO_PENDING,
4118 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4119 ClientSocketPool::RespectLimits::ENABLED,
4120 callback2.callback(), pool_.get(), NetLogWithSource()));
4121
4122 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
4123 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4124 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4125 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4126
4127 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4128 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4129
4130 // The lower-priority job completes first. The higher-priority request should
4131 // get the socket, and the lower-priority request should get the remaining
4132 // job.
4133 client_socket_factory_.SignalJob(1);
4134 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4135 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4136 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4137 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4138 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
4139 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4140 EXPECT_TRUE(handle1.socket());
4141 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4142}
4143
[email protected]043b68c82013-08-22 23:41:524144class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204145 public:
4146 MockLayeredPool(TestClientSocketPool* pool,
4147 const std::string& group_name)
4148 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:204149 group_name_(group_name),
4150 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524151 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204152 }
4153
Daniel Cheng4496d0822018-04-26 21:52:154154 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204155
4156 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154157 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:544158 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154159 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204160 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204161 }
4162
4163 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154164 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:544165 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154166 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:204167 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204168 }
4169
4170 bool ReleaseOneConnection() {
4171 if (!handle_.is_initialized() || !can_release_connection_) {
4172 return false;
4173 }
4174 handle_.socket()->Disconnect();
4175 handle_.Reset();
4176 return true;
4177 }
4178
4179 void set_can_release_connection(bool can_release_connection) {
4180 can_release_connection_ = can_release_connection;
4181 }
4182
4183 MOCK_METHOD0(CloseOneIdleConnection, bool());
4184
4185 private:
4186 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204187 ClientSocketHandle handle_;
4188 TestCompletionCallback callback_;
4189 const std::string group_name_;
4190 bool can_release_connection_;
4191};
4192
4193TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
4194 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4195 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4196
4197 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014198 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204199 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4200 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:524201 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204202}
4203
4204TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
4205 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4206 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4207
4208 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014209 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204210 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4211 .WillOnce(Invoke(&mock_layered_pool,
4212 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:524213 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204214}
4215
4216// Tests the basic case of closing an idle socket in a higher layered pool when
4217// a new request is issued and the lower layer pool is stalled.
4218TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4219 CreatePool(1, 1);
4220 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4221
4222 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014223 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204224 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4225 .WillOnce(Invoke(&mock_layered_pool,
4226 &MockLayeredPool::ReleaseOneConnection));
4227 ClientSocketHandle handle;
4228 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154229 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544230 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154231 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204232 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014233 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204234}
4235
4236// Same as above, but the idle socket is in the same group as the stalled
4237// socket, and closes the only other request in its group when closing requests
4238// in higher layered pools. This generally shouldn't happen, but it may be
4239// possible if a higher level pool issues a request and the request is
4240// subsequently cancelled. Even if it's not possible, best not to crash.
4241TEST_F(ClientSocketPoolBaseTest,
4242 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4243 CreatePool(2, 2);
4244 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4245
4246 // Need a socket in another group for the pool to be stalled (If a group
4247 // has the maximum number of connections already, it's not stalled).
4248 ClientSocketHandle handle1;
4249 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204250 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544251 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204252 ClientSocketPool::RespectLimits::ENABLED,
4253 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204254
4255 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014256 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204257 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4258 .WillOnce(Invoke(&mock_layered_pool,
4259 &MockLayeredPool::ReleaseOneConnection));
4260 ClientSocketHandle handle;
4261 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:154262 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544263 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154264 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204265 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014266 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204267}
4268
4269// Tests the case when an idle socket can be closed when a new request is
4270// issued, and the new request belongs to a group that was previously stalled.
4271TEST_F(ClientSocketPoolBaseTest,
4272 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4273 CreatePool(2, 2);
4274 std::list<TestConnectJob::JobType> job_types;
4275 job_types.push_back(TestConnectJob::kMockJob);
4276 job_types.push_back(TestConnectJob::kMockJob);
4277 job_types.push_back(TestConnectJob::kMockJob);
4278 job_types.push_back(TestConnectJob::kMockJob);
4279 connect_job_factory_->set_job_types(&job_types);
4280
4281 ClientSocketHandle handle1;
4282 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204283 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544284 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204285 ClientSocketPool::RespectLimits::ENABLED,
4286 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204287
4288 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014289 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204290 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4291 .WillRepeatedly(Invoke(&mock_layered_pool,
4292 &MockLayeredPool::ReleaseOneConnection));
4293 mock_layered_pool.set_can_release_connection(false);
4294
4295 // The third request is made when the socket pool is in a stalled state.
4296 ClientSocketHandle handle3;
4297 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204298 EXPECT_EQ(
4299 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544300 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204301 ClientSocketPool::RespectLimits::ENABLED,
4302 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204303
4304 base::RunLoop().RunUntilIdle();
4305 EXPECT_FALSE(callback3.have_result());
4306
4307 // The fourth request is made when the pool is no longer stalled. The third
4308 // request should be serviced first, since it was issued first and has the
4309 // same priority.
4310 mock_layered_pool.set_can_release_connection(true);
4311 ClientSocketHandle handle4;
4312 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204313 EXPECT_EQ(
4314 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544315 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204316 ClientSocketPool::RespectLimits::ENABLED,
4317 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014318 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204319 EXPECT_FALSE(callback4.have_result());
4320
4321 // Closing a handle should free up another socket slot.
4322 handle1.Reset();
robpercival214763f2016-07-01 23:27:014323 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204324}
4325
4326// Tests the case when an idle socket can be closed when a new request is
4327// issued, and the new request belongs to a group that was previously stalled.
4328//
4329// The two differences from the above test are that the stalled requests are not
4330// in the same group as the layered pool's request, and the the fourth request
4331// has a higher priority than the third one, so gets a socket first.
4332TEST_F(ClientSocketPoolBaseTest,
4333 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4334 CreatePool(2, 2);
4335 std::list<TestConnectJob::JobType> job_types;
4336 job_types.push_back(TestConnectJob::kMockJob);
4337 job_types.push_back(TestConnectJob::kMockJob);
4338 job_types.push_back(TestConnectJob::kMockJob);
4339 job_types.push_back(TestConnectJob::kMockJob);
4340 connect_job_factory_->set_job_types(&job_types);
4341
4342 ClientSocketHandle handle1;
4343 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204344 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544345 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204346 ClientSocketPool::RespectLimits::ENABLED,
4347 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204348
4349 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014350 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204351 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4352 .WillRepeatedly(Invoke(&mock_layered_pool,
4353 &MockLayeredPool::ReleaseOneConnection));
4354 mock_layered_pool.set_can_release_connection(false);
4355
4356 // The third request is made when the socket pool is in a stalled state.
4357 ClientSocketHandle handle3;
4358 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204359 EXPECT_EQ(
4360 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544361 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204362 ClientSocketPool::RespectLimits::ENABLED,
4363 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204364
4365 base::RunLoop().RunUntilIdle();
4366 EXPECT_FALSE(callback3.have_result());
4367
4368 // The fourth request is made when the pool is no longer stalled. This
4369 // request has a higher priority than the third request, so is serviced first.
4370 mock_layered_pool.set_can_release_connection(true);
4371 ClientSocketHandle handle4;
4372 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204373 EXPECT_EQ(
4374 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544375 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204376 ClientSocketPool::RespectLimits::ENABLED,
4377 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014378 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204379 EXPECT_FALSE(callback3.have_result());
4380
4381 // Closing a handle should free up another socket slot.
4382 handle1.Reset();
robpercival214763f2016-07-01 23:27:014383 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204384}
4385
4386TEST_F(ClientSocketPoolBaseTest,
4387 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4388 CreatePool(1, 1);
4389 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4390
4391 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014392 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204393 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4394 .WillRepeatedly(Invoke(&mock_layered_pool1,
4395 &MockLayeredPool::ReleaseOneConnection));
4396 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014397 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4398 IsOk());
[email protected]58e562f2013-04-22 17:32:204399 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4400 .WillRepeatedly(Invoke(&mock_layered_pool2,
4401 &MockLayeredPool::ReleaseOneConnection));
4402 ClientSocketHandle handle;
4403 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154404 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544405 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154406 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204407 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014408 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204409}
4410
[email protected]b021ece62013-06-11 11:06:334411// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154412// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4413// socket instead of a request with the same priority that was issued earlier,
4414// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334415TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334416 CreatePool(1, 1);
4417
4418 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154419 EXPECT_EQ(
4420 OK, StartRequestWithIgnoreLimits(
4421 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334422 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4423
4424 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4425
mmenked3641e12016-01-28 16:06:154426 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4427 "a", MAXIMUM_PRIORITY,
4428 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334429 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4430
mmenked3641e12016-01-28 16:06:154431 // Issue a request that ignores the limits, so a new ConnectJob is
4432 // created.
4433 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4434 "a", MAXIMUM_PRIORITY,
4435 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334436 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4437
robpercival214763f2016-07-01 23:27:014438 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334439 EXPECT_FALSE(request(1)->have_result());
4440}
4441
[email protected]c55fabd2013-11-04 23:26:564442// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154443// issued for a request with RespectLimits::DISABLED is not cancelled when a
4444// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564445TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564446 CreatePool(1, 1);
4447
4448 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154449 EXPECT_EQ(
4450 OK, StartRequestWithIgnoreLimits(
4451 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564452 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4453
4454 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4455
mmenked3641e12016-01-28 16:06:154456 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4457 "a", MAXIMUM_PRIORITY,
4458 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564459 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4460
mmenked3641e12016-01-28 16:06:154461 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4462 // created.
4463 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4464 "a", MAXIMUM_PRIORITY,
4465 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334466 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4467
mmenked3641e12016-01-28 16:06:154468 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334469 // should not be cancelled.
4470 request(1)->handle()->Reset();
4471 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4472
robpercival214763f2016-07-01 23:27:014473 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334474 EXPECT_FALSE(request(1)->have_result());
4475}
4476
[email protected]f6d1d6eb2009-06-24 20:16:094477} // namespace
4478
4479} // namespace net