blob: d09e47058aceeb5d6725cf026c870f8a33c99a19 [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"
Avi Drissman13fc8932015-12-20 04:40:4616#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1318#include "base/memory/weak_ptr.h"
Alexander Timin4f9c35c2018-11-01 20:15:2019#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0326#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4827#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5928#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0629#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3130#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0931#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3532#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0733#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0034#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1935#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0036#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5637#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4638#include "net/log/test_net_log_entry.h"
39#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0940#include "net/socket/client_socket_factory.h"
41#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2642#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2843#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5444#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1745#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4446#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1047#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0148#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0149#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3850#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4851#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0952#include "testing/gtest/include/gtest/gtest.h"
53
robpercival214763f2016-07-01 23:27:0154using net::test::IsError;
55using net::test::IsOk;
56
[email protected]51fdc7c2012-04-10 19:19:4857using ::testing::Invoke;
58using ::testing::Return;
59
[email protected]f6d1d6eb2009-06-24 20:16:0960namespace net {
61
62namespace {
63
[email protected]211d21722009-07-22 15:48:5364const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2065const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0166
[email protected]034df0f32013-01-07 23:17:4867// Make sure |handle| sets load times correctly when it has been assigned a
68// reused socket.
69void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
70 LoadTimingInfo load_timing_info;
71 // Only pass true in as |is_reused|, as in general, HttpStream types should
72 // have stricter concepts of reuse than socket pools.
73 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
74
75 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1976 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4877
[email protected]b258e0792013-01-12 07:11:5978 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
79 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4880}
81
82// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3383// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4884// of a connection where |is_reused| is false may consider the connection
85// reused.
86void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
87 EXPECT_FALSE(handle.is_reused());
88
89 LoadTimingInfo load_timing_info;
90 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
91
92 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1993 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4894
[email protected]b258e0792013-01-12 07:11:5995 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
96 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
97 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4898
99 TestLoadTimingInfoConnectedReused(handle);
100}
101
102// Make sure |handle| sets load times correctly, in the case that it does not
103// currently have a socket.
104void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
105 // Should only be set to true once a socket is assigned, if at all.
106 EXPECT_FALSE(handle.is_reused());
107
108 LoadTimingInfo load_timing_info;
109 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
110
111 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19112 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48113
[email protected]b258e0792013-01-12 07:11:59114 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
115 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48116}
117
[email protected]df4b4ef2010-07-12 18:25:21118class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20119 public:
Chris Watkins7a41d3552017-12-01 02:13:27120 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48121
[email protected]df4b4ef2010-07-12 18:25:21122 private:
123 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27124 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21125};
[email protected]7fc5b09a2010-02-27 00:07:38126typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49127
[email protected]3268023f2011-05-05 00:08:10128class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09129 public:
[email protected]034df0f32013-01-07 23:17:48130 explicit MockClientSocket(net::NetLog* net_log)
131 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28132 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20133 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30134 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09135
[email protected]0dc88b32014-03-26 20:12:28136 // Sets whether the socket has unread data. If true, the next call to Read()
137 // will return 1 byte and IsConnectedAndIdle() will return false.
138 void set_has_unread_data(bool has_unread_data) {
139 has_unread_data_ = has_unread_data;
140 }
141
[email protected]3f55aa12011-12-07 02:03:33142 // Socket implementation.
dchengb03027d2014-10-21 12:00:20143 int Read(IOBuffer* /* buf */,
144 int len,
Brad Lassey3a814172018-04-26 03:30:21145 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28146 if (has_unread_data_ && len > 0) {
147 has_unread_data_ = false;
148 was_used_to_convey_data_ = true;
149 return 1;
150 }
[email protected]e86df8dc2013-03-30 13:18:28151 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33152 }
[email protected]ab838892009-06-30 18:49:05153
[email protected]a2b2cfc2017-12-06 09:06:08154 int Write(
155 IOBuffer* /* buf */,
156 int len,
Brad Lassey3a814172018-04-26 03:30:21157 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08158 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01159 was_used_to_convey_data_ = true;
160 return len;
[email protected]ab838892009-06-30 18:49:05161 }
Avi Drissman13fc8932015-12-20 04:40:46162 int SetReceiveBufferSize(int32_t size) override { return OK; }
163 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05164
[email protected]dbf036f2011-12-06 23:33:24165 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21166 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24167 connected_ = true;
168 return OK;
169 }
[email protected]f6d1d6eb2009-06-24 20:16:09170
dchengb03027d2014-10-21 12:00:20171 void Disconnect() override { connected_ = false; }
172 bool IsConnected() const override { return connected_; }
173 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28174 return connected_ && !has_unread_data_;
175 }
[email protected]0b7648c2009-07-06 20:14:01176
dchengb03027d2014-10-21 12:00:20177 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16178 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09179 }
[email protected]f6d1d6eb2009-06-24 20:16:09180
dchengb03027d2014-10-21 12:00:20181 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35182 return ERR_UNEXPECTED;
183 }
184
tfarina428341112016-09-22 13:38:20185 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02186
dchengb03027d2014-10-21 12:00:20187 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37188 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20189 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
190 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03191 void GetConnectionAttempts(ConnectionAttempts* out) const override {
192 out->clear();
193 }
194 void ClearConnectionAttempts() override {}
195 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49196 int64_t GetTotalReceivedBytes() const override {
197 NOTIMPLEMENTED();
198 return 0;
199 }
Paul Jensen0f49dec2017-12-12 23:39:58200 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45201
[email protected]f6d1d6eb2009-06-24 20:16:09202 private:
203 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28204 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20205 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01206 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09207
[email protected]ab838892009-06-30 18:49:05208 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09209};
210
[email protected]5fc08e32009-07-15 17:09:57211class TestConnectJob;
212
[email protected]f6d1d6eb2009-06-24 20:16:09213class MockClientSocketFactory : public ClientSocketFactory {
214 public:
[email protected]ab838892009-06-30 18:49:05215 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09216
danakj655b66c2016-04-16 00:51:38217 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04218 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41219 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19220 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41221 NOTREACHED();
danakj655b66c2016-04-16 00:51:38222 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41223 }
224
Helen Lid5bb9222018-04-12 15:33:09225 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07226 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38227 std::unique_ptr<
228 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07229 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19230 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09231 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09232 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09233 }
234
danakj655b66c2016-04-16 00:51:38235 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
236 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27237 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21238 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13239 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09240 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38241 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09242 }
Helen Liac3c51e2018-04-24 00:02:13243 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
244 std::unique_ptr<ClientSocketHandle> transport_socket,
245 const std::string& user_agent,
246 const HostPortPair& endpoint,
247 HttpAuthController* http_auth_controller,
248 bool tunnel,
249 bool using_spdy,
250 NextProto negotiated_protocol,
251 bool is_https_proxy,
252 const NetworkTrafficAnnotationTag& traffic_annotation) override {
253 NOTIMPLEMENTED();
254 return nullptr;
255 }
[email protected]f6d1d6eb2009-06-24 20:16:09256
dchengb03027d2014-10-21 12:00:20257 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59258
[email protected]5fc08e32009-07-15 17:09:57259 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55260
[email protected]5fc08e32009-07-15 17:09:57261 void SignalJobs();
262
[email protected]03b7c8c2013-07-20 04:38:55263 void SignalJob(size_t job);
264
265 void SetJobLoadState(size_t job, LoadState load_state);
266
[email protected]f6d1d6eb2009-06-24 20:16:09267 int allocation_count() const { return allocation_count_; }
268
[email protected]f6d1d6eb2009-06-24 20:16:09269 private:
270 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57271 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09272};
273
[email protected]ab838892009-06-30 18:49:05274class TestConnectJob : public ConnectJob {
275 public:
276 enum JobType {
277 kMockJob,
278 kMockFailingJob,
279 kMockPendingJob,
280 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57281 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13282 kMockRecoverableJob,
283 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18284 kMockAdditionalErrorStateJob,
285 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28286 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05287 };
288
[email protected]994d4932010-07-12 17:55:13289 // The kMockPendingJob uses a slight delay before allowing the connect
290 // to complete.
291 static const int kPendingConnectDelay = 2;
292
[email protected]ab838892009-06-30 18:49:05293 TestConnectJob(JobType job_type,
294 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49295 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34296 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05297 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30298 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17299 NetLog* net_log)
tfarina428341112016-09-22 13:38:20300 : ConnectJob(
301 group_name,
302 timeout_duration,
303 request.priority(),
Paul Jensen8d6f87ec2018-01-13 00:46:54304 request.socket_tag(),
tfarina428341112016-09-22 13:38:20305 request.respect_limits(),
306 delegate,
davidbenb7048f092016-11-30 21:20:26307 NetLogWithSource::Make(net_log,
308 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58309 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05310 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18311 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39312 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15313 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05314
[email protected]974ebd62009-08-03 23:14:34315 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13316 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34317 }
318
[email protected]03b7c8c2013-07-20 04:38:55319 void set_load_state(LoadState load_state) { load_state_ = load_state; }
320
321 // From ConnectJob:
322
dchengb03027d2014-10-21 12:00:20323 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21324
dchengb03027d2014-10-21 12:00:20325 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18326 if (store_additional_error_state_) {
327 // Set all of the additional error state fields in some way.
328 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43329 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45330 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43331 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18332 }
333 }
334
[email protected]974ebd62009-08-03 23:14:34335 private:
[email protected]03b7c8c2013-07-20 04:38:55336 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05337
dchengb03027d2014-10-21 12:00:20338 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05339 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21340 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19341 NetLogSource());
danakj655b66c2016-04-16 00:51:38342 SetSocket(std::unique_ptr<StreamSocket>(
343 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05344 switch (job_type_) {
345 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13346 return DoConnect(true /* successful */, false /* sync */,
347 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05348 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13349 return DoConnect(false /* error */, false /* sync */,
350 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05351 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57352 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47353
354 // Depending on execution timings, posting a delayed task can result
355 // in the task getting executed the at the earliest possible
356 // opportunity or only after returning once from the message loop and
357 // then a second call into the message loop. In order to make behavior
358 // more deterministic, we change the default delay to 2ms. This should
359 // always require us to wait for the second call into the message loop.
360 //
361 // N.B. The correct fix for this and similar timing problems is to
362 // abstract time for the purpose of unittests. Unfortunately, we have
363 // a lot of third-party components that directly call the various
364 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45365 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05366 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13367 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45368 weak_factory_.GetWeakPtr(), true /* successful */,
369 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53370 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05371 return ERR_IO_PENDING;
372 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57373 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45374 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05375 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13376 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45377 weak_factory_.GetWeakPtr(), false /* error */,
378 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53379 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05380 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57381 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55382 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57383 client_socket_factory_->WaitForSignal(this);
384 waiting_success_ = true;
385 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13386 case kMockRecoverableJob:
387 return DoConnect(false /* error */, false /* sync */,
388 true /* recoverable */);
389 case kMockPendingRecoverableJob:
390 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45391 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13392 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13393 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45394 weak_factory_.GetWeakPtr(), false /* error */,
395 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53396 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13397 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18398 case kMockAdditionalErrorStateJob:
399 store_additional_error_state_ = true;
400 return DoConnect(false /* error */, false /* sync */,
401 false /* recoverable */);
402 case kMockPendingAdditionalErrorStateJob:
403 set_load_state(LOAD_STATE_CONNECTING);
404 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45405 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18406 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13407 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45408 weak_factory_.GetWeakPtr(), false /* error */,
409 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53410 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18411 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28412 case kMockUnreadDataJob: {
413 int ret = DoConnect(true /* successful */, false /* sync */,
414 false /* recoverable */);
415 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
416 return ret;
417 }
[email protected]ab838892009-06-30 18:49:05418 default:
419 NOTREACHED();
danakj655b66c2016-04-16 00:51:38420 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05421 return ERR_FAILED;
422 }
423 }
424
[email protected]e772db3f2010-07-12 18:11:13425 int DoConnect(bool succeed, bool was_async, bool recoverable) {
426 int result = OK;
[email protected]ab838892009-06-30 18:49:05427 if (succeed) {
Bence Békybdbb0e72018-08-07 21:42:59428 socket()->Connect(CompletionOnceCallback());
[email protected]e772db3f2010-07-12 18:11:13429 } else if (recoverable) {
430 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40431 } else {
[email protected]e772db3f2010-07-12 18:11:13432 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38433 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05434 }
[email protected]2ab05b52009-07-01 23:57:58435
436 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30437 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05438 return result;
439 }
440
[email protected]5fc08e32009-07-15 17:09:57441 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05442 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57443 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21444 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18445 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05446
[email protected]d5492c52013-11-10 20:44:39447 base::WeakPtrFactory<TestConnectJob> weak_factory_;
448
[email protected]ab838892009-06-30 18:49:05449 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
450};
451
[email protected]d80a4322009-08-14 07:07:49452class TestConnectJobFactory
453 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05454 public:
[email protected]034df0f32013-01-07 23:17:48455 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
456 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05457 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48458 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48459 client_socket_factory_(client_socket_factory),
460 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33461 }
[email protected]ab838892009-06-30 18:49:05462
Chris Watkins7a41d3552017-12-01 02:13:27463 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05464
465 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
466
[email protected]51fdc7c2012-04-10 19:19:48467 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
468 job_types_ = job_types;
469 CHECK(!job_types_->empty());
470 }
471
[email protected]974ebd62009-08-03 23:14:34472 void set_timeout_duration(base::TimeDelta timeout_duration) {
473 timeout_duration_ = timeout_duration;
474 }
475
[email protected]3f55aa12011-12-07 02:03:33476 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55477
danakj655b66c2016-04-16 00:51:38478 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05479 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49480 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13481 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48482 EXPECT_TRUE(!job_types_ || !job_types_->empty());
483 TestConnectJob::JobType job_type = job_type_;
484 if (job_types_ && !job_types_->empty()) {
485 job_type = job_types_->front();
486 job_types_->pop_front();
487 }
danakj655b66c2016-04-16 00:51:38488 return std::unique_ptr<ConnectJob>(
489 new TestConnectJob(job_type, group_name, request, timeout_duration_,
490 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05491 }
492
dchengb03027d2014-10-21 12:00:20493 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26494 return timeout_duration_;
495 }
496
[email protected]ab838892009-06-30 18:49:05497 private:
498 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48499 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34500 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57501 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48502 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05503
504 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
505};
506
507class TestClientSocketPool : public ClientSocketPool {
508 public:
[email protected]12322e7e2013-08-15 17:49:26509 typedef TestSocketParams SocketParams;
510
[email protected]ab838892009-06-30 18:49:05511 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53512 int max_sockets,
[email protected]ab838892009-06-30 18:49:05513 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16514 base::TimeDelta unused_idle_socket_timeout,
515 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49516 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41517 : base_(NULL,
518 max_sockets,
519 max_sockets_per_group,
520 unused_idle_socket_timeout,
521 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38522 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05523
Chris Watkins7a41d3552017-12-01 02:13:27524 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13525
dchengb03027d2014-10-21 12:00:20526 int RequestSocket(const std::string& group_name,
527 const void* params,
ttuttle859dc7a2015-04-23 19:42:29528 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54529 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15530 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20531 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03532 CompletionOnceCallback callback,
tfarina428341112016-09-22 13:38:20533 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21534 const scoped_refptr<TestSocketParams>* casted_socket_params =
535 static_cast<const scoped_refptr<TestSocketParams>*>(params);
536 return base_.RequestSocket(group_name, *casted_socket_params, priority,
Bence Béky5a8662b2018-07-03 13:04:03537 socket_tag, respect_limits, handle,
538 std::move(callback), net_log);
[email protected]ab838892009-06-30 18:49:05539 }
540
dchengb03027d2014-10-21 12:00:20541 void RequestSockets(const std::string& group_name,
542 const void* params,
543 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57544 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03545 const scoped_refptr<TestSocketParams>* casted_params =
546 static_cast<const scoped_refptr<TestSocketParams>*>(params);
547
Charlie Harrison55ce6082018-05-14 02:25:57548 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03549 }
550
rdsmith29dbad12017-02-17 02:22:18551 void SetPriority(const std::string& group_name,
552 ClientSocketHandle* handle,
553 RequestPriority priority) override {
554 base_.SetPriority(group_name, handle, priority);
555 }
556
dchengb03027d2014-10-21 12:00:20557 void CancelRequest(const std::string& group_name,
558 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49559 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05560 }
561
dchengb03027d2014-10-21 12:00:20562 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38563 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20564 int id) override {
dchengc7eeda422015-12-26 03:56:48565 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24566 }
567
dchengb03027d2014-10-21 12:00:20568 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05569
dchengb03027d2014-10-21 12:00:20570 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48571
dchengb03027d2014-10-21 12:00:20572 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05573
xunjieli92feb332017-03-03 17:19:23574 void CloseIdleSocketsInGroup(const std::string& group_name) override {
575 base_.CloseIdleSocketsInGroup(group_name);
576 }
577
dchengb03027d2014-10-21 12:00:20578 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05579
dchengb03027d2014-10-21 12:00:20580 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49581 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05582 }
583
dchengb03027d2014-10-21 12:00:20584 LoadState GetLoadState(const std::string& group_name,
585 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49586 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05587 }
588
dchengb03027d2014-10-21 12:00:20589 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52590 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48591 }
592
dchengb03027d2014-10-21 12:00:20593 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52594 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48595 }
596
danakj655b66c2016-04-16 00:51:38597 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59598 const std::string& name,
599 const std::string& type,
mostynbba063d6032014-10-09 11:01:13600 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27601 return base_.GetInfoAsValue(name, type);
602 }
603
dchengb03027d2014-10-21 12:00:20604 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26605 return base_.ConnectionTimeout();
606 }
607
[email protected]d80a4322009-08-14 07:07:49608 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20609
[email protected]8159a1c2012-06-07 00:00:10610 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
611 return base_.NumUnassignedConnectJobsInGroup(group_name);
612 }
613
[email protected]974ebd62009-08-03 23:14:34614 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49615 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34616 }
617
[email protected]2c2bef152010-10-13 00:55:03618 int NumActiveSocketsInGroup(const std::string& group_name) const {
619 return base_.NumActiveSocketsInGroup(group_name);
620 }
621
[email protected]2abfe90a2010-08-25 17:49:51622 bool HasGroup(const std::string& group_name) const {
623 return base_.HasGroup(group_name);
624 }
625
[email protected]9bf28db2009-08-29 01:35:16626 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
627
[email protected]06d94042010-08-25 01:45:22628 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54629
[email protected]043b68c82013-08-22 23:41:52630 bool CloseOneIdleConnectionInHigherLayeredPool() {
631 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48632 }
633
[email protected]ab838892009-06-30 18:49:05634 private:
[email protected]d80a4322009-08-14 07:07:49635 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05636
637 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
638};
639
[email protected]a937a06d2009-08-19 21:19:24640} // namespace
641
[email protected]a937a06d2009-08-19 21:19:24642namespace {
643
[email protected]5fc08e32009-07-15 17:09:57644void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26645 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57646 (*it)->Signal();
647 }
648 waiting_jobs_.clear();
649}
650
[email protected]03b7c8c2013-07-20 04:38:55651void MockClientSocketFactory::SignalJob(size_t job) {
652 ASSERT_LT(job, waiting_jobs_.size());
653 waiting_jobs_[job]->Signal();
654 waiting_jobs_.erase(waiting_jobs_.begin() + job);
655}
656
657void MockClientSocketFactory::SetJobLoadState(size_t job,
658 LoadState load_state) {
659 ASSERT_LT(job, waiting_jobs_.size());
660 waiting_jobs_[job]->set_load_state(load_state);
661}
662
[email protected]974ebd62009-08-03 23:14:34663class TestConnectJobDelegate : public ConnectJob::Delegate {
664 public:
Weza03bae02018-07-13 17:17:33665 TestConnectJobDelegate() : have_result_(false), result_(OK) {}
Chris Watkins7a41d3552017-12-01 02:13:27666 ~TestConnectJobDelegate() override = default;
[email protected]974ebd62009-08-03 23:14:34667
dchengb03027d2014-10-21 12:00:20668 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34669 result_ = result;
danakj655b66c2016-04-16 00:51:38670 std::unique_ptr<ConnectJob> owned_job(job);
671 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07672 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44673 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34674 have_result_ = true;
Weza03bae02018-07-13 17:17:33675 if (quit_wait_on_result_)
676 std::move(quit_wait_on_result_).Run();
[email protected]974ebd62009-08-03 23:14:34677 }
678
679 int WaitForResult() {
Weza03bae02018-07-13 17:17:33680 DCHECK(!quit_wait_on_result_);
[email protected]974ebd62009-08-03 23:14:34681 while (!have_result_) {
Weza03bae02018-07-13 17:17:33682 base::RunLoop run_loop;
683 quit_wait_on_result_ = run_loop.QuitClosure();
684 run_loop.Run();
[email protected]974ebd62009-08-03 23:14:34685 }
686 have_result_ = false; // auto-reset for next callback
687 return result_;
688 }
689
690 private:
691 bool have_result_;
Weza03bae02018-07-13 17:17:33692 base::OnceClosure quit_wait_on_result_;
[email protected]974ebd62009-08-03 23:14:34693 int result_;
694};
695
Bence Béky98447b12018-05-08 03:14:01696class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09697 protected:
mmenked3641e12016-01-28 16:06:15698 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54699 connect_backup_jobs_enabled_ =
700 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
701 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
702 }
[email protected]2431756e2010-09-29 20:26:13703
dcheng67be2b1f2014-10-27 21:47:29704 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54705 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
706 connect_backup_jobs_enabled_);
707 }
[email protected]c9d6a1d2009-07-14 16:15:20708
[email protected]211d21722009-07-22 15:48:53709 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16710 CreatePoolWithIdleTimeouts(
711 max_sockets,
712 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30713 ClientSocketPool::unused_idle_socket_timeout(),
714 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16715 }
716
717 void CreatePoolWithIdleTimeouts(
718 int max_sockets, int max_sockets_per_group,
719 base::TimeDelta unused_idle_socket_timeout,
720 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20721 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48722 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
723 &net_log_);
[email protected]2431756e2010-09-29 20:26:13724 pool_.reset(new TestClientSocketPool(max_sockets,
725 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13726 unused_idle_socket_timeout,
727 used_idle_socket_timeout,
728 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20729 }
[email protected]f6d1d6eb2009-06-24 20:16:09730
mmenked3641e12016-01-28 16:06:15731 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33732 const std::string& group_name,
733 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15734 ClientSocketPool::RespectLimits respect_limits) {
735 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
736 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33737 }
738
739 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15740 return StartRequestWithIgnoreLimits(
741 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09742 }
743
[email protected]2431756e2010-09-29 20:26:13744 int GetOrderOfRequest(size_t index) const {
745 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09746 }
747
[email protected]2431756e2010-09-29 20:26:13748 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
749 return test_base_.ReleaseOneConnection(keep_alive);
750 }
751
752 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
753 test_base_.ReleaseAllConnections(keep_alive);
754 }
755
756 TestSocketRequest* request(int i) { return test_base_.request(i); }
757 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38758 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42759 return test_base_.requests();
760 }
rdsmith29dbad12017-02-17 02:22:18761 // Only counts the requests that get sockets asynchronously;
762 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13763 size_t completion_count() const { return test_base_.completion_count(); }
764
vishal.b62985ca92015-04-17 08:45:51765 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54766 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09767 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04768 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21769 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38770 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13771 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09772};
773
[email protected]974ebd62009-08-03 23:14:34774// Even though a timeout is specified, it doesn't time out on a synchronous
775// completion.
776TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
777 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06778 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49779 TestClientSocketPoolBase::Request request(
Bence Békybdbb0e72018-08-07 21:42:59780 &ignored, CompletionOnceCallback(), DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15781 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20782 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
783 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38784 std::unique_ptr<TestConnectJob> job(
785 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
786 base::TimeDelta::FromMicroseconds(1), &delegate,
787 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01788 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34789}
790
791TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
792 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06793 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51794 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53795
[email protected]d80a4322009-08-14 07:07:49796 TestClientSocketPoolBase::Request request(
Bence Békybdbb0e72018-08-07 21:42:59797 &ignored, CompletionOnceCallback(), DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15798 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20799 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
800 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34801 // Deleted by TestConnectJobDelegate.
802 TestConnectJob* job =
803 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12804 "a",
[email protected]974ebd62009-08-03 23:14:34805 request,
806 base::TimeDelta::FromMicroseconds(1),
807 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30808 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17809 &log);
robpercival214763f2016-07-01 23:27:01810 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00811 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01812 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30813
mmenke43758e62015-05-04 21:09:46814 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40815 log.GetEntries(&entries);
816
817 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00818 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
819 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46820 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00821 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
822 EXPECT_TRUE(LogContainsEvent(entries, 2,
823 NetLogEventType::CONNECT_JOB_SET_SOCKET,
824 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46825 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00826 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
827 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46828 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00829 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
830 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
831 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34832}
833
[email protected]5fc08e32009-07-15 17:09:57834TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53835 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20836
[email protected]6ecf2b92011-12-15 01:14:52837 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06838 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51839 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48840 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53841
Paul Jensen8d6f87ec2018-01-13 00:46:54842 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15843 ClientSocketPool::RespectLimits::ENABLED,
844 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09845 EXPECT_TRUE(handle.is_initialized());
846 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48847 TestLoadTimingInfoConnectedNotReused(handle);
848
[email protected]f6d1d6eb2009-06-24 20:16:09849 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48850 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30851
mmenke43758e62015-05-04 21:09:46852 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40853 log.GetEntries(&entries);
854
855 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00856 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53857 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00858 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
859 NetLogEventPhase::NONE));
860 EXPECT_TRUE(LogContainsEvent(entries, 2,
861 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
862 NetLogEventPhase::NONE));
863 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09864}
865
[email protected]ab838892009-06-30 18:49:05866TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20868
[email protected]ab838892009-06-30 18:49:05869 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51870 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53871
[email protected]2431756e2010-09-29 20:26:13872 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52873 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18874 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13875 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43876 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45877 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13878 handle.set_ssl_error_response_info(info);
879 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:54880 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15881 ClientSocketPool::RespectLimits::ENABLED,
882 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13883 EXPECT_FALSE(handle.socket());
884 EXPECT_FALSE(handle.is_ssl_error());
885 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48886 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30887
mmenke43758e62015-05-04 21:09:46888 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40889 log.GetEntries(&entries);
890
891 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00892 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17893 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00894 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
895 NetLogEventPhase::NONE));
896 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09897}
898
[email protected]211d21722009-07-22 15:48:53899TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
900 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
901
[email protected]9e743cd2010-03-16 07:03:53902 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30903
robpercival214763f2016-07-01 23:27:01904 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
905 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
906 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
907 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53908
[email protected]2431756e2010-09-29 20:26:13909 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53910 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13911 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53912
robpercival214763f2016-07-01 23:27:01913 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
914 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
915 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53916
[email protected]2431756e2010-09-29 20:26:13917 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53918
[email protected]2431756e2010-09-29 20:26:13919 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53920 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13921 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53922
923 EXPECT_EQ(1, GetOrderOfRequest(1));
924 EXPECT_EQ(2, GetOrderOfRequest(2));
925 EXPECT_EQ(3, GetOrderOfRequest(3));
926 EXPECT_EQ(4, GetOrderOfRequest(4));
927 EXPECT_EQ(5, GetOrderOfRequest(5));
928 EXPECT_EQ(6, GetOrderOfRequest(6));
929 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17930
931 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13932 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53933}
934
935TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
936 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
937
[email protected]9e743cd2010-03-16 07:03:53938 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30939
[email protected]211d21722009-07-22 15:48:53940 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01941 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
942 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
943 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
944 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53945
[email protected]2431756e2010-09-29 20:26:13946 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53947 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13948 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53949
950 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01951 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53952
[email protected]2431756e2010-09-29 20:26:13953 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53956 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53958
959 EXPECT_EQ(1, GetOrderOfRequest(1));
960 EXPECT_EQ(2, GetOrderOfRequest(2));
961 EXPECT_EQ(3, GetOrderOfRequest(3));
962 EXPECT_EQ(4, GetOrderOfRequest(4));
963 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17964
965 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13966 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53967}
968
969TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
970 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
971
robpercival214763f2016-07-01 23:27:01972 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
973 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
974 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
975 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53976
[email protected]2431756e2010-09-29 20:26:13977 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53978 client_socket_factory_.allocation_count());
979
robpercival214763f2016-07-01 23:27:01980 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
981 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
982 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53983
[email protected]2431756e2010-09-29 20:26:13984 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53985
[email protected]2431756e2010-09-29 20:26:13986 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53987
988 // First 4 requests don't have to wait, and finish in order.
989 EXPECT_EQ(1, GetOrderOfRequest(1));
990 EXPECT_EQ(2, GetOrderOfRequest(2));
991 EXPECT_EQ(3, GetOrderOfRequest(3));
992 EXPECT_EQ(4, GetOrderOfRequest(4));
993
[email protected]ac790b42009-12-02 04:31:31994 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
995 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53996 EXPECT_EQ(7, GetOrderOfRequest(5));
997 EXPECT_EQ(6, GetOrderOfRequest(6));
998 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17999
1000 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131001 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531002}
1003
rdsmith29dbad12017-02-17 02:22:181004// Test reprioritizing a request before completion doesn't interfere with
1005// its completion.
1006TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1007 CreatePool(kDefaultMaxSockets, 1);
1008
1009 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1010 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1011 EXPECT_TRUE(request(0)->handle()->socket());
1012 EXPECT_FALSE(request(1)->handle()->socket());
1013
1014 request(1)->handle()->SetPriority(MEDIUM);
1015
1016 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1017
1018 EXPECT_TRUE(request(1)->handle()->socket());
1019}
1020
1021// Reprioritize a request up past another one and make sure that changes the
1022// completion order.
1023TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1024 CreatePool(kDefaultMaxSockets, 1);
1025
1026 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1027 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1028 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1029 EXPECT_TRUE(request(0)->handle()->socket());
1030 EXPECT_FALSE(request(1)->handle()->socket());
1031 EXPECT_FALSE(request(2)->handle()->socket());
1032
1033 request(2)->handle()->SetPriority(HIGHEST);
1034
1035 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1036
1037 EXPECT_EQ(1, GetOrderOfRequest(1));
1038 EXPECT_EQ(3, GetOrderOfRequest(2));
1039 EXPECT_EQ(2, GetOrderOfRequest(3));
1040}
1041
1042// Reprioritize a request without changing relative priorities and check
1043// that the order doesn't change.
1044TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1045 CreatePool(kDefaultMaxSockets, 1);
1046
1047 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1048 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1049 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1050 EXPECT_TRUE(request(0)->handle()->socket());
1051 EXPECT_FALSE(request(1)->handle()->socket());
1052 EXPECT_FALSE(request(2)->handle()->socket());
1053
1054 request(2)->handle()->SetPriority(MEDIUM);
1055
1056 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1057
1058 EXPECT_EQ(1, GetOrderOfRequest(1));
1059 EXPECT_EQ(2, GetOrderOfRequest(2));
1060 EXPECT_EQ(3, GetOrderOfRequest(3));
1061}
1062
1063// Reprioritize a request past down another one and make sure that changes the
1064// completion order.
1065TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1066 CreatePool(kDefaultMaxSockets, 1);
1067
1068 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1069 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1070 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1071 EXPECT_TRUE(request(0)->handle()->socket());
1072 EXPECT_FALSE(request(1)->handle()->socket());
1073 EXPECT_FALSE(request(2)->handle()->socket());
1074
1075 request(1)->handle()->SetPriority(LOW);
1076
1077 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1078
1079 EXPECT_EQ(1, GetOrderOfRequest(1));
1080 EXPECT_EQ(3, GetOrderOfRequest(2));
1081 EXPECT_EQ(2, GetOrderOfRequest(3));
1082}
1083
1084// Reprioritize a request to the same level as another and confirm it is
1085// put after the old request.
1086TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1087 CreatePool(kDefaultMaxSockets, 1);
1088
1089 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1090 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1091 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1092 EXPECT_TRUE(request(0)->handle()->socket());
1093 EXPECT_FALSE(request(1)->handle()->socket());
1094 EXPECT_FALSE(request(2)->handle()->socket());
1095
1096 request(1)->handle()->SetPriority(MEDIUM);
1097
1098 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1099
1100 EXPECT_EQ(1, GetOrderOfRequest(1));
1101 EXPECT_EQ(3, GetOrderOfRequest(2));
1102 EXPECT_EQ(2, GetOrderOfRequest(3));
1103}
1104
[email protected]211d21722009-07-22 15:48:531105TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1106 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1107
robpercival214763f2016-07-01 23:27:011108 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1109 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1110 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1111 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531112
[email protected]2431756e2010-09-29 20:26:131113 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531114 client_socket_factory_.allocation_count());
1115
robpercival214763f2016-07-01 23:27:011116 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1117 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1118 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531119
[email protected]2431756e2010-09-29 20:26:131120 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531121
[email protected]2431756e2010-09-29 20:26:131122 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531123 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131124 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531125
1126 // First 4 requests don't have to wait, and finish in order.
1127 EXPECT_EQ(1, GetOrderOfRequest(1));
1128 EXPECT_EQ(2, GetOrderOfRequest(2));
1129 EXPECT_EQ(3, GetOrderOfRequest(3));
1130 EXPECT_EQ(4, GetOrderOfRequest(4));
1131
1132 // Request ("b", 7) has the highest priority, but we can't make new socket for
1133 // group "b", because it has reached the per-group limit. Then we make
1134 // socket for ("c", 6), because it has higher priority than ("a", 4),
1135 // and we still can't make a socket for group "b".
1136 EXPECT_EQ(5, GetOrderOfRequest(5));
1137 EXPECT_EQ(6, GetOrderOfRequest(6));
1138 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171139
1140 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131141 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531142}
1143
1144// Make sure that we count connecting sockets against the total limit.
1145TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1146 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1147
robpercival214763f2016-07-01 23:27:011148 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1149 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1150 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531151
1152 // Create one asynchronous request.
1153 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011154 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531155
[email protected]6b175382009-10-13 06:47:471156 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1157 // actually become pending until 2ms after they have been created. In order
1158 // to flush all tasks, we need to wait so that we know there are no
1159 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001160 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281161 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471162
[email protected]211d21722009-07-22 15:48:531163 // The next synchronous request should wait for its turn.
1164 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011165 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531166
[email protected]2431756e2010-09-29 20:26:131167 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531168
[email protected]2431756e2010-09-29 20:26:131169 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531170 client_socket_factory_.allocation_count());
1171
1172 EXPECT_EQ(1, GetOrderOfRequest(1));
1173 EXPECT_EQ(2, GetOrderOfRequest(2));
1174 EXPECT_EQ(3, GetOrderOfRequest(3));
1175 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171176 EXPECT_EQ(5, GetOrderOfRequest(5));
1177
1178 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131179 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531180}
1181
[email protected]6427fe22010-04-16 22:27:411182TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1183 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1184 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1185
robpercival214763f2016-07-01 23:27:011186 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1187 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1188 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1189 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411190
1191 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1192
1193 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1194
robpercival214763f2016-07-01 23:27:011195 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1196 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411197
1198 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1199
[email protected]2431756e2010-09-29 20:26:131200 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411201 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131202 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411203 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131204 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1205 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411206 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1207}
1208
[email protected]d7027bb2010-05-10 18:58:541209TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1210 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1211 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1212
1213 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521214 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131215 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541216 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151217 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201218 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541219
1220 ClientSocketHandle handles[4];
1221 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521222 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201223 EXPECT_EQ(
1224 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541225 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201226 ClientSocketPool::RespectLimits::ENABLED,
1227 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541228 }
1229
1230 // One will be stalled, cancel all the handles now.
1231 // This should hit the OnAvailableSocketSlot() code where we previously had
1232 // stalled groups, but no longer have any.
1233 for (size_t i = 0; i < arraysize(handles); ++i)
1234 handles[i].Reset();
1235}
1236
[email protected]eb5a99382010-07-11 03:18:261237TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541238 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1239 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1240
[email protected]eb5a99382010-07-11 03:18:261241 {
1242 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521243 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261244 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:541245 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), params_,
1246 DEFAULT_PRIORITY, SocketTag(),
1247 ClientSocketPool::RespectLimits::ENABLED,
1248 callbacks[i].callback(), pool_.get(),
1249 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261250 }
1251
1252 // Force a stalled group.
1253 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521254 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201255 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541256 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201257 ClientSocketPool::RespectLimits::ENABLED,
1258 callback.callback(), pool_.get(),
1259 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261260
1261 // Cancel the stalled request.
1262 stalled_handle.Reset();
1263
1264 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1265 EXPECT_EQ(0, pool_->IdleSocketCount());
1266
1267 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541268 }
1269
[email protected]43a21b82010-06-10 21:30:541270 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1271 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261272}
[email protected]43a21b82010-06-10 21:30:541273
[email protected]eb5a99382010-07-11 03:18:261274TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1275 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1276 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1277
1278 {
1279 ClientSocketHandle handles[kDefaultMaxSockets];
1280 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521281 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201282 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541283 handles[i].Init(
1284 base::IntToString(i), params_, DEFAULT_PRIORITY,
1285 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1286 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261287 }
1288
1289 // Force a stalled group.
1290 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1291 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521292 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201293 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541294 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201295 ClientSocketPool::RespectLimits::ENABLED,
1296 callback.callback(), pool_.get(),
1297 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261298
1299 // Since it is stalled, it should have no connect jobs.
1300 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101301 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261302
1303 // Cancel the stalled request.
1304 handles[0].Reset();
1305
[email protected]eb5a99382010-07-11 03:18:261306 // Now we should have a connect job.
1307 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101308 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261309
1310 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011311 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261312
1313 EXPECT_EQ(kDefaultMaxSockets + 1,
1314 client_socket_factory_.allocation_count());
1315 EXPECT_EQ(0, pool_->IdleSocketCount());
1316 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101317 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261318
1319 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541320 }
1321
[email protected]eb5a99382010-07-11 03:18:261322 EXPECT_EQ(1, pool_->IdleSocketCount());
1323}
[email protected]43a21b82010-06-10 21:30:541324
[email protected]eb5a99382010-07-11 03:18:261325TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1326 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1327 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541328
[email protected]eb5a99382010-07-11 03:18:261329 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521330 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261331 {
[email protected]51fdc7c2012-04-10 19:19:481332 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261333 ClientSocketHandle handles[kDefaultMaxSockets];
1334 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521335 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201336 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541337 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201338 ClientSocketPool::RespectLimits::ENABLED,
1339 callback.callback(), pool_.get(),
1340 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261341 }
1342
1343 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1344 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481345 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261346
1347 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201348 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541349 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201350 ClientSocketPool::RespectLimits::ENABLED,
1351 callback.callback(), pool_.get(),
1352 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481353 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261354
1355 // Dropping out of scope will close all handles and return them to idle.
1356 }
[email protected]43a21b82010-06-10 21:30:541357
1358 // But if we wait for it, the released idle sockets will be closed in
1359 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011360 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261361
1362 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1363 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541364}
1365
1366// Regression test for http://crbug.com/40952.
1367TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1368 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221369 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541370 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1371
1372 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1373 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521374 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201375 EXPECT_EQ(
1376 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541377 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201378 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541379 }
1380
1381 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281382 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541383
1384 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1385 // reuse a socket.
1386 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1387 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521388 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541389
1390 // "0" is special here, since it should be the first entry in the sorted map,
1391 // which is the one which we would close an idle socket for. We shouldn't
1392 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201393 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:541394 handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201395 ClientSocketPool::RespectLimits::ENABLED,
1396 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541397
1398 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1399 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1400}
1401
[email protected]ab838892009-06-30 18:49:051402TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531403 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091404
robpercival214763f2016-07-01 23:27:011405 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1406 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1407 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1408 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1409 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1410 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1411 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1412 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091413
[email protected]2431756e2010-09-29 20:26:131414 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201415 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1416 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131417 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1418 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091419
[email protected]c9d6a1d2009-07-14 16:15:201420 EXPECT_EQ(1, GetOrderOfRequest(1));
1421 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031422 EXPECT_EQ(8, GetOrderOfRequest(3));
1423 EXPECT_EQ(6, GetOrderOfRequest(4));
1424 EXPECT_EQ(4, GetOrderOfRequest(5));
1425 EXPECT_EQ(3, GetOrderOfRequest(6));
1426 EXPECT_EQ(5, GetOrderOfRequest(7));
1427 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171428
1429 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131430 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091431}
1432
[email protected]ab838892009-06-30 18:49:051433TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531434 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091435
robpercival214763f2016-07-01 23:27:011436 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1437 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1438 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1439 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1440 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1441 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1442 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091443
[email protected]2431756e2010-09-29 20:26:131444 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091445
[email protected]2431756e2010-09-29 20:26:131446 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011447 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201448
[email protected]2431756e2010-09-29 20:26:131449 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201450 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131451 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1452 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091453}
1454
1455// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051456// The pending connect job will be cancelled and should not call back into
1457// ClientSocketPoolBase.
1458TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531459 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201460
[email protected]ab838892009-06-30 18:49:051461 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131462 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521463 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151464 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541465 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151466 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201467 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131468 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091469}
1470
[email protected]ab838892009-06-30 18:49:051471TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531472 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201473
[email protected]ab838892009-06-30 18:49:051474 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061475 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521476 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091477
mmenked3641e12016-01-28 16:06:151478 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541479 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151480 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201481 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091482
1483 handle.Reset();
1484
[email protected]6ecf2b92011-12-15 01:14:521485 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131486 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541487 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151488 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201489 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091490
robpercival214763f2016-07-01 23:27:011491 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091492 EXPECT_FALSE(callback.have_result());
1493
1494 handle.Reset();
1495}
1496
[email protected]ab838892009-06-30 18:49:051497TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531498 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091499
robpercival214763f2016-07-01 23:27:011500 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1501 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1502 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1503 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1504 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1505 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1506 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091507
1508 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201509 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131510 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1511 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091512
[email protected]2431756e2010-09-29 20:26:131513 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091514
[email protected]c9d6a1d2009-07-14 16:15:201515 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1516 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131517 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1518 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091519
[email protected]c9d6a1d2009-07-14 16:15:201520 EXPECT_EQ(1, GetOrderOfRequest(1));
1521 EXPECT_EQ(2, GetOrderOfRequest(2));
1522 EXPECT_EQ(5, GetOrderOfRequest(3));
1523 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131524 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1525 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201526 EXPECT_EQ(4, GetOrderOfRequest(6));
1527 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171528
1529 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131530 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091531}
1532
mmenke33d24423d2015-05-19 19:41:091533// Function to be used as a callback on socket request completion. It first
1534// disconnects the successfully connected socket from the first request, and
1535// then reuses the ClientSocketHandle to request another socket.
1536//
1537// |nested_callback| is called with the result of the second socket request.
1538void RequestSocketOnComplete(ClientSocketHandle* handle,
1539 TestClientSocketPool* pool,
1540 TestConnectJobFactory* test_connect_job_factory,
1541 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411542 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091543 int first_request_result) {
robpercival214763f2016-07-01 23:27:011544 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091545
1546 test_connect_job_factory->set_job_type(next_job_type);
1547
1548 // Don't allow reuse of the socket. Disconnect it and then release it.
1549 if (handle->socket())
1550 handle->socket()->Disconnect();
1551 handle->Reset();
1552
mmenked3641e12016-01-28 16:06:151553 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091554 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541555 int rv = handle->Init("a", params, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151556 ClientSocketPool::RespectLimits::ENABLED,
Bence Békya4a50932018-08-10 13:39:411557 nested_callback->callback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091558 if (rv != ERR_IO_PENDING) {
1559 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411560 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091561 } else {
1562 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521563 }
mmenke33d24423d2015-05-19 19:41:091564}
[email protected]f6d1d6eb2009-06-24 20:16:091565
mmenke33d24423d2015-05-19 19:41:091566// Tests the case where a second socket is requested in a completion callback,
1567// and the second socket connects asynchronously. Reuses the same
1568// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581569TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531570 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201571
[email protected]0b7648c2009-07-06 20:14:011572 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061573 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091574 TestCompletionCallback second_result_callback;
1575 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541576 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1577 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091578 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1579 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411580 &second_result_callback),
tfarina428341112016-09-22 13:38:201581 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011582 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091583
robpercival214763f2016-07-01 23:27:011584 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581585}
[email protected]f6d1d6eb2009-06-24 20:16:091586
mmenke33d24423d2015-05-19 19:41:091587// Tests the case where a second socket is requested in a completion callback,
1588// and the second socket connects synchronously. Reuses the same
1589// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581590TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531591 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201592
[email protected]0b7648c2009-07-06 20:14:011593 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061594 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091595 TestCompletionCallback second_result_callback;
1596 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541597 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1598 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091599 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1600 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411601 &second_result_callback),
tfarina428341112016-09-22 13:38:201602 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011603 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581604
robpercival214763f2016-07-01 23:27:011605 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091606}
1607
1608// Make sure that pending requests get serviced after active requests get
1609// cancelled.
[email protected]ab838892009-06-30 18:49:051610TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531611 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201612
[email protected]0b7648c2009-07-06 20:14:011613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091614
robpercival214763f2016-07-01 23:27:011615 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1616 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1617 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1618 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1619 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1620 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1621 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091622
[email protected]c9d6a1d2009-07-14 16:15:201623 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1624 // Let's cancel them.
1625 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131626 ASSERT_FALSE(request(i)->handle()->is_initialized());
1627 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091628 }
1629
[email protected]f6d1d6eb2009-06-24 20:16:091630 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131631 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011632 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131633 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091634 }
1635
[email protected]2431756e2010-09-29 20:26:131636 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1637 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091638}
1639
1640// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051641TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531642 const size_t kMaxSockets = 5;
1643 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201644
[email protected]0b7648c2009-07-06 20:14:011645 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091646
[email protected]211d21722009-07-22 15:48:531647 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1648 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091649
1650 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531651 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011652 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091653
[email protected]211d21722009-07-22 15:48:531654 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011655 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091656}
1657
mmenke9d72fe42017-05-18 22:36:071658// Make sure that pending requests that complete synchronously get serviced
1659// after active requests fail. See https://crbug.com/723748
1660TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1661 const size_t kNumberOfRequests = 10;
1662 const size_t kMaxSockets = 1;
1663 CreatePool(kMaxSockets, kMaxSockets);
1664
1665 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1666
1667 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1668
1669 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1670
1671 // Queue up all the other requests
1672 for (size_t i = 1; i < kNumberOfRequests; ++i)
1673 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1674
1675 // Make sure all requests fail, instead of hanging.
1676 for (size_t i = 0; i < kNumberOfRequests; ++i)
1677 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1678}
1679
[email protected]5fc08e32009-07-15 17:09:571680TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531681 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571682
1683 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1684
[email protected]2431756e2010-09-29 20:26:131685 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521686 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541687 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151688 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201689 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011690 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571691
1692 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131693 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571694
Paul Jensen8d6f87ec2018-01-13 00:46:541695 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151696 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201697 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011698 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1699 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571700
[email protected]2431756e2010-09-29 20:26:131701 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481702 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571703 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1704}
1705
xunjieli26619e72016-11-23 19:39:551706TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551707 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1708 ClientSocketHandle handle;
1709 TestCompletionCallback callback;
1710 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541711 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551712 ClientSocketPool::RespectLimits::ENABLED,
1713 callback.callback(), pool_.get(), log.bound());
1714 EXPECT_THAT(rv, IsOk());
1715 handle.Reset();
1716 EXPECT_EQ(1, pool_->IdleSocketCount());
1717 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551718}
1719
xunjieli92feb332017-03-03 17:19:231720TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231721 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1722 TestCompletionCallback callback;
1723 BoundTestNetLog log;
1724 ClientSocketHandle handle1;
Paul Jensen8d6f87ec2018-01-13 00:46:541725 int rv = handle1.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231726 ClientSocketPool::RespectLimits::ENABLED,
1727 callback.callback(), pool_.get(), log.bound());
1728 EXPECT_THAT(rv, IsOk());
1729 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541730 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231731 ClientSocketPool::RespectLimits::ENABLED,
1732 callback.callback(), pool_.get(), log.bound());
1733 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541734 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231735 ClientSocketPool::RespectLimits::ENABLED,
1736 callback.callback(), pool_.get(), log.bound());
1737 EXPECT_THAT(rv, IsOk());
1738 handle1.Reset();
1739 handle2.Reset();
1740 handle3.Reset();
1741 EXPECT_EQ(3, pool_->IdleSocketCount());
1742 pool_->CloseIdleSocketsInGroup("a");
1743 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231744}
1745
xunjieli26619e72016-11-23 19:39:551746TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1748 ClientSocketHandle handle;
1749 TestCompletionCallback callback;
1750 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541751 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551752 ClientSocketPool::RespectLimits::ENABLED,
1753 callback.callback(), pool_.get(), log.bound());
1754 EXPECT_THAT(rv, IsOk());
1755 StreamSocket* socket = handle.socket();
1756 handle.Reset();
1757 EXPECT_EQ(1, pool_->IdleSocketCount());
1758
1759 // Disconnect socket now to make the socket unusable.
1760 socket->Disconnect();
1761 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541762 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551763 ClientSocketPool::RespectLimits::ENABLED,
1764 callback.callback(), pool_.get(), log.bound());
1765 EXPECT_THAT(rv, IsOk());
1766 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551767}
1768
[email protected]2b7523d2009-07-29 20:29:231769// Regression test for http://crbug.com/17985.
1770TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1771 const int kMaxSockets = 3;
1772 const int kMaxSocketsPerGroup = 2;
1773 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1774
[email protected]ac790b42009-12-02 04:31:311775 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231776
robpercival214763f2016-07-01 23:27:011777 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1778 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231779
1780 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011781 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231782
1783 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011784 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231785
1786 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011787 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1788 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231789
[email protected]eb5a99382010-07-11 03:18:261790 // Release the first two sockets from "a". Because this is a keepalive,
1791 // the first release will unblock the pending request for "a". The
1792 // second release will unblock a request for "c", becaue it is the next
1793 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131794 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1795 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231796
1797 // Closing idle sockets should not get us into trouble, but in the bug
1798 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411799 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541800 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261801
[email protected]2da659e2013-05-23 20:51:341802 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281803 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231804}
1805
[email protected]4d3b05d2010-01-27 21:27:291806TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531807 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571808
1809 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131810 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521811 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511812 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541813 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151814 ClientSocketPool::RespectLimits::ENABLED,
1815 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011816 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131817 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481818 TestLoadTimingInfoNotConnected(handle);
1819
robpercival214763f2016-07-01 23:27:011820 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131821 EXPECT_TRUE(handle.is_initialized());
1822 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481823 TestLoadTimingInfoConnectedNotReused(handle);
1824
[email protected]2431756e2010-09-29 20:26:131825 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481826 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301827
mmenke43758e62015-05-04 21:09:461828 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401829 log.GetEntries(&entries);
1830
1831 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001832 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171833 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001834 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1835 NetLogEventPhase::NONE));
1836 EXPECT_TRUE(LogContainsEvent(entries, 2,
1837 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1838 NetLogEventPhase::NONE));
1839 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571840}
1841
[email protected]4d3b05d2010-01-27 21:27:291842TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571843 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531844 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571845
1846 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131847 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521848 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511849 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181850 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131851 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431852 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451853 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131854 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151855 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541856 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151857 ClientSocketPool::RespectLimits::ENABLED,
1858 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131859 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011860 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131861 EXPECT_FALSE(handle.is_ssl_error());
1862 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301863
mmenke43758e62015-05-04 21:09:461864 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401865 log.GetEntries(&entries);
1866
1867 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001868 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171869 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001870 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1871 NetLogEventPhase::NONE));
1872 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571873}
1874
mmenke6be122f2015-03-09 22:22:471875// Check that an async ConnectJob failure does not result in creation of a new
1876// ConnectJob when there's another pending request also waiting on its own
1877// ConnectJob. See http://crbug.com/463960.
1878TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1879 CreatePool(2, 2);
1880 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1881
robpercival214763f2016-07-01 23:27:011882 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1883 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471884
robpercival214763f2016-07-01 23:27:011885 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1886 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471887
1888 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1889}
1890
[email protected]4d3b05d2010-01-27 21:27:291891TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101892 // TODO(eroman): Add back the log expectations! Removed them because the
1893 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531894 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571895
1896 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131897 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521898 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131899 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521900 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571901
[email protected]2431756e2010-09-29 20:26:131902 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541903 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151904 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201905 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511906 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201907 EXPECT_EQ(
1908 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541909 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201910 ClientSocketPool::RespectLimits::ENABLED,
1911 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571912
[email protected]2431756e2010-09-29 20:26:131913 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571914
[email protected]fd7b7c92009-08-20 19:38:301915
1916 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301917
robpercival214763f2016-07-01 23:27:011918 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131919 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301920
1921 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531922 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571923}
1924
[email protected]4d3b05d2010-01-27 21:27:291925TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341926 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1927
[email protected]17a0c6c2009-08-04 00:07:041928 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1929
robpercival214763f2016-07-01 23:27:011930 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1931 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1932 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1933 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341934
1935 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131936 (*requests())[2]->handle()->Reset();
1937 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341938 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1939
[email protected]2431756e2010-09-29 20:26:131940 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341941 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1942
[email protected]2431756e2010-09-29 20:26:131943 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261944 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341945}
1946
[email protected]5fc08e32009-07-15 17:09:571947// When requests and ConnectJobs are not coupled, the request will get serviced
1948// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291949TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531950 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571951
1952 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321953 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571954
[email protected]2431756e2010-09-29 20:26:131955 std::vector<TestSocketRequest*> request_order;
1956 size_t completion_count; // unused
1957 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541958 int rv =
1959 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1960 ClientSocketPool::RespectLimits::ENABLED,
1961 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011962 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1963 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571964
1965 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1966 // without a job.
1967 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1968
[email protected]2431756e2010-09-29 20:26:131969 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541970 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151971 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201972 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011973 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131974 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541975 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151976 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201977 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011978 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571979
1980 // Both Requests 2 and 3 are pending. We release socket 1 which should
1981 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331982 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341983 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281984 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331985 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011986 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331987 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571988
1989 // Signal job 2, which should service request 3.
1990
1991 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011992 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571993
[email protected]2431756e2010-09-29 20:26:131994 ASSERT_EQ(3U, request_order.size());
1995 EXPECT_EQ(&req1, request_order[0]);
1996 EXPECT_EQ(&req2, request_order[1]);
1997 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571998 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1999}
2000
2001// The requests are not coupled to the jobs. So, the requests should finish in
2002// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292003TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532004 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572005 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322006 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572007
[email protected]2431756e2010-09-29 20:26:132008 std::vector<TestSocketRequest*> request_order;
2009 size_t completion_count; // unused
2010 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542011 int rv =
2012 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2013 ClientSocketPool::RespectLimits::ENABLED,
2014 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012015 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572016
[email protected]2431756e2010-09-29 20:26:132017 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542018 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152019 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202020 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012021 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572022
2023 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322024 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572025
[email protected]2431756e2010-09-29 20:26:132026 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542027 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152028 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202029 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012030 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572031
robpercival214763f2016-07-01 23:27:012032 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2033 EXPECT_THAT(req2.WaitForResult(), IsOk());
2034 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572035
[email protected]2431756e2010-09-29 20:26:132036 ASSERT_EQ(3U, request_order.size());
2037 EXPECT_EQ(&req1, request_order[0]);
2038 EXPECT_EQ(&req2, request_order[1]);
2039 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572040}
2041
[email protected]03b7c8c2013-07-20 04:38:552042// Test GetLoadState in the case there's only one socket request.
2043TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532044 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552045 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572046
[email protected]2431756e2010-09-29 20:26:132047 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522048 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542049 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152050 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202051 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012052 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552053 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572054
[email protected]03b7c8c2013-07-20 04:38:552055 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2056 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2057
2058 // No point in completing the connection, since ClientSocketHandles only
2059 // expect the LoadState to be checked while connecting.
2060}
2061
2062// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002063// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552064TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2065 CreatePool(2, 2);
2066 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2067
2068 ClientSocketHandle handle;
2069 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542070 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152071 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202072 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012073 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002074 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2075
2076 ClientSocketHandle handle2;
2077 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542078 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152079 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202080 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012081 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002082 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2083
2084 // Check that both handles report the state of the first job.
2085 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2086 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2087
2088 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2089
2090 // Check that both handles change to LOAD_STATE_CONNECTING.
2091 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2092 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2093}
2094
2095// Test that the second connection request does not affect the pool's load
2096// status.
2097TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2098 CreatePool(2, 2);
2099 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2100
2101 ClientSocketHandle handle;
2102 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542103 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152104 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202105 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012106 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572107
[email protected]2431756e2010-09-29 20:26:132108 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522109 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542110 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152111 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202112 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012113 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002114 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552115
[email protected]03b7c8c2013-07-20 04:38:552116 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2117 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2118
haavardm835c1d62015-04-22 08:18:002119 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552120 // second handle switches to the state of the remaining ConnectJob.
2121 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012122 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002123 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552124}
2125
2126// Test GetLoadState in the case the per-group limit is reached.
2127TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2128 CreatePool(2, 1);
2129 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2130
2131 ClientSocketHandle handle;
2132 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542133 int rv = handle.Init("a", params_, MEDIUM, SocketTag(),
mmenked3641e12016-01-28 16:06:152134 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202135 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012136 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552137 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2138
2139 // Request another socket from the same pool, buth with a higher priority.
2140 // The first request should now be stalled at the socket group limit.
2141 ClientSocketHandle handle2;
2142 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542143 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152144 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202145 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012146 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552147 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2148 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2149
2150 // The first handle should remain stalled as the other socket goes through
2151 // the connect process.
2152
2153 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2154 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2155 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2156
2157 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012158 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552159 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2160
2161 // Closing the second socket should cause the stalled handle to finally get a
2162 // ConnectJob.
2163 handle2.socket()->Disconnect();
2164 handle2.Reset();
2165 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2166}
2167
2168// Test GetLoadState in the case the per-pool limit is reached.
2169TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2170 CreatePool(2, 2);
2171 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2172
2173 ClientSocketHandle handle;
2174 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542175 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152176 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202177 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012178 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552179
2180 // Request for socket from another pool.
2181 ClientSocketHandle handle2;
2182 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542183 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152184 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202185 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012186 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552187
2188 // Request another socket from the first pool. Request should stall at the
2189 // socket pool limit.
2190 ClientSocketHandle handle3;
2191 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542192 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152193 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202194 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012195 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552196
2197 // The third handle should remain stalled as the other sockets in its group
2198 // goes through the connect process.
2199
2200 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2201 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2202
2203 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2204 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2205 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2206
2207 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012208 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552209 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2210
2211 // Closing a socket should allow the stalled handle to finally get a new
2212 // ConnectJob.
2213 handle.socket()->Disconnect();
2214 handle.Reset();
2215 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572216}
2217
[email protected]e772db3f2010-07-12 18:11:132218TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2219 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2220 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2221
[email protected]2431756e2010-09-29 20:26:132222 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522223 TestCompletionCallback callback;
2224 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
Paul Jensen8d6f87ec2018-01-13 00:46:542225 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152226 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202227 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132228 EXPECT_TRUE(handle.is_initialized());
2229 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132230}
2231
2232TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2233 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2234
2235 connect_job_factory_->set_job_type(
2236 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132237 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522238 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132239 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542240 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152241 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202242 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132243 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012244 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132245 EXPECT_TRUE(handle.is_initialized());
2246 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132247}
2248
[email protected]e60e47a2010-07-14 03:37:182249TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2250 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2251 connect_job_factory_->set_job_type(
2252 TestConnectJob::kMockAdditionalErrorStateJob);
2253
[email protected]2431756e2010-09-29 20:26:132254 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522255 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132256 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:542257 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152258 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202259 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132260 EXPECT_FALSE(handle.is_initialized());
2261 EXPECT_FALSE(handle.socket());
2262 EXPECT_TRUE(handle.is_ssl_error());
2263 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182264}
2265
2266TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2267 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2268
2269 connect_job_factory_->set_job_type(
2270 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132271 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522272 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132273 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542274 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152275 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202276 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132277 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012278 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132279 EXPECT_FALSE(handle.is_initialized());
2280 EXPECT_FALSE(handle.socket());
2281 EXPECT_TRUE(handle.is_ssl_error());
2282 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182283}
2284
martijn003cd612016-05-19 22:24:382285// Make sure we can reuse sockets.
2286TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412287 CreatePoolWithIdleTimeouts(
2288 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032289 base::TimeDelta(), // Time out unused sockets immediately.
2290 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2291
2292 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2293
2294 ClientSocketHandle handle;
2295 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542296 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152297 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202298 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012299 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032300 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012301 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032302
2303 // Use and release the socket.
Bence Békybdbb0e72018-08-07 21:42:592304 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382305 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482306 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032307 handle.Reset();
2308
2309 // Should now have one idle socket.
2310 ASSERT_EQ(1, pool_->IdleSocketCount());
2311
2312 // Request a new socket. This should reuse the old socket and complete
2313 // synchronously.
vishal.b62985ca92015-04-17 08:45:512314 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:542315 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152316 ClientSocketPool::RespectLimits::ENABLED,
Bence Békybdbb0e72018-08-07 21:42:592317 CompletionOnceCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012318 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032319 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482320 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032321
2322 ASSERT_TRUE(pool_->HasGroup("a"));
2323 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2324 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2325
mmenke43758e62015-05-04 21:09:462326 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032327 log.GetEntries(&entries);
2328 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002329 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032330}
2331
martijn003cd612016-05-19 22:24:382332// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172333TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032334 CreatePoolWithIdleTimeouts(
2335 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2336 base::TimeDelta(), // Time out unused sockets immediately
2337 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412338
2339 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2340
2341 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2342
2343 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522344 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542345 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152346 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202347 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012348 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412349 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2350
2351 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522352 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542353 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152354 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202355 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012356 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412357 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2358
2359 // Cancel one of the requests. Wait for the other, which will get the first
2360 // job. Release the socket. Run the loop again to make sure the second
2361 // socket is sitting idle and the first one is released (since ReleaseSocket()
2362 // just posts a DoReleaseSocket() task).
2363
2364 handle.Reset();
robpercival214763f2016-07-01 23:27:012365 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412366 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592367 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382368 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412369 handle2.Reset();
2370
[email protected]e7b1c6d2c2012-05-05 00:54:032371 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2372 // actually become pending until 2ms after they have been created. In order
2373 // to flush all tasks, we need to wait so that we know there are no
2374 // soon-to-be-pending tasks waiting.
2375 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282376 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412377
[email protected]e7b1c6d2c2012-05-05 00:54:032378 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412379 ASSERT_EQ(2, pool_->IdleSocketCount());
2380
2381 // Request a new socket. This should cleanup the unused and timed out ones.
2382 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512383 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522384 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542385 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152386 ClientSocketPool::RespectLimits::ENABLED,
2387 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012388 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2389 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412390 EXPECT_FALSE(handle.is_reused());
2391
[email protected]e7b1c6d2c2012-05-05 00:54:032392 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412393 ASSERT_TRUE(pool_->HasGroup("a"));
2394 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2395 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2396
mmenke43758e62015-05-04 21:09:462397 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412398 log.GetEntries(&entries);
2399 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002400 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412401}
2402
[email protected]2041cf342010-02-19 03:15:592403// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162404// because of multiple releasing disconnected sockets.
2405TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2406 CreatePoolWithIdleTimeouts(
2407 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2408 base::TimeDelta(), // Time out unused sockets immediately.
2409 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2410
2411 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2412
2413 // Startup 4 connect jobs. Two of them will be pending.
2414
[email protected]2431756e2010-09-29 20:26:132415 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522416 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542417 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152418 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202419 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012420 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162421
[email protected]2431756e2010-09-29 20:26:132422 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522423 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542424 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152425 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202426 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012427 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162428
[email protected]2431756e2010-09-29 20:26:132429 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522430 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542431 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152432 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202433 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012434 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162435
[email protected]2431756e2010-09-29 20:26:132436 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522437 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542438 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152439 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202440 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012441 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162442
2443 // Release two disconnected sockets.
2444
[email protected]2431756e2010-09-29 20:26:132445 handle.socket()->Disconnect();
2446 handle.Reset();
2447 handle2.socket()->Disconnect();
2448 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162449
robpercival214763f2016-07-01 23:27:012450 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132451 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012452 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132453 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162454}
2455
[email protected]d7027bb2010-05-10 18:58:542456// Regression test for http://crbug.com/42267.
2457// When DoReleaseSocket() is processed for one socket, it is blocked because the
2458// other stalled groups all have releasing sockets, so no progress can be made.
2459TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2460 CreatePoolWithIdleTimeouts(
2461 4 /* socket limit */, 4 /* socket limit per group */,
2462 base::TimeDelta(), // Time out unused sockets immediately.
2463 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2464
2465 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2466
2467 // Max out the socket limit with 2 per group.
2468
[email protected]2431756e2010-09-29 20:26:132469 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522470 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132471 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522472 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542473
2474 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542475 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152476 ClientSocketPool::RespectLimits::ENABLED,
2477 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202478 NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542479 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152480 ClientSocketPool::RespectLimits::ENABLED,
2481 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202482 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542483 }
[email protected]b89f7e42010-05-20 20:37:002484
[email protected]d7027bb2010-05-10 18:58:542485 // Make 4 pending requests, 2 per group.
2486
2487 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202488 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542489 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202490 ClientSocketPool::RespectLimits::ENABLED,
2491 callback_a[i].callback(), pool_.get(),
2492 NetLogWithSource()));
2493 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542494 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202495 ClientSocketPool::RespectLimits::ENABLED,
2496 callback_b[i].callback(), pool_.get(),
2497 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542498 }
2499
2500 // Release b's socket first. The order is important, because in
2501 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2502 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2503 // first, which has a releasing socket, so it refuses to start up another
2504 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132505 handle_b[0].socket()->Disconnect();
2506 handle_b[0].Reset();
2507 handle_a[0].socket()->Disconnect();
2508 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542509
2510 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282511 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542512
[email protected]2431756e2010-09-29 20:26:132513 handle_b[1].socket()->Disconnect();
2514 handle_b[1].Reset();
2515 handle_a[1].socket()->Disconnect();
2516 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542517
2518 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012519 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2520 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542521 }
2522}
2523
[email protected]fd4fe0b2010-02-08 23:02:152524TEST_F(ClientSocketPoolBaseTest,
2525 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2526 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2527
2528 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2529
robpercival214763f2016-07-01 23:27:012530 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2531 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2532 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2533 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152534
robpercival214763f2016-07-01 23:27:012535 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2536 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132537 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152538
2539 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132540 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012541 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152542
[email protected]2431756e2010-09-29 20:26:132543 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012544 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132545 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152546
2547 EXPECT_EQ(1, GetOrderOfRequest(1));
2548 EXPECT_EQ(2, GetOrderOfRequest(2));
2549 EXPECT_EQ(3, GetOrderOfRequest(3));
2550 EXPECT_EQ(4, GetOrderOfRequest(4));
2551
2552 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132553 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152554}
2555
[email protected]6ecf2b92011-12-15 01:14:522556class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042557 public:
[email protected]2431756e2010-09-29 20:26:132558 TestReleasingSocketRequest(TestClientSocketPool* pool,
2559 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182560 bool reset_releasing_handle)
2561 : pool_(pool),
2562 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042563 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522564
Chris Watkins7a41d3552017-12-01 02:13:272565 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042566
2567 ClientSocketHandle* handle() { return &handle_; }
2568
Bence Béky8ddc2492018-06-13 01:02:042569 CompletionOnceCallback callback() {
2570 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2571 base::Unretained(this));
2572 }
[email protected]4f1e4982010-03-02 18:31:042573
2574 private:
[email protected]6ecf2b92011-12-15 01:14:522575 void OnComplete(int result) {
2576 SetResult(result);
2577 if (reset_releasing_handle_)
2578 handle_.Reset();
2579
mmenked3641e12016-01-28 16:06:152580 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Bence Béky8ddc2492018-06-13 01:02:042581 EXPECT_EQ(
2582 expected_result_,
2583 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2584 ClientSocketPool::RespectLimits::ENABLED,
2585 CompletionOnceCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522586 }
2587
[email protected]2431756e2010-09-29 20:26:132588 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182589 int expected_result_;
2590 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042591 ClientSocketHandle handle_;
2592 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042593};
2594
[email protected]e60e47a2010-07-14 03:37:182595
2596TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2597 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2598
robpercival214763f2016-07-01 23:27:012599 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2600 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2601 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182602
[email protected]2431756e2010-09-29 20:26:132603 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182604 client_socket_factory_.allocation_count());
2605
2606 connect_job_factory_->set_job_type(
2607 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2608 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202609 EXPECT_EQ(
2610 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542611 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202612 ClientSocketPool::RespectLimits::ENABLED,
2613 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182614 // The next job should complete synchronously
2615 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2616
robpercival214763f2016-07-01 23:27:012617 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182618 EXPECT_FALSE(req.handle()->is_initialized());
2619 EXPECT_FALSE(req.handle()->socket());
2620 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432621 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182622}
2623
[email protected]b6501d3d2010-06-03 23:53:342624// http://crbug.com/44724 regression test.
2625// We start releasing the pool when we flush on network change. When that
2626// happens, the only active references are in the ClientSocketHandles. When a
2627// ConnectJob completes and calls back into the last ClientSocketHandle, that
2628// callback can release the last reference and delete the pool. After the
2629// callback finishes, we go back to the stack frame within the now-deleted pool.
2630// Executing any code that refers to members of the now-deleted pool can cause
2631// crashes.
2632TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2633 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2634 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2635
2636 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522637 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152638 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542639 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152640 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202641 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342642
[email protected]7af985a2012-12-14 22:40:422643 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342644
2645 // We'll call back into this now.
2646 callback.WaitForResult();
2647}
2648
[email protected]a7e38572010-06-07 18:22:242649TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2650 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2651 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2652
2653 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522654 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152655 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542656 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152657 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202658 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012659 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242660 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2661
[email protected]7af985a2012-12-14 22:40:422662 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242663
2664 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282665 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242666
mmenked3641e12016-01-28 16:06:152667 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542668 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152669 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202670 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012671 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242672 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2673}
2674
[email protected]6ecf2b92011-12-15 01:14:522675class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142676 public:
Bence Béky8ddc2492018-06-13 01:02:042677 ConnectWithinCallback(const std::string& group_name,
2678 const scoped_refptr<TestSocketParams>& params,
2679 TestClientSocketPool* pool)
2680 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142681
Chris Watkins7a41d3552017-12-01 02:13:272682 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142683
2684 int WaitForNestedResult() {
2685 return nested_callback_.WaitForResult();
2686 }
2687
Bence Béky8ddc2492018-06-13 01:02:042688 CompletionOnceCallback callback() {
2689 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2690 base::Unretained(this));
2691 }
[email protected]6ecf2b92011-12-15 01:14:522692
[email protected]06f92462010-08-31 19:24:142693 private:
[email protected]6ecf2b92011-12-15 01:14:522694 void OnComplete(int result) {
2695 SetResult(result);
tfarina428341112016-09-22 13:38:202696 EXPECT_EQ(
2697 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542698 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202699 ClientSocketPool::RespectLimits::ENABLED,
2700 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522701 }
2702
[email protected]06f92462010-08-31 19:24:142703 const std::string group_name_;
2704 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132705 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142706 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522707 TestCompletionCallback nested_callback_;
2708
2709 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142710};
2711
2712TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2713 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2714
2715 // First job will be waiting until it gets aborted.
2716 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2717
2718 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132719 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152720 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542721 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152722 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202723 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142724
2725 // Second job will be started during the first callback, and will
2726 // asynchronously complete with OK.
2727 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422728 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012729 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2730 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142731}
2732
[email protected]25eea382010-07-10 23:55:262733// Cancel a pending socket request while we're at max sockets,
2734// and verify that the backup socket firing doesn't cause a crash.
2735TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2736 // Max 4 sockets globally, max 4 sockets per group.
2737 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222738 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262739
[email protected]4baaf9d2010-08-31 15:15:442740 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2741 // timer.
[email protected]25eea382010-07-10 23:55:262742 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2743 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522744 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152745 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542746 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152747 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202748 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262749
2750 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2751 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2752 ClientSocketHandle handles[kDefaultMaxSockets];
2753 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522754 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542755 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202756 ClientSocketPool::RespectLimits::ENABLED,
2757 callback.callback(), pool_.get(),
2758 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262759 }
2760
fdoray5eeb7642016-06-22 16:11:282761 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262762
2763 // Cancel the pending request.
2764 handle.Reset();
2765
2766 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002767 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2768 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262769
fdoray5eeb7642016-06-22 16:11:282770 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262771 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2772}
2773
[email protected]3f00be82010-09-27 19:50:022774TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442775 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2776 pool_->EnableConnectBackupJobs();
2777
2778 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2779 // timer.
2780 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2781 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522782 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152783 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542784 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152785 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202786 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442787 ASSERT_TRUE(pool_->HasGroup("bar"));
2788 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102789 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442790
2791 // Cancel the socket request. This should cancel the backup timer. Wait for
2792 // the backup time to see if it indeed got canceled.
2793 handle.Reset();
2794 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002795 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2796 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282797 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442798 ASSERT_TRUE(pool_->HasGroup("bar"));
2799 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2800}
2801
[email protected]3f00be82010-09-27 19:50:022802TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2803 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2804 pool_->EnableConnectBackupJobs();
2805
2806 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2807 // timer.
2808 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2809 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522810 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152811 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542812 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152813 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202814 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022815 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2816 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522817 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202818 EXPECT_EQ(
2819 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542820 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202821 ClientSocketPool::RespectLimits::ENABLED,
2822 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022823 ASSERT_TRUE(pool_->HasGroup("bar"));
2824 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2825
2826 // Cancel request 1 and then complete request 2. With the requests finished,
2827 // the backup timer should be cancelled.
2828 handle.Reset();
robpercival214763f2016-07-01 23:27:012829 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022830 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002831 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2832 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282833 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022834}
2835
[email protected]eb5a99382010-07-11 03:18:262836// Test delayed socket binding for the case where we have two connects,
2837// and while one is waiting on a connect, the other frees up.
2838// The socket waiting on a connect should switch immediately to the freed
2839// up socket.
2840TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2841 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2842 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2843
2844 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522845 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132846 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542847 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152848 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202849 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012850 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262851
2852 // No idle sockets, no pending jobs.
2853 EXPECT_EQ(0, pool_->IdleSocketCount());
2854 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2855
2856 // Create a second socket to the same host, but this one will wait.
2857 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2858 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132859 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542860 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152861 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202862 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262863 // No idle sockets, and one connecting job.
2864 EXPECT_EQ(0, pool_->IdleSocketCount());
2865 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2866
2867 // Return the first handle to the pool. This will initiate the delayed
2868 // binding.
2869 handle1.Reset();
2870
fdoray5eeb7642016-06-22 16:11:282871 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262872
2873 // Still no idle sockets, still one pending connect job.
2874 EXPECT_EQ(0, pool_->IdleSocketCount());
2875 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2876
2877 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012878 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262879
2880 // And we can see there is still one job waiting.
2881 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2882
2883 // Finally, signal the waiting Connect.
2884 client_socket_factory_.SignalJobs();
2885 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2886
fdoray5eeb7642016-06-22 16:11:282887 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262888}
2889
2890// Test delayed socket binding when a group is at capacity and one
2891// of the group's sockets frees up.
2892TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2893 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2894 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2895
2896 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522897 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132898 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542899 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152900 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202901 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012902 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262903
2904 // No idle sockets, no pending jobs.
2905 EXPECT_EQ(0, pool_->IdleSocketCount());
2906 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2907
2908 // Create a second socket to the same host, but this one will wait.
2909 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2910 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132911 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542912 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152913 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202914 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262915 // No idle sockets, and one connecting job.
2916 EXPECT_EQ(0, pool_->IdleSocketCount());
2917 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2918
2919 // Return the first handle to the pool. This will initiate the delayed
2920 // binding.
2921 handle1.Reset();
2922
fdoray5eeb7642016-06-22 16:11:282923 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262924
2925 // Still no idle sockets, still one pending connect job.
2926 EXPECT_EQ(0, pool_->IdleSocketCount());
2927 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2928
2929 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012930 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262931
2932 // And we can see there is still one job waiting.
2933 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2934
2935 // Finally, signal the waiting Connect.
2936 client_socket_factory_.SignalJobs();
2937 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2938
fdoray5eeb7642016-06-22 16:11:282939 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262940}
2941
2942// Test out the case where we have one socket connected, one
2943// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512944// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262945// should complete, by taking the first socket's idle socket.
2946TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2947 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2948 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2949
2950 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522951 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132952 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542953 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152954 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202955 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012956 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262957
2958 // No idle sockets, no pending jobs.
2959 EXPECT_EQ(0, pool_->IdleSocketCount());
2960 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2961
2962 // Create a second socket to the same host, but this one will wait.
2963 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2964 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132965 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542966 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152967 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202968 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262969 // No idle sockets, and one connecting job.
2970 EXPECT_EQ(0, pool_->IdleSocketCount());
2971 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2972
2973 // Return the first handle to the pool. This will initiate the delayed
2974 // binding.
2975 handle1.Reset();
2976
fdoray5eeb7642016-06-22 16:11:282977 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262978
2979 // Still no idle sockets, still one pending connect job.
2980 EXPECT_EQ(0, pool_->IdleSocketCount());
2981 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2982
2983 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012984 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262985
2986 // And we can see there is still one job waiting.
2987 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2988
2989 // Finally, signal the waiting Connect.
2990 client_socket_factory_.SignalJobs();
2991 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2992
fdoray5eeb7642016-06-22 16:11:282993 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262994}
2995
[email protected]2abfe90a2010-08-25 17:49:512996// Cover the case where on an available socket slot, we have one pending
2997// request that completes synchronously, thereby making the Group empty.
2998TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
2999 const int kUnlimitedSockets = 100;
3000 const int kOneSocketPerGroup = 1;
3001 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3002
3003 // Make the first request asynchronous fail.
3004 // This will free up a socket slot later.
3005 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3006
3007 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523008 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203009 EXPECT_EQ(
3010 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543011 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203012 ClientSocketPool::RespectLimits::ENABLED,
3013 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513014 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3015
3016 // Make the second request synchronously fail. This should make the Group
3017 // empty.
3018 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3019 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523020 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513021 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3022 // when created.
tfarina428341112016-09-22 13:38:203023 EXPECT_EQ(
3024 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543025 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203026 ClientSocketPool::RespectLimits::ENABLED,
3027 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513028
3029 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3030
robpercival214763f2016-07-01 23:27:013031 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3032 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513033 EXPECT_FALSE(pool_->HasGroup("a"));
3034}
3035
[email protected]e1b54dc2010-10-06 21:27:223036TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3037 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3038
3039 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3040
3041 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523042 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203043 EXPECT_EQ(
3044 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543045 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203046 ClientSocketPool::RespectLimits::ENABLED,
3047 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223048
3049 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523050 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203051 EXPECT_EQ(
3052 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543053 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203054 ClientSocketPool::RespectLimits::ENABLED,
3055 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223056 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523057 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203058 EXPECT_EQ(
3059 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543060 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203061 ClientSocketPool::RespectLimits::ENABLED,
3062 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223063
robpercival214763f2016-07-01 23:27:013064 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3065 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3066 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223067
3068 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:593069 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383070 TRAFFIC_ANNOTATION_FOR_TESTS));
Bence Békybdbb0e72018-08-07 21:42:593071 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383072 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223073
3074 handle1.Reset();
3075 handle2.Reset();
3076 handle3.Reset();
3077
tfarina428341112016-09-22 13:38:203078 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543079 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203080 ClientSocketPool::RespectLimits::ENABLED,
3081 callback1.callback(), pool_.get(), NetLogWithSource()));
3082 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543083 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203084 ClientSocketPool::RespectLimits::ENABLED,
3085 callback2.callback(), pool_.get(), NetLogWithSource()));
3086 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543087 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203088 ClientSocketPool::RespectLimits::ENABLED,
3089 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223090
3091 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3092 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3093 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3094}
3095
[email protected]2c2bef152010-10-13 00:55:033096TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3097 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3098 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3099
Charlie Harrison55ce6082018-05-14 02:25:573100 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033101
3102 ASSERT_TRUE(pool_->HasGroup("a"));
3103 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103104 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033105 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3106
3107 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523108 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203109 EXPECT_EQ(
3110 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543111 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203112 ClientSocketPool::RespectLimits::ENABLED,
3113 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033114
3115 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523116 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203117 EXPECT_EQ(
3118 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543119 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203120 ClientSocketPool::RespectLimits::ENABLED,
3121 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033122
3123 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103124 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033125 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3126
robpercival214763f2016-07-01 23:27:013127 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3128 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033129 handle1.Reset();
3130 handle2.Reset();
3131
3132 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103133 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033134 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3135}
3136
3137TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3138 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3139 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3140
3141 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523142 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203143 EXPECT_EQ(
3144 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543145 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203146 ClientSocketPool::RespectLimits::ENABLED,
3147 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033148
3149 ASSERT_TRUE(pool_->HasGroup("a"));
3150 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103151 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033152 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3153
Charlie Harrison55ce6082018-05-14 02:25:573154 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033155
3156 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103157 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033158 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3159
3160 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523161 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203162 EXPECT_EQ(
3163 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543164 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203165 ClientSocketPool::RespectLimits::ENABLED,
3166 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033167
3168 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103169 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033170 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3171
robpercival214763f2016-07-01 23:27:013172 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3173 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033174 handle1.Reset();
3175 handle2.Reset();
3176
3177 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103178 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033179 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3180}
3181
3182TEST_F(ClientSocketPoolBaseTest,
3183 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3184 CreatePool(4, 4);
3185 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3186
3187 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523188 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203189 EXPECT_EQ(
3190 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543191 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203192 ClientSocketPool::RespectLimits::ENABLED,
3193 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033194
3195 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523196 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203197 EXPECT_EQ(
3198 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543199 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203200 ClientSocketPool::RespectLimits::ENABLED,
3201 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033202
3203 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523204 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203205 EXPECT_EQ(
3206 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543207 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203208 ClientSocketPool::RespectLimits::ENABLED,
3209 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033210
3211 ASSERT_TRUE(pool_->HasGroup("a"));
3212 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103213 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033214 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3215
Charlie Harrison55ce6082018-05-14 02:25:573216 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033217
3218 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103219 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033220 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3221
robpercival214763f2016-07-01 23:27:013222 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3223 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3224 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033225 handle1.Reset();
3226 handle2.Reset();
3227 handle3.Reset();
3228
3229 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103230 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033231 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3232}
3233
3234TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3235 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3236 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3237
3238 ASSERT_FALSE(pool_->HasGroup("a"));
3239
Charlie Harrison55ce6082018-05-14 02:25:573240 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033241
3242 ASSERT_TRUE(pool_->HasGroup("a"));
3243 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103244 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033245
3246 ASSERT_FALSE(pool_->HasGroup("b"));
3247
Charlie Harrison55ce6082018-05-14 02:25:573248 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033249
3250 ASSERT_FALSE(pool_->HasGroup("b"));
3251}
3252
3253TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3254 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3255 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3256
3257 ASSERT_FALSE(pool_->HasGroup("a"));
3258
3259 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573260 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033261
3262 ASSERT_TRUE(pool_->HasGroup("a"));
3263 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103264 EXPECT_EQ(kDefaultMaxSockets - 1,
3265 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483266 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033267
3268 ASSERT_FALSE(pool_->HasGroup("b"));
3269
Charlie Harrison55ce6082018-05-14 02:25:573270 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033271
3272 ASSERT_TRUE(pool_->HasGroup("b"));
3273 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483274 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033275}
3276
3277TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3278 CreatePool(4, 4);
3279 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3280
3281 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523282 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203283 EXPECT_EQ(
3284 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543285 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203286 ClientSocketPool::RespectLimits::ENABLED,
3287 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013288 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033289 handle1.Reset();
3290
3291 ASSERT_TRUE(pool_->HasGroup("a"));
3292 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103293 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033294 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3295
Charlie Harrison55ce6082018-05-14 02:25:573296 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033297
3298 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103299 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033300 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3301}
3302
3303TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3304 CreatePool(4, 4);
3305 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3306
3307 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523308 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203309 EXPECT_EQ(
3310 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543311 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203312 ClientSocketPool::RespectLimits::ENABLED,
3313 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013314 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033315
3316 ASSERT_TRUE(pool_->HasGroup("a"));
3317 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103318 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033319 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3320 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3321
Charlie Harrison55ce6082018-05-14 02:25:573322 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033323
3324 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103325 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033326 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3327 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3328}
3329
3330TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3331 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3332 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3333
3334 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573335 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033336
3337 ASSERT_TRUE(pool_->HasGroup("a"));
3338 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103339 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033340 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3341
3342 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573343 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033344
3345 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103346 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033347 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3348}
3349
[email protected]3c819f522010-12-02 02:03:123350TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3351 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3352 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3353
3354 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573355 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123356
3357 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523358
3359 connect_job_factory_->set_job_type(
3360 TestConnectJob::kMockAdditionalErrorStateJob);
3361 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573362 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523363
3364 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123365}
3366
[email protected]8159a1c2012-06-07 00:00:103367TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033368 CreatePool(4, 4);
3369 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3370
Charlie Harrison55ce6082018-05-14 02:25:573371 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033372
3373 ASSERT_TRUE(pool_->HasGroup("a"));
3374 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103375 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033376 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3377
Charlie Harrison55ce6082018-05-14 02:25:573378 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033379 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103380 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033381 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3382
3383 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523384 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203385 EXPECT_EQ(
3386 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543387 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203388 ClientSocketPool::RespectLimits::ENABLED,
3389 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013390 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033391
3392 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523393 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:543394 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153395 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203396 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033397 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013398 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3399 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033400 }
3401
[email protected]8159a1c2012-06-07 00:00:103402 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3403 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3404 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3405 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3406
[email protected]2c2bef152010-10-13 00:55:033407 handle1.Reset();
3408 handle2.Reset();
3409
[email protected]8159a1c2012-06-07 00:00:103410 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3411 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033412 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3413
Charlie Harrison55ce6082018-05-14 02:25:573414 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033415 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103416 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033417 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3418}
3419
3420TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3421 CreatePool(4, 4);
3422 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3423
Charlie Harrison55ce6082018-05-14 02:25:573424 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033425
3426 ASSERT_TRUE(pool_->HasGroup("a"));
3427 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103428 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033429 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3430
Charlie Harrison55ce6082018-05-14 02:25:573431 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033432 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103433 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033434 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3435
Charlie Harrison55ce6082018-05-14 02:25:573436 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033437 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103438 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033439 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3440
Charlie Harrison55ce6082018-05-14 02:25:573441 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033442 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103443 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033444 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3445}
3446
3447TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3448 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3449 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3450
Charlie Harrison55ce6082018-05-14 02:25:573451 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033452
3453 ASSERT_TRUE(pool_->HasGroup("a"));
3454 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103455 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033456 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3457
3458 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523459 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203460 EXPECT_EQ(
3461 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543462 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203463 ClientSocketPool::RespectLimits::ENABLED,
3464 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033465
3466 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103467 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033468 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3469
robpercival214763f2016-07-01 23:27:013470 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033471
[email protected]0dc88b32014-03-26 20:12:283472 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483473 // starts, it has a connect start time.
3474 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033475 handle1.Reset();
3476
3477 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3478}
3479
[email protected]034df0f32013-01-07 23:17:483480// Checks that fully connected preconnect jobs have no connect times, and are
3481// marked as reused.
3482TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3483 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3484 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573485 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483486
3487 ASSERT_TRUE(pool_->HasGroup("a"));
3488 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3489 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3490 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3491
3492 ClientSocketHandle handle;
3493 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203494 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543495 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203496 ClientSocketPool::RespectLimits::ENABLED,
3497 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483498
3499 // Make sure the idle socket was used.
3500 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3501
3502 TestLoadTimingInfoConnectedReused(handle);
3503 handle.Reset();
3504 TestLoadTimingInfoNotConnected(handle);
3505}
3506
[email protected]dcbe168a2010-12-02 03:14:463507// http://crbug.com/64940 regression test.
3508TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3509 const int kMaxTotalSockets = 3;
3510 const int kMaxSocketsPerGroup = 2;
3511 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3512 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3513
3514 // Note that group name ordering matters here. "a" comes before "b", so
3515 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3516
3517 // Set up one idle socket in "a".
3518 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523519 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203520 EXPECT_EQ(
3521 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543522 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203523 ClientSocketPool::RespectLimits::ENABLED,
3524 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463525
robpercival214763f2016-07-01 23:27:013526 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463527 handle1.Reset();
3528 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3529
3530 // Set up two active sockets in "b".
3531 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523532 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203533 EXPECT_EQ(
3534 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543535 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203536 ClientSocketPool::RespectLimits::ENABLED,
3537 callback1.callback(), pool_.get(), NetLogWithSource()));
3538 EXPECT_EQ(
3539 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543540 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203541 ClientSocketPool::RespectLimits::ENABLED,
3542 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463543
robpercival214763f2016-07-01 23:27:013544 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3545 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463546 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103547 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463548 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3549
3550 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3551 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3552 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3553 // sockets for "a", and "b" should still have 2 active sockets.
3554
Charlie Harrison55ce6082018-05-14 02:25:573555 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463556 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103557 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463558 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3559 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3560 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103561 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463562 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3563 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3564
3565 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3566 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3567 // "a" should result in closing 1 for "b".
3568 handle1.Reset();
3569 handle2.Reset();
3570 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3571 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3572
Charlie Harrison55ce6082018-05-14 02:25:573573 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463574 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103575 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463576 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3577 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3578 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103579 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463580 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3581 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3582}
3583
[email protected]b7b8be42011-07-12 12:46:413584TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3586 pool_->EnableConnectBackupJobs();
3587
3588 // Make the ConnectJob hang until it times out, shorten the timeout.
3589 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3590 connect_job_factory_->set_timeout_duration(
3591 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573592 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073593 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103594 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073595 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073596
[email protected]b7b8be42011-07-12 12:46:413597 // Verify the backup timer doesn't create a backup job, by making
3598 // the backup job a pending job instead of a waiting job, so it
3599 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073600 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453601 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443602 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343603 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283604 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073605 EXPECT_FALSE(pool_->HasGroup("a"));
3606}
3607
[email protected]b7b8be42011-07-12 12:46:413608TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073609 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3610 pool_->EnableConnectBackupJobs();
3611
3612 // Make the ConnectJob hang forever.
3613 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573614 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073615 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103616 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073617 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283618 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073619
3620 // Make the backup job be a pending job, so it completes normally.
3621 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3622 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523623 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153624 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543625 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153626 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203627 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413628 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073629 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103630 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073631 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3632 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013633 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073634
3635 // The hung connect job should still be there, but everything else should be
3636 // complete.
3637 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103638 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073639 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3640 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3641}
3642
[email protected]0dc88b32014-03-26 20:12:283643// Tests that a preconnect that starts out with unread data can still be used.
3644// http://crbug.com/334467
3645TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3646 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3647 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3648
Charlie Harrison55ce6082018-05-14 02:25:573649 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283650
3651 ASSERT_TRUE(pool_->HasGroup("a"));
3652 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3653 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3654 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3655
3656 // Fail future jobs to be sure that handle receives the preconnected socket
3657 // rather than closing it and making a new one.
3658 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3659 ClientSocketHandle handle;
3660 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203661 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543662 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203663 ClientSocketPool::RespectLimits::ENABLED,
3664 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283665
3666 ASSERT_TRUE(pool_->HasGroup("a"));
3667 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3668 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3669 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3670
3671 // Drain the pending read.
Bence Békybdbb0e72018-08-07 21:42:593672 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283673
3674 TestLoadTimingInfoConnectedReused(handle);
3675 handle.Reset();
3676
3677 // The socket should be usable now that it's idle again.
3678 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3679}
3680
[email protected]043b68c82013-08-22 23:41:523681class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203682 public:
3683 MockLayeredPool(TestClientSocketPool* pool,
3684 const std::string& group_name)
3685 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203686 group_name_(group_name),
3687 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523688 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203689 }
3690
Daniel Cheng4496d0822018-04-26 21:52:153691 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:203692
3693 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153694 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543695 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153696 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203697 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203698 }
3699
3700 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153701 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543702 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153703 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203704 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203705 }
3706
3707 bool ReleaseOneConnection() {
3708 if (!handle_.is_initialized() || !can_release_connection_) {
3709 return false;
3710 }
3711 handle_.socket()->Disconnect();
3712 handle_.Reset();
3713 return true;
3714 }
3715
3716 void set_can_release_connection(bool can_release_connection) {
3717 can_release_connection_ = can_release_connection;
3718 }
3719
3720 MOCK_METHOD0(CloseOneIdleConnection, bool());
3721
3722 private:
3723 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203724 ClientSocketHandle handle_;
3725 TestCompletionCallback callback_;
3726 const std::string group_name_;
3727 bool can_release_connection_;
3728};
3729
3730TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3732 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3733
3734 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013735 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203736 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3737 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523738 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203739}
3740
3741TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3742 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3743 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3744
3745 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013746 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203747 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3748 .WillOnce(Invoke(&mock_layered_pool,
3749 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523750 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203751}
3752
3753// Tests the basic case of closing an idle socket in a higher layered pool when
3754// a new request is issued and the lower layer pool is stalled.
3755TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3756 CreatePool(1, 1);
3757 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3758
3759 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013760 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203761 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3762 .WillOnce(Invoke(&mock_layered_pool,
3763 &MockLayeredPool::ReleaseOneConnection));
3764 ClientSocketHandle handle;
3765 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153766 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543767 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153768 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203769 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013770 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203771}
3772
3773// Same as above, but the idle socket is in the same group as the stalled
3774// socket, and closes the only other request in its group when closing requests
3775// in higher layered pools. This generally shouldn't happen, but it may be
3776// possible if a higher level pool issues a request and the request is
3777// subsequently cancelled. Even if it's not possible, best not to crash.
3778TEST_F(ClientSocketPoolBaseTest,
3779 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3780 CreatePool(2, 2);
3781 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3782
3783 // Need a socket in another group for the pool to be stalled (If a group
3784 // has the maximum number of connections already, it's not stalled).
3785 ClientSocketHandle handle1;
3786 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203787 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543788 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203789 ClientSocketPool::RespectLimits::ENABLED,
3790 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203791
3792 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013793 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203794 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3795 .WillOnce(Invoke(&mock_layered_pool,
3796 &MockLayeredPool::ReleaseOneConnection));
3797 ClientSocketHandle handle;
3798 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153799 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543800 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153801 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203802 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013803 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203804}
3805
3806// Tests the case when an idle socket can be closed when a new request is
3807// issued, and the new request belongs to a group that was previously stalled.
3808TEST_F(ClientSocketPoolBaseTest,
3809 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3810 CreatePool(2, 2);
3811 std::list<TestConnectJob::JobType> job_types;
3812 job_types.push_back(TestConnectJob::kMockJob);
3813 job_types.push_back(TestConnectJob::kMockJob);
3814 job_types.push_back(TestConnectJob::kMockJob);
3815 job_types.push_back(TestConnectJob::kMockJob);
3816 connect_job_factory_->set_job_types(&job_types);
3817
3818 ClientSocketHandle handle1;
3819 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203820 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543821 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203822 ClientSocketPool::RespectLimits::ENABLED,
3823 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203824
3825 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013826 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203827 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3828 .WillRepeatedly(Invoke(&mock_layered_pool,
3829 &MockLayeredPool::ReleaseOneConnection));
3830 mock_layered_pool.set_can_release_connection(false);
3831
3832 // The third request is made when the socket pool is in a stalled state.
3833 ClientSocketHandle handle3;
3834 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203835 EXPECT_EQ(
3836 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543837 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203838 ClientSocketPool::RespectLimits::ENABLED,
3839 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203840
3841 base::RunLoop().RunUntilIdle();
3842 EXPECT_FALSE(callback3.have_result());
3843
3844 // The fourth request is made when the pool is no longer stalled. The third
3845 // request should be serviced first, since it was issued first and has the
3846 // same priority.
3847 mock_layered_pool.set_can_release_connection(true);
3848 ClientSocketHandle handle4;
3849 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203850 EXPECT_EQ(
3851 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543852 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203853 ClientSocketPool::RespectLimits::ENABLED,
3854 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013855 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203856 EXPECT_FALSE(callback4.have_result());
3857
3858 // Closing a handle should free up another socket slot.
3859 handle1.Reset();
robpercival214763f2016-07-01 23:27:013860 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203861}
3862
3863// Tests the case when an idle socket can be closed when a new request is
3864// issued, and the new request belongs to a group that was previously stalled.
3865//
3866// The two differences from the above test are that the stalled requests are not
3867// in the same group as the layered pool's request, and the the fourth request
3868// has a higher priority than the third one, so gets a socket first.
3869TEST_F(ClientSocketPoolBaseTest,
3870 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3871 CreatePool(2, 2);
3872 std::list<TestConnectJob::JobType> job_types;
3873 job_types.push_back(TestConnectJob::kMockJob);
3874 job_types.push_back(TestConnectJob::kMockJob);
3875 job_types.push_back(TestConnectJob::kMockJob);
3876 job_types.push_back(TestConnectJob::kMockJob);
3877 connect_job_factory_->set_job_types(&job_types);
3878
3879 ClientSocketHandle handle1;
3880 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203881 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543882 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203883 ClientSocketPool::RespectLimits::ENABLED,
3884 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203885
3886 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013887 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203888 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3889 .WillRepeatedly(Invoke(&mock_layered_pool,
3890 &MockLayeredPool::ReleaseOneConnection));
3891 mock_layered_pool.set_can_release_connection(false);
3892
3893 // The third request is made when the socket pool is in a stalled state.
3894 ClientSocketHandle handle3;
3895 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203896 EXPECT_EQ(
3897 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543898 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:203899 ClientSocketPool::RespectLimits::ENABLED,
3900 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203901
3902 base::RunLoop().RunUntilIdle();
3903 EXPECT_FALSE(callback3.have_result());
3904
3905 // The fourth request is made when the pool is no longer stalled. This
3906 // request has a higher priority than the third request, so is serviced first.
3907 mock_layered_pool.set_can_release_connection(true);
3908 ClientSocketHandle handle4;
3909 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203910 EXPECT_EQ(
3911 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543912 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:203913 ClientSocketPool::RespectLimits::ENABLED,
3914 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013915 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203916 EXPECT_FALSE(callback3.have_result());
3917
3918 // Closing a handle should free up another socket slot.
3919 handle1.Reset();
robpercival214763f2016-07-01 23:27:013920 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203921}
3922
3923TEST_F(ClientSocketPoolBaseTest,
3924 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3925 CreatePool(1, 1);
3926 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3927
3928 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013929 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203930 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3931 .WillRepeatedly(Invoke(&mock_layered_pool1,
3932 &MockLayeredPool::ReleaseOneConnection));
3933 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013934 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3935 IsOk());
[email protected]58e562f2013-04-22 17:32:203936 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3937 .WillRepeatedly(Invoke(&mock_layered_pool2,
3938 &MockLayeredPool::ReleaseOneConnection));
3939 ClientSocketHandle handle;
3940 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153941 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543942 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153943 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203944 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013945 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203946}
3947
[email protected]b021ece62013-06-11 11:06:333948// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153949// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3950// socket instead of a request with the same priority that was issued earlier,
3951// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333952TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333953 CreatePool(1, 1);
3954
3955 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153956 EXPECT_EQ(
3957 OK, StartRequestWithIgnoreLimits(
3958 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333959 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3960
3961 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3962
mmenked3641e12016-01-28 16:06:153963 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3964 "a", MAXIMUM_PRIORITY,
3965 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333966 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3967
mmenked3641e12016-01-28 16:06:153968 // Issue a request that ignores the limits, so a new ConnectJob is
3969 // created.
3970 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3971 "a", MAXIMUM_PRIORITY,
3972 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333973 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3974
robpercival214763f2016-07-01 23:27:013975 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333976 EXPECT_FALSE(request(1)->have_result());
3977}
3978
[email protected]c55fabd2013-11-04 23:26:563979// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153980// issued for a request with RespectLimits::DISABLED is not cancelled when a
3981// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563982TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563983 CreatePool(1, 1);
3984
3985 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153986 EXPECT_EQ(
3987 OK, StartRequestWithIgnoreLimits(
3988 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563989 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3990
3991 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3992
mmenked3641e12016-01-28 16:06:153993 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3994 "a", MAXIMUM_PRIORITY,
3995 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563996 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3997
mmenked3641e12016-01-28 16:06:153998 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
3999 // created.
4000 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4001 "a", MAXIMUM_PRIORITY,
4002 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334003 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4004
mmenked3641e12016-01-28 16:06:154005 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334006 // should not be cancelled.
4007 request(1)->handle()->Reset();
4008 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4009
robpercival214763f2016-07-01 23:27:014010 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334011 EXPECT_FALSE(request(1)->have_result());
4012}
4013
[email protected]f6d1d6eb2009-06-24 20:16:094014} // namespace
4015
4016} // namespace net