blob: 8b47087f6999ef82f44a0488b45fed9bae0e6fb3 [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"
[email protected]18b577412013-07-18 04:19:1519#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) {
[email protected]83039bb2011-12-09 18:43:55428 socket()->Connect(CompletionCallback());
[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,
532 const CompletionCallback& 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,
Paul Jensen8d6f87ec2018-01-13 00:46:54537 socket_tag, respect_limits, handle, callback,
538 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() {
645 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
646 it != waiting_jobs_.end(); ++it) {
647 (*it)->Signal();
648 }
649 waiting_jobs_.clear();
650}
651
[email protected]03b7c8c2013-07-20 04:38:55652void MockClientSocketFactory::SignalJob(size_t job) {
653 ASSERT_LT(job, waiting_jobs_.size());
654 waiting_jobs_[job]->Signal();
655 waiting_jobs_.erase(waiting_jobs_.begin() + job);
656}
657
658void MockClientSocketFactory::SetJobLoadState(size_t job,
659 LoadState load_state) {
660 ASSERT_LT(job, waiting_jobs_.size());
661 waiting_jobs_[job]->set_load_state(load_state);
662}
663
[email protected]974ebd62009-08-03 23:14:34664class TestConnectJobDelegate : public ConnectJob::Delegate {
665 public:
666 TestConnectJobDelegate()
667 : have_result_(false), waiting_for_result_(false), result_(OK) {}
Chris Watkins7a41d3552017-12-01 02:13:27668 ~TestConnectJobDelegate() override = default;
[email protected]974ebd62009-08-03 23:14:34669
dchengb03027d2014-10-21 12:00:20670 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34671 result_ = result;
danakj655b66c2016-04-16 00:51:38672 std::unique_ptr<ConnectJob> owned_job(job);
673 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07674 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44675 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34676 have_result_ = true;
677 if (waiting_for_result_)
Gabriel Charette53a9ef812017-07-26 12:36:23678 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]974ebd62009-08-03 23:14:34679 }
680
681 int WaitForResult() {
682 DCHECK(!waiting_for_result_);
683 while (!have_result_) {
684 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28685 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34686 waiting_for_result_ = false;
687 }
688 have_result_ = false; // auto-reset for next callback
689 return result_;
690 }
691
692 private:
693 bool have_result_;
694 bool waiting_for_result_;
695 int result_;
696};
697
Bence Béky98447b12018-05-08 03:14:01698class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09699 protected:
mmenked3641e12016-01-28 16:06:15700 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54701 connect_backup_jobs_enabled_ =
702 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
703 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
704 }
[email protected]2431756e2010-09-29 20:26:13705
dcheng67be2b1f2014-10-27 21:47:29706 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54707 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
708 connect_backup_jobs_enabled_);
709 }
[email protected]c9d6a1d2009-07-14 16:15:20710
[email protected]211d21722009-07-22 15:48:53711 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16712 CreatePoolWithIdleTimeouts(
713 max_sockets,
714 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30715 ClientSocketPool::unused_idle_socket_timeout(),
716 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16717 }
718
719 void CreatePoolWithIdleTimeouts(
720 int max_sockets, int max_sockets_per_group,
721 base::TimeDelta unused_idle_socket_timeout,
722 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20723 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48724 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
725 &net_log_);
[email protected]2431756e2010-09-29 20:26:13726 pool_.reset(new TestClientSocketPool(max_sockets,
727 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13728 unused_idle_socket_timeout,
729 used_idle_socket_timeout,
730 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20731 }
[email protected]f6d1d6eb2009-06-24 20:16:09732
mmenked3641e12016-01-28 16:06:15733 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33734 const std::string& group_name,
735 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15736 ClientSocketPool::RespectLimits respect_limits) {
737 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
738 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33739 }
740
741 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15742 return StartRequestWithIgnoreLimits(
743 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09744 }
745
[email protected]2431756e2010-09-29 20:26:13746 int GetOrderOfRequest(size_t index) const {
747 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09748 }
749
[email protected]2431756e2010-09-29 20:26:13750 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
751 return test_base_.ReleaseOneConnection(keep_alive);
752 }
753
754 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
755 test_base_.ReleaseAllConnections(keep_alive);
756 }
757
758 TestSocketRequest* request(int i) { return test_base_.request(i); }
759 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38760 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42761 return test_base_.requests();
762 }
rdsmith29dbad12017-02-17 02:22:18763 // Only counts the requests that get sockets asynchronously;
764 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13765 size_t completion_count() const { return test_base_.completion_count(); }
766
vishal.b62985ca92015-04-17 08:45:51767 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54768 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09769 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04770 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21771 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38772 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13773 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09774};
775
[email protected]974ebd62009-08-03 23:14:34776// Even though a timeout is specified, it doesn't time out on a synchronous
777// completion.
778TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
779 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06780 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49781 TestClientSocketPoolBase::Request request(
Paul Jensen8d6f87ec2018-01-13 00:46:54782 &ignored, CompletionCallback(), DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15783 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20784 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
785 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38786 std::unique_ptr<TestConnectJob> job(
787 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
788 base::TimeDelta::FromMicroseconds(1), &delegate,
789 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01790 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34791}
792
793TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
794 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06795 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51796 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53797
[email protected]d80a4322009-08-14 07:07:49798 TestClientSocketPoolBase::Request request(
Paul Jensen8d6f87ec2018-01-13 00:46:54799 &ignored, CompletionCallback(), DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15800 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20801 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
802 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34803 // Deleted by TestConnectJobDelegate.
804 TestConnectJob* job =
805 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12806 "a",
[email protected]974ebd62009-08-03 23:14:34807 request,
808 base::TimeDelta::FromMicroseconds(1),
809 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30810 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17811 &log);
robpercival214763f2016-07-01 23:27:01812 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00813 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01814 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30815
mmenke43758e62015-05-04 21:09:46816 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40817 log.GetEntries(&entries);
818
819 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00820 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
821 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46822 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00823 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
824 EXPECT_TRUE(LogContainsEvent(entries, 2,
825 NetLogEventType::CONNECT_JOB_SET_SOCKET,
826 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46827 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00828 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
829 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46830 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00831 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
832 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
833 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34834}
835
[email protected]5fc08e32009-07-15 17:09:57836TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53837 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20838
[email protected]6ecf2b92011-12-15 01:14:52839 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06840 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51841 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48842 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53843
Paul Jensen8d6f87ec2018-01-13 00:46:54844 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15845 ClientSocketPool::RespectLimits::ENABLED,
846 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09847 EXPECT_TRUE(handle.is_initialized());
848 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48849 TestLoadTimingInfoConnectedNotReused(handle);
850
[email protected]f6d1d6eb2009-06-24 20:16:09851 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48852 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30853
mmenke43758e62015-05-04 21:09:46854 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40855 log.GetEntries(&entries);
856
857 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00858 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53859 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00860 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
861 NetLogEventPhase::NONE));
862 EXPECT_TRUE(LogContainsEvent(entries, 2,
863 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
864 NetLogEventPhase::NONE));
865 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09866}
867
[email protected]ab838892009-06-30 18:49:05868TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20870
[email protected]ab838892009-06-30 18:49:05871 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51872 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53873
[email protected]2431756e2010-09-29 20:26:13874 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52875 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18876 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13877 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43878 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45879 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13880 handle.set_ssl_error_response_info(info);
881 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:54882 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15883 ClientSocketPool::RespectLimits::ENABLED,
884 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13885 EXPECT_FALSE(handle.socket());
886 EXPECT_FALSE(handle.is_ssl_error());
887 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48888 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30889
mmenke43758e62015-05-04 21:09:46890 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40891 log.GetEntries(&entries);
892
893 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00894 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17895 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00896 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
897 NetLogEventPhase::NONE));
898 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09899}
900
[email protected]211d21722009-07-22 15:48:53901TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
902 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
903
[email protected]9e743cd2010-03-16 07:03:53904 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30905
robpercival214763f2016-07-01 23:27:01906 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
907 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
908 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
909 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53910
[email protected]2431756e2010-09-29 20:26:13911 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53912 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13913 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53914
robpercival214763f2016-07-01 23:27:01915 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
916 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
917 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53918
[email protected]2431756e2010-09-29 20:26:13919 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53920
[email protected]2431756e2010-09-29 20:26:13921 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53922 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13923 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53924
925 EXPECT_EQ(1, GetOrderOfRequest(1));
926 EXPECT_EQ(2, GetOrderOfRequest(2));
927 EXPECT_EQ(3, GetOrderOfRequest(3));
928 EXPECT_EQ(4, GetOrderOfRequest(4));
929 EXPECT_EQ(5, GetOrderOfRequest(5));
930 EXPECT_EQ(6, GetOrderOfRequest(6));
931 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17932
933 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13934 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53935}
936
937TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
938 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
939
[email protected]9e743cd2010-03-16 07:03:53940 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30941
[email protected]211d21722009-07-22 15:48:53942 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01943 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
944 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
945 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
946 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53947
[email protected]2431756e2010-09-29 20:26:13948 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53949 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13950 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53951
952 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01953 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53956
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53958 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13959 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53960
961 EXPECT_EQ(1, GetOrderOfRequest(1));
962 EXPECT_EQ(2, GetOrderOfRequest(2));
963 EXPECT_EQ(3, GetOrderOfRequest(3));
964 EXPECT_EQ(4, GetOrderOfRequest(4));
965 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17966
967 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13968 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53969}
970
971TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
972 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
973
robpercival214763f2016-07-01 23:27:01974 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
975 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
976 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
977 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53978
[email protected]2431756e2010-09-29 20:26:13979 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53980 client_socket_factory_.allocation_count());
981
robpercival214763f2016-07-01 23:27:01982 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
983 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
984 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53985
[email protected]2431756e2010-09-29 20:26:13986 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53987
[email protected]2431756e2010-09-29 20:26:13988 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53989
990 // First 4 requests don't have to wait, and finish in order.
991 EXPECT_EQ(1, GetOrderOfRequest(1));
992 EXPECT_EQ(2, GetOrderOfRequest(2));
993 EXPECT_EQ(3, GetOrderOfRequest(3));
994 EXPECT_EQ(4, GetOrderOfRequest(4));
995
[email protected]ac790b42009-12-02 04:31:31996 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
997 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53998 EXPECT_EQ(7, GetOrderOfRequest(5));
999 EXPECT_EQ(6, GetOrderOfRequest(6));
1000 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171001
1002 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131003 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531004}
1005
rdsmith29dbad12017-02-17 02:22:181006// Test reprioritizing a request before completion doesn't interfere with
1007// its completion.
1008TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1009 CreatePool(kDefaultMaxSockets, 1);
1010
1011 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1012 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1013 EXPECT_TRUE(request(0)->handle()->socket());
1014 EXPECT_FALSE(request(1)->handle()->socket());
1015
1016 request(1)->handle()->SetPriority(MEDIUM);
1017
1018 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1019
1020 EXPECT_TRUE(request(1)->handle()->socket());
1021}
1022
1023// Reprioritize a request up past another one and make sure that changes the
1024// completion order.
1025TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1026 CreatePool(kDefaultMaxSockets, 1);
1027
1028 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1029 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1030 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1031 EXPECT_TRUE(request(0)->handle()->socket());
1032 EXPECT_FALSE(request(1)->handle()->socket());
1033 EXPECT_FALSE(request(2)->handle()->socket());
1034
1035 request(2)->handle()->SetPriority(HIGHEST);
1036
1037 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1038
1039 EXPECT_EQ(1, GetOrderOfRequest(1));
1040 EXPECT_EQ(3, GetOrderOfRequest(2));
1041 EXPECT_EQ(2, GetOrderOfRequest(3));
1042}
1043
1044// Reprioritize a request without changing relative priorities and check
1045// that the order doesn't change.
1046TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1047 CreatePool(kDefaultMaxSockets, 1);
1048
1049 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1050 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1051 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1052 EXPECT_TRUE(request(0)->handle()->socket());
1053 EXPECT_FALSE(request(1)->handle()->socket());
1054 EXPECT_FALSE(request(2)->handle()->socket());
1055
1056 request(2)->handle()->SetPriority(MEDIUM);
1057
1058 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1059
1060 EXPECT_EQ(1, GetOrderOfRequest(1));
1061 EXPECT_EQ(2, GetOrderOfRequest(2));
1062 EXPECT_EQ(3, GetOrderOfRequest(3));
1063}
1064
1065// Reprioritize a request past down another one and make sure that changes the
1066// completion order.
1067TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1068 CreatePool(kDefaultMaxSockets, 1);
1069
1070 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1071 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1072 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1073 EXPECT_TRUE(request(0)->handle()->socket());
1074 EXPECT_FALSE(request(1)->handle()->socket());
1075 EXPECT_FALSE(request(2)->handle()->socket());
1076
1077 request(1)->handle()->SetPriority(LOW);
1078
1079 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1080
1081 EXPECT_EQ(1, GetOrderOfRequest(1));
1082 EXPECT_EQ(3, GetOrderOfRequest(2));
1083 EXPECT_EQ(2, GetOrderOfRequest(3));
1084}
1085
1086// Reprioritize a request to the same level as another and confirm it is
1087// put after the old request.
1088TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1089 CreatePool(kDefaultMaxSockets, 1);
1090
1091 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1092 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1093 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1094 EXPECT_TRUE(request(0)->handle()->socket());
1095 EXPECT_FALSE(request(1)->handle()->socket());
1096 EXPECT_FALSE(request(2)->handle()->socket());
1097
1098 request(1)->handle()->SetPriority(MEDIUM);
1099
1100 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1101
1102 EXPECT_EQ(1, GetOrderOfRequest(1));
1103 EXPECT_EQ(3, GetOrderOfRequest(2));
1104 EXPECT_EQ(2, GetOrderOfRequest(3));
1105}
1106
[email protected]211d21722009-07-22 15:48:531107TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1108 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1109
robpercival214763f2016-07-01 23:27:011110 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1111 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1112 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1113 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531114
[email protected]2431756e2010-09-29 20:26:131115 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531116 client_socket_factory_.allocation_count());
1117
robpercival214763f2016-07-01 23:27:011118 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1119 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1120 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531121
[email protected]2431756e2010-09-29 20:26:131122 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531123
[email protected]2431756e2010-09-29 20:26:131124 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531125 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131126 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531127
1128 // First 4 requests don't have to wait, and finish in order.
1129 EXPECT_EQ(1, GetOrderOfRequest(1));
1130 EXPECT_EQ(2, GetOrderOfRequest(2));
1131 EXPECT_EQ(3, GetOrderOfRequest(3));
1132 EXPECT_EQ(4, GetOrderOfRequest(4));
1133
1134 // Request ("b", 7) has the highest priority, but we can't make new socket for
1135 // group "b", because it has reached the per-group limit. Then we make
1136 // socket for ("c", 6), because it has higher priority than ("a", 4),
1137 // and we still can't make a socket for group "b".
1138 EXPECT_EQ(5, GetOrderOfRequest(5));
1139 EXPECT_EQ(6, GetOrderOfRequest(6));
1140 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171141
1142 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131143 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531144}
1145
1146// Make sure that we count connecting sockets against the total limit.
1147TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1148 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1149
robpercival214763f2016-07-01 23:27:011150 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1151 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1152 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531153
1154 // Create one asynchronous request.
1155 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011156 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531157
[email protected]6b175382009-10-13 06:47:471158 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1159 // actually become pending until 2ms after they have been created. In order
1160 // to flush all tasks, we need to wait so that we know there are no
1161 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001162 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281163 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471164
[email protected]211d21722009-07-22 15:48:531165 // The next synchronous request should wait for its turn.
1166 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011167 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531168
[email protected]2431756e2010-09-29 20:26:131169 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531170
[email protected]2431756e2010-09-29 20:26:131171 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531172 client_socket_factory_.allocation_count());
1173
1174 EXPECT_EQ(1, GetOrderOfRequest(1));
1175 EXPECT_EQ(2, GetOrderOfRequest(2));
1176 EXPECT_EQ(3, GetOrderOfRequest(3));
1177 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171178 EXPECT_EQ(5, GetOrderOfRequest(5));
1179
1180 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131181 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531182}
1183
[email protected]6427fe22010-04-16 22:27:411184TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1185 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1186 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1187
robpercival214763f2016-07-01 23:27:011188 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1189 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1190 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1191 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411192
1193 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1194
1195 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1196
robpercival214763f2016-07-01 23:27:011197 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1198 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411199
1200 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1201
[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 + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131204 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411205 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131206 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1207 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411208 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1209}
1210
[email protected]d7027bb2010-05-10 18:58:541211TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1212 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1213 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1214
1215 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521216 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131217 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541218 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151219 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201220 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541221
1222 ClientSocketHandle handles[4];
1223 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521224 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201225 EXPECT_EQ(
1226 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541227 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201228 ClientSocketPool::RespectLimits::ENABLED,
1229 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541230 }
1231
1232 // One will be stalled, cancel all the handles now.
1233 // This should hit the OnAvailableSocketSlot() code where we previously had
1234 // stalled groups, but no longer have any.
1235 for (size_t i = 0; i < arraysize(handles); ++i)
1236 handles[i].Reset();
1237}
1238
[email protected]eb5a99382010-07-11 03:18:261239TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541240 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1241 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1242
[email protected]eb5a99382010-07-11 03:18:261243 {
1244 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521245 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261246 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:541247 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), params_,
1248 DEFAULT_PRIORITY, SocketTag(),
1249 ClientSocketPool::RespectLimits::ENABLED,
1250 callbacks[i].callback(), pool_.get(),
1251 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261252 }
1253
1254 // Force a stalled group.
1255 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521256 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201257 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541258 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201259 ClientSocketPool::RespectLimits::ENABLED,
1260 callback.callback(), pool_.get(),
1261 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261262
1263 // Cancel the stalled request.
1264 stalled_handle.Reset();
1265
1266 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1267 EXPECT_EQ(0, pool_->IdleSocketCount());
1268
1269 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541270 }
1271
[email protected]43a21b82010-06-10 21:30:541272 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1273 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261274}
[email protected]43a21b82010-06-10 21:30:541275
[email protected]eb5a99382010-07-11 03:18:261276TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1277 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1278 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1279
1280 {
1281 ClientSocketHandle handles[kDefaultMaxSockets];
1282 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521283 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201284 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541285 handles[i].Init(
1286 base::IntToString(i), params_, DEFAULT_PRIORITY,
1287 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1288 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261289 }
1290
1291 // Force a stalled group.
1292 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1293 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521294 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201295 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541296 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201297 ClientSocketPool::RespectLimits::ENABLED,
1298 callback.callback(), pool_.get(),
1299 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261300
1301 // Since it is stalled, it should have no connect jobs.
1302 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101303 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261304
1305 // Cancel the stalled request.
1306 handles[0].Reset();
1307
[email protected]eb5a99382010-07-11 03:18:261308 // Now we should have a connect job.
1309 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101310 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261311
1312 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011313 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261314
1315 EXPECT_EQ(kDefaultMaxSockets + 1,
1316 client_socket_factory_.allocation_count());
1317 EXPECT_EQ(0, pool_->IdleSocketCount());
1318 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101319 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261320
1321 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541322 }
1323
[email protected]eb5a99382010-07-11 03:18:261324 EXPECT_EQ(1, pool_->IdleSocketCount());
1325}
[email protected]43a21b82010-06-10 21:30:541326
[email protected]eb5a99382010-07-11 03:18:261327TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1328 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1329 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541330
[email protected]eb5a99382010-07-11 03:18:261331 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521332 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261333 {
[email protected]51fdc7c2012-04-10 19:19:481334 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261335 ClientSocketHandle handles[kDefaultMaxSockets];
1336 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521337 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201338 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541339 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201340 ClientSocketPool::RespectLimits::ENABLED,
1341 callback.callback(), pool_.get(),
1342 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261343 }
1344
1345 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1346 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481347 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261348
1349 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201350 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541351 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201352 ClientSocketPool::RespectLimits::ENABLED,
1353 callback.callback(), pool_.get(),
1354 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481355 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261356
1357 // Dropping out of scope will close all handles and return them to idle.
1358 }
[email protected]43a21b82010-06-10 21:30:541359
1360 // But if we wait for it, the released idle sockets will be closed in
1361 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011362 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261363
1364 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1365 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541366}
1367
1368// Regression test for http://crbug.com/40952.
1369TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1370 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221371 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541372 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1373
1374 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1375 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521376 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201377 EXPECT_EQ(
1378 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541379 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201380 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541381 }
1382
1383 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281384 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541385
1386 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1387 // reuse a socket.
1388 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1389 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521390 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541391
1392 // "0" is special here, since it should be the first entry in the sorted map,
1393 // which is the one which we would close an idle socket for. We shouldn't
1394 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201395 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:541396 handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201397 ClientSocketPool::RespectLimits::ENABLED,
1398 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541399
1400 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1401 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1402}
1403
[email protected]ab838892009-06-30 18:49:051404TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531405 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091406
robpercival214763f2016-07-01 23:27:011407 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1408 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1409 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1410 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1411 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1412 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1413 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1414 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091415
[email protected]2431756e2010-09-29 20:26:131416 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201417 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1418 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131419 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1420 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091421
[email protected]c9d6a1d2009-07-14 16:15:201422 EXPECT_EQ(1, GetOrderOfRequest(1));
1423 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031424 EXPECT_EQ(8, GetOrderOfRequest(3));
1425 EXPECT_EQ(6, GetOrderOfRequest(4));
1426 EXPECT_EQ(4, GetOrderOfRequest(5));
1427 EXPECT_EQ(3, GetOrderOfRequest(6));
1428 EXPECT_EQ(5, GetOrderOfRequest(7));
1429 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171430
1431 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131432 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091433}
1434
[email protected]ab838892009-06-30 18:49:051435TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531436 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091437
robpercival214763f2016-07-01 23:27:011438 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1439 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1440 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1441 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1442 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1443 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1444 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091445
[email protected]2431756e2010-09-29 20:26:131446 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091447
[email protected]2431756e2010-09-29 20:26:131448 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011449 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201450
[email protected]2431756e2010-09-29 20:26:131451 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201452 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131453 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1454 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091455}
1456
1457// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051458// The pending connect job will be cancelled and should not call back into
1459// ClientSocketPoolBase.
1460TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531461 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201462
[email protected]ab838892009-06-30 18:49:051463 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131464 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521465 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151466 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541467 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151468 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201469 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131470 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091471}
1472
[email protected]ab838892009-06-30 18:49:051473TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531474 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201475
[email protected]ab838892009-06-30 18:49:051476 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061477 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521478 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091479
mmenked3641e12016-01-28 16:06:151480 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541481 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151482 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201483 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091484
1485 handle.Reset();
1486
[email protected]6ecf2b92011-12-15 01:14:521487 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131488 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541489 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151490 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201491 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091492
robpercival214763f2016-07-01 23:27:011493 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091494 EXPECT_FALSE(callback.have_result());
1495
1496 handle.Reset();
1497}
1498
[email protected]ab838892009-06-30 18:49:051499TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531500 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091501
robpercival214763f2016-07-01 23:27:011502 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1503 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1504 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1505 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1506 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1507 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1508 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091509
1510 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201511 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131512 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1513 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091514
[email protected]2431756e2010-09-29 20:26:131515 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091516
[email protected]c9d6a1d2009-07-14 16:15:201517 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1518 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131519 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1520 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091521
[email protected]c9d6a1d2009-07-14 16:15:201522 EXPECT_EQ(1, GetOrderOfRequest(1));
1523 EXPECT_EQ(2, GetOrderOfRequest(2));
1524 EXPECT_EQ(5, GetOrderOfRequest(3));
1525 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131526 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1527 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201528 EXPECT_EQ(4, GetOrderOfRequest(6));
1529 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171530
1531 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131532 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091533}
1534
mmenke33d24423d2015-05-19 19:41:091535// Function to be used as a callback on socket request completion. It first
1536// disconnects the successfully connected socket from the first request, and
1537// then reuses the ClientSocketHandle to request another socket.
1538//
1539// |nested_callback| is called with the result of the second socket request.
1540void RequestSocketOnComplete(ClientSocketHandle* handle,
1541 TestClientSocketPool* pool,
1542 TestConnectJobFactory* test_connect_job_factory,
1543 TestConnectJob::JobType next_job_type,
1544 const CompletionCallback& nested_callback,
1545 int first_request_result) {
robpercival214763f2016-07-01 23:27:011546 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091547
1548 test_connect_job_factory->set_job_type(next_job_type);
1549
1550 // Don't allow reuse of the socket. Disconnect it and then release it.
1551 if (handle->socket())
1552 handle->socket()->Disconnect();
1553 handle->Reset();
1554
mmenked3641e12016-01-28 16:06:151555 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091556 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541557 int rv = handle->Init("a", params, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151558 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201559 nested_callback, pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091560 if (rv != ERR_IO_PENDING) {
1561 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1562 nested_callback.Run(rv);
1563 } else {
1564 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521565 }
mmenke33d24423d2015-05-19 19:41:091566}
[email protected]f6d1d6eb2009-06-24 20:16:091567
mmenke33d24423d2015-05-19 19:41:091568// Tests the case where a second socket is requested in a completion callback,
1569// and the second socket connects asynchronously. Reuses the same
1570// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581571TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531572 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201573
[email protected]0b7648c2009-07-06 20:14:011574 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061575 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091576 TestCompletionCallback second_result_callback;
1577 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541578 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1579 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091580 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1581 connect_job_factory_, TestConnectJob::kMockPendingJob,
1582 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201583 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011584 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091585
robpercival214763f2016-07-01 23:27:011586 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581587}
[email protected]f6d1d6eb2009-06-24 20:16:091588
mmenke33d24423d2015-05-19 19:41:091589// Tests the case where a second socket is requested in a completion callback,
1590// and the second socket connects synchronously. Reuses the same
1591// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581592TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531593 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201594
[email protected]0b7648c2009-07-06 20:14:011595 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061596 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091597 TestCompletionCallback second_result_callback;
1598 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541599 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1600 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091601 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1602 connect_job_factory_, TestConnectJob::kMockPendingJob,
1603 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201604 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011605 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581606
robpercival214763f2016-07-01 23:27:011607 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091608}
1609
1610// Make sure that pending requests get serviced after active requests get
1611// cancelled.
[email protected]ab838892009-06-30 18:49:051612TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531613 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201614
[email protected]0b7648c2009-07-06 20:14:011615 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091616
robpercival214763f2016-07-01 23:27:011617 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));
1622 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1623 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091624
[email protected]c9d6a1d2009-07-14 16:15:201625 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1626 // Let's cancel them.
1627 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131628 ASSERT_FALSE(request(i)->handle()->is_initialized());
1629 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091630 }
1631
[email protected]f6d1d6eb2009-06-24 20:16:091632 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131633 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011634 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131635 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091636 }
1637
[email protected]2431756e2010-09-29 20:26:131638 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1639 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091640}
1641
1642// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051643TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531644 const size_t kMaxSockets = 5;
1645 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201646
[email protected]0b7648c2009-07-06 20:14:011647 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091648
[email protected]211d21722009-07-22 15:48:531649 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1650 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091651
1652 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531653 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011654 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091655
[email protected]211d21722009-07-22 15:48:531656 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011657 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091658}
1659
mmenke9d72fe42017-05-18 22:36:071660// Make sure that pending requests that complete synchronously get serviced
1661// after active requests fail. See https://crbug.com/723748
1662TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1663 const size_t kNumberOfRequests = 10;
1664 const size_t kMaxSockets = 1;
1665 CreatePool(kMaxSockets, kMaxSockets);
1666
1667 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1668
1669 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1670
1671 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1672
1673 // Queue up all the other requests
1674 for (size_t i = 1; i < kNumberOfRequests; ++i)
1675 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1676
1677 // Make sure all requests fail, instead of hanging.
1678 for (size_t i = 0; i < kNumberOfRequests; ++i)
1679 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1680}
1681
[email protected]5fc08e32009-07-15 17:09:571682TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531683 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571684
1685 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1686
[email protected]2431756e2010-09-29 20:26:131687 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521688 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541689 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151690 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201691 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011692 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571693
1694 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131695 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571696
Paul Jensen8d6f87ec2018-01-13 00:46:541697 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151698 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201699 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011700 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1701 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571702
[email protected]2431756e2010-09-29 20:26:131703 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481704 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571705 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1706}
1707
xunjieli26619e72016-11-23 19:39:551708TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551709 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1710 ClientSocketHandle handle;
1711 TestCompletionCallback callback;
1712 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541713 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551714 ClientSocketPool::RespectLimits::ENABLED,
1715 callback.callback(), pool_.get(), log.bound());
1716 EXPECT_THAT(rv, IsOk());
1717 handle.Reset();
1718 EXPECT_EQ(1, pool_->IdleSocketCount());
1719 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551720}
1721
xunjieli92feb332017-03-03 17:19:231722TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231723 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1724 TestCompletionCallback callback;
1725 BoundTestNetLog log;
1726 ClientSocketHandle handle1;
Paul Jensen8d6f87ec2018-01-13 00:46:541727 int rv = handle1.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231728 ClientSocketPool::RespectLimits::ENABLED,
1729 callback.callback(), pool_.get(), log.bound());
1730 EXPECT_THAT(rv, IsOk());
1731 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541732 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231733 ClientSocketPool::RespectLimits::ENABLED,
1734 callback.callback(), pool_.get(), log.bound());
1735 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541736 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231737 ClientSocketPool::RespectLimits::ENABLED,
1738 callback.callback(), pool_.get(), log.bound());
1739 EXPECT_THAT(rv, IsOk());
1740 handle1.Reset();
1741 handle2.Reset();
1742 handle3.Reset();
1743 EXPECT_EQ(3, pool_->IdleSocketCount());
1744 pool_->CloseIdleSocketsInGroup("a");
1745 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231746}
1747
xunjieli26619e72016-11-23 19:39:551748TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551749 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1750 ClientSocketHandle handle;
1751 TestCompletionCallback callback;
1752 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541753 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551754 ClientSocketPool::RespectLimits::ENABLED,
1755 callback.callback(), pool_.get(), log.bound());
1756 EXPECT_THAT(rv, IsOk());
1757 StreamSocket* socket = handle.socket();
1758 handle.Reset();
1759 EXPECT_EQ(1, pool_->IdleSocketCount());
1760
1761 // Disconnect socket now to make the socket unusable.
1762 socket->Disconnect();
1763 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541764 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551765 ClientSocketPool::RespectLimits::ENABLED,
1766 callback.callback(), pool_.get(), log.bound());
1767 EXPECT_THAT(rv, IsOk());
1768 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551769}
1770
[email protected]2b7523d2009-07-29 20:29:231771// Regression test for http://crbug.com/17985.
1772TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1773 const int kMaxSockets = 3;
1774 const int kMaxSocketsPerGroup = 2;
1775 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1776
[email protected]ac790b42009-12-02 04:31:311777 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231778
robpercival214763f2016-07-01 23:27:011779 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1780 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231781
1782 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011783 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231784
1785 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011786 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231787
1788 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011789 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1790 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231791
[email protected]eb5a99382010-07-11 03:18:261792 // Release the first two sockets from "a". Because this is a keepalive,
1793 // the first release will unblock the pending request for "a". The
1794 // second release will unblock a request for "c", becaue it is the next
1795 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131796 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1797 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231798
1799 // Closing idle sockets should not get us into trouble, but in the bug
1800 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411801 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541802 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261803
[email protected]2da659e2013-05-23 20:51:341804 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281805 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231806}
1807
[email protected]4d3b05d2010-01-27 21:27:291808TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531809 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571810
1811 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131812 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521813 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511814 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541815 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151816 ClientSocketPool::RespectLimits::ENABLED,
1817 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011818 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131819 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481820 TestLoadTimingInfoNotConnected(handle);
1821
robpercival214763f2016-07-01 23:27:011822 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131823 EXPECT_TRUE(handle.is_initialized());
1824 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481825 TestLoadTimingInfoConnectedNotReused(handle);
1826
[email protected]2431756e2010-09-29 20:26:131827 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481828 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301829
mmenke43758e62015-05-04 21:09:461830 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401831 log.GetEntries(&entries);
1832
1833 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001834 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171835 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001836 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1837 NetLogEventPhase::NONE));
1838 EXPECT_TRUE(LogContainsEvent(entries, 2,
1839 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1840 NetLogEventPhase::NONE));
1841 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571842}
1843
[email protected]4d3b05d2010-01-27 21:27:291844TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571845 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531846 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571847
1848 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131849 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521850 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511851 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181852 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131853 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431854 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451855 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131856 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151857 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541858 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151859 ClientSocketPool::RespectLimits::ENABLED,
1860 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131861 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011862 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131863 EXPECT_FALSE(handle.is_ssl_error());
1864 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301865
mmenke43758e62015-05-04 21:09:461866 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401867 log.GetEntries(&entries);
1868
1869 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001870 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171871 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001872 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1873 NetLogEventPhase::NONE));
1874 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571875}
1876
mmenke6be122f2015-03-09 22:22:471877// Check that an async ConnectJob failure does not result in creation of a new
1878// ConnectJob when there's another pending request also waiting on its own
1879// ConnectJob. See http://crbug.com/463960.
1880TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1881 CreatePool(2, 2);
1882 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1883
robpercival214763f2016-07-01 23:27:011884 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1885 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471886
robpercival214763f2016-07-01 23:27:011887 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1888 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471889
1890 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1891}
1892
[email protected]4d3b05d2010-01-27 21:27:291893TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101894 // TODO(eroman): Add back the log expectations! Removed them because the
1895 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531896 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571897
1898 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131899 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521900 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131901 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521902 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571903
[email protected]2431756e2010-09-29 20:26:131904 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541905 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151906 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201907 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511908 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201909 EXPECT_EQ(
1910 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541911 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201912 ClientSocketPool::RespectLimits::ENABLED,
1913 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571914
[email protected]2431756e2010-09-29 20:26:131915 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571916
[email protected]fd7b7c92009-08-20 19:38:301917
1918 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301919
robpercival214763f2016-07-01 23:27:011920 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131921 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301922
1923 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531924 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571925}
1926
[email protected]4d3b05d2010-01-27 21:27:291927TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341928 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1929
[email protected]17a0c6c2009-08-04 00:07:041930 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1931
robpercival214763f2016-07-01 23:27:011932 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1933 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1934 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1935 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341936
1937 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131938 (*requests())[2]->handle()->Reset();
1939 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341940 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1941
[email protected]2431756e2010-09-29 20:26:131942 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341943 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1944
[email protected]2431756e2010-09-29 20:26:131945 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261946 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341947}
1948
[email protected]5fc08e32009-07-15 17:09:571949// When requests and ConnectJobs are not coupled, the request will get serviced
1950// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291951TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571953
1954 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321955 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571956
[email protected]2431756e2010-09-29 20:26:131957 std::vector<TestSocketRequest*> request_order;
1958 size_t completion_count; // unused
1959 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541960 int rv =
1961 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1962 ClientSocketPool::RespectLimits::ENABLED,
1963 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011964 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1965 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571966
1967 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1968 // without a job.
1969 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1970
[email protected]2431756e2010-09-29 20:26:131971 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541972 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151973 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201974 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011975 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131976 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541977 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151978 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201979 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011980 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571981
1982 // Both Requests 2 and 3 are pending. We release socket 1 which should
1983 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331984 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341985 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281986 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331987 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011988 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331989 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571990
1991 // Signal job 2, which should service request 3.
1992
1993 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011994 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571995
[email protected]2431756e2010-09-29 20:26:131996 ASSERT_EQ(3U, request_order.size());
1997 EXPECT_EQ(&req1, request_order[0]);
1998 EXPECT_EQ(&req2, request_order[1]);
1999 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572000 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2001}
2002
2003// The requests are not coupled to the jobs. So, the requests should finish in
2004// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292005TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532006 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572007 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322008 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572009
[email protected]2431756e2010-09-29 20:26:132010 std::vector<TestSocketRequest*> request_order;
2011 size_t completion_count; // unused
2012 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542013 int rv =
2014 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2015 ClientSocketPool::RespectLimits::ENABLED,
2016 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012017 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572018
[email protected]2431756e2010-09-29 20:26:132019 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542020 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152021 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202022 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012023 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572024
2025 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322026 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572027
[email protected]2431756e2010-09-29 20:26:132028 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542029 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152030 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202031 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012032 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572033
robpercival214763f2016-07-01 23:27:012034 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2035 EXPECT_THAT(req2.WaitForResult(), IsOk());
2036 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572037
[email protected]2431756e2010-09-29 20:26:132038 ASSERT_EQ(3U, request_order.size());
2039 EXPECT_EQ(&req1, request_order[0]);
2040 EXPECT_EQ(&req2, request_order[1]);
2041 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572042}
2043
[email protected]03b7c8c2013-07-20 04:38:552044// Test GetLoadState in the case there's only one socket request.
2045TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532046 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552047 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572048
[email protected]2431756e2010-09-29 20:26:132049 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522050 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542051 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152052 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202053 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012054 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552055 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572056
[email protected]03b7c8c2013-07-20 04:38:552057 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2058 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2059
2060 // No point in completing the connection, since ClientSocketHandles only
2061 // expect the LoadState to be checked while connecting.
2062}
2063
2064// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002065// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552066TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2067 CreatePool(2, 2);
2068 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2069
2070 ClientSocketHandle handle;
2071 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542072 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152073 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202074 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012075 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002076 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2077
2078 ClientSocketHandle handle2;
2079 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542080 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152081 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202082 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012083 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002084 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2085
2086 // Check that both handles report the state of the first job.
2087 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2088 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2089
2090 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2091
2092 // Check that both handles change to LOAD_STATE_CONNECTING.
2093 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2094 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2095}
2096
2097// Test that the second connection request does not affect the pool's load
2098// status.
2099TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2100 CreatePool(2, 2);
2101 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2102
2103 ClientSocketHandle handle;
2104 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542105 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152106 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202107 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012108 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572109
[email protected]2431756e2010-09-29 20:26:132110 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522111 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542112 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152113 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202114 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012115 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002116 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552117
[email protected]03b7c8c2013-07-20 04:38:552118 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2119 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2120
haavardm835c1d62015-04-22 08:18:002121 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552122 // second handle switches to the state of the remaining ConnectJob.
2123 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012124 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002125 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552126}
2127
2128// Test GetLoadState in the case the per-group limit is reached.
2129TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2130 CreatePool(2, 1);
2131 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2132
2133 ClientSocketHandle handle;
2134 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542135 int rv = handle.Init("a", params_, MEDIUM, SocketTag(),
mmenked3641e12016-01-28 16:06:152136 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202137 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012138 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552139 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2140
2141 // Request another socket from the same pool, buth with a higher priority.
2142 // The first request should now be stalled at the socket group limit.
2143 ClientSocketHandle handle2;
2144 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542145 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152146 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202147 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012148 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552149 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2150 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2151
2152 // The first handle should remain stalled as the other socket goes through
2153 // the connect process.
2154
2155 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2156 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2157 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2158
2159 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012160 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552161 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2162
2163 // Closing the second socket should cause the stalled handle to finally get a
2164 // ConnectJob.
2165 handle2.socket()->Disconnect();
2166 handle2.Reset();
2167 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2168}
2169
2170// Test GetLoadState in the case the per-pool limit is reached.
2171TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2172 CreatePool(2, 2);
2173 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2174
2175 ClientSocketHandle handle;
2176 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542177 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152178 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202179 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012180 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552181
2182 // Request for socket from another pool.
2183 ClientSocketHandle handle2;
2184 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542185 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152186 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202187 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012188 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552189
2190 // Request another socket from the first pool. Request should stall at the
2191 // socket pool limit.
2192 ClientSocketHandle handle3;
2193 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542194 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152195 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202196 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012197 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552198
2199 // The third handle should remain stalled as the other sockets in its group
2200 // goes through the connect process.
2201
2202 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2203 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2204
2205 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2206 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2207 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2208
2209 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012210 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552211 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2212
2213 // Closing a socket should allow the stalled handle to finally get a new
2214 // ConnectJob.
2215 handle.socket()->Disconnect();
2216 handle.Reset();
2217 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572218}
2219
[email protected]e772db3f2010-07-12 18:11:132220TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2221 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2222 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2223
[email protected]2431756e2010-09-29 20:26:132224 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522225 TestCompletionCallback callback;
2226 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
Paul Jensen8d6f87ec2018-01-13 00:46:542227 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152228 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202229 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132230 EXPECT_TRUE(handle.is_initialized());
2231 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132232}
2233
2234TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2235 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2236
2237 connect_job_factory_->set_job_type(
2238 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132239 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522240 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132241 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542242 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152243 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202244 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132245 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012246 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132247 EXPECT_TRUE(handle.is_initialized());
2248 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132249}
2250
[email protected]e60e47a2010-07-14 03:37:182251TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2252 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2253 connect_job_factory_->set_job_type(
2254 TestConnectJob::kMockAdditionalErrorStateJob);
2255
[email protected]2431756e2010-09-29 20:26:132256 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522257 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132258 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:542259 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152260 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202261 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132262 EXPECT_FALSE(handle.is_initialized());
2263 EXPECT_FALSE(handle.socket());
2264 EXPECT_TRUE(handle.is_ssl_error());
2265 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182266}
2267
2268TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2269 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2270
2271 connect_job_factory_->set_job_type(
2272 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132273 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522274 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132275 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542276 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152277 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202278 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132279 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012280 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132281 EXPECT_FALSE(handle.is_initialized());
2282 EXPECT_FALSE(handle.socket());
2283 EXPECT_TRUE(handle.is_ssl_error());
2284 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182285}
2286
martijn003cd612016-05-19 22:24:382287// Make sure we can reuse sockets.
2288TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412289 CreatePoolWithIdleTimeouts(
2290 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032291 base::TimeDelta(), // Time out unused sockets immediately.
2292 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2293
2294 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2295
2296 ClientSocketHandle handle;
2297 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542298 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152299 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202300 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012301 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032302 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012303 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032304
2305 // Use and release the socket.
Ramin Halavati0a08cc82018-02-06 07:46:382306 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback(),
2307 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482308 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032309 handle.Reset();
2310
2311 // Should now have one idle socket.
2312 ASSERT_EQ(1, pool_->IdleSocketCount());
2313
2314 // Request a new socket. This should reuse the old socket and complete
2315 // synchronously.
vishal.b62985ca92015-04-17 08:45:512316 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:542317 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152318 ClientSocketPool::RespectLimits::ENABLED,
2319 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012320 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032321 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482322 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032323
2324 ASSERT_TRUE(pool_->HasGroup("a"));
2325 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2326 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2327
mmenke43758e62015-05-04 21:09:462328 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032329 log.GetEntries(&entries);
2330 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002331 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032332}
2333
martijn003cd612016-05-19 22:24:382334// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172335TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032336 CreatePoolWithIdleTimeouts(
2337 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2338 base::TimeDelta(), // Time out unused sockets immediately
2339 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412340
2341 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2342
2343 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2344
2345 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522346 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542347 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152348 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202349 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012350 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412351 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2352
2353 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522354 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542355 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152356 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202357 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012358 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412359 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2360
2361 // Cancel one of the requests. Wait for the other, which will get the first
2362 // job. Release the socket. Run the loop again to make sure the second
2363 // socket is sitting idle and the first one is released (since ReleaseSocket()
2364 // just posts a DoReleaseSocket() task).
2365
2366 handle.Reset();
robpercival214763f2016-07-01 23:27:012367 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412368 // Use the socket.
Ramin Halavati0a08cc82018-02-06 07:46:382369 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback(),
2370 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412371 handle2.Reset();
2372
[email protected]e7b1c6d2c2012-05-05 00:54:032373 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2374 // actually become pending until 2ms after they have been created. In order
2375 // to flush all tasks, we need to wait so that we know there are no
2376 // soon-to-be-pending tasks waiting.
2377 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282378 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412379
[email protected]e7b1c6d2c2012-05-05 00:54:032380 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412381 ASSERT_EQ(2, pool_->IdleSocketCount());
2382
2383 // Request a new socket. This should cleanup the unused and timed out ones.
2384 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512385 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522386 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542387 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152388 ClientSocketPool::RespectLimits::ENABLED,
2389 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012390 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2391 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412392 EXPECT_FALSE(handle.is_reused());
2393
[email protected]e7b1c6d2c2012-05-05 00:54:032394 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412395 ASSERT_TRUE(pool_->HasGroup("a"));
2396 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2397 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2398
mmenke43758e62015-05-04 21:09:462399 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412400 log.GetEntries(&entries);
2401 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002402 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412403}
2404
[email protected]2041cf342010-02-19 03:15:592405// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162406// because of multiple releasing disconnected sockets.
2407TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2408 CreatePoolWithIdleTimeouts(
2409 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2410 base::TimeDelta(), // Time out unused sockets immediately.
2411 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2412
2413 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2414
2415 // Startup 4 connect jobs. Two of them will be pending.
2416
[email protected]2431756e2010-09-29 20:26:132417 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522418 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542419 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152420 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202421 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012422 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162423
[email protected]2431756e2010-09-29 20:26:132424 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522425 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542426 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152427 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202428 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012429 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162430
[email protected]2431756e2010-09-29 20:26:132431 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522432 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542433 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152434 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202435 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012436 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162437
[email protected]2431756e2010-09-29 20:26:132438 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522439 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542440 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152441 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202442 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012443 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162444
2445 // Release two disconnected sockets.
2446
[email protected]2431756e2010-09-29 20:26:132447 handle.socket()->Disconnect();
2448 handle.Reset();
2449 handle2.socket()->Disconnect();
2450 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162451
robpercival214763f2016-07-01 23:27:012452 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132453 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012454 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132455 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162456}
2457
[email protected]d7027bb2010-05-10 18:58:542458// Regression test for http://crbug.com/42267.
2459// When DoReleaseSocket() is processed for one socket, it is blocked because the
2460// other stalled groups all have releasing sockets, so no progress can be made.
2461TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2462 CreatePoolWithIdleTimeouts(
2463 4 /* socket limit */, 4 /* socket limit per group */,
2464 base::TimeDelta(), // Time out unused sockets immediately.
2465 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2466
2467 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2468
2469 // Max out the socket limit with 2 per group.
2470
[email protected]2431756e2010-09-29 20:26:132471 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522472 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132473 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522474 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542475
2476 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542477 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152478 ClientSocketPool::RespectLimits::ENABLED,
2479 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202480 NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542481 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152482 ClientSocketPool::RespectLimits::ENABLED,
2483 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202484 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542485 }
[email protected]b89f7e42010-05-20 20:37:002486
[email protected]d7027bb2010-05-10 18:58:542487 // Make 4 pending requests, 2 per group.
2488
2489 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202490 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542491 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202492 ClientSocketPool::RespectLimits::ENABLED,
2493 callback_a[i].callback(), pool_.get(),
2494 NetLogWithSource()));
2495 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542496 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202497 ClientSocketPool::RespectLimits::ENABLED,
2498 callback_b[i].callback(), pool_.get(),
2499 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542500 }
2501
2502 // Release b's socket first. The order is important, because in
2503 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2504 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2505 // first, which has a releasing socket, so it refuses to start up another
2506 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132507 handle_b[0].socket()->Disconnect();
2508 handle_b[0].Reset();
2509 handle_a[0].socket()->Disconnect();
2510 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542511
2512 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282513 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542514
[email protected]2431756e2010-09-29 20:26:132515 handle_b[1].socket()->Disconnect();
2516 handle_b[1].Reset();
2517 handle_a[1].socket()->Disconnect();
2518 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542519
2520 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012521 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2522 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542523 }
2524}
2525
[email protected]fd4fe0b2010-02-08 23:02:152526TEST_F(ClientSocketPoolBaseTest,
2527 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2528 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2529
2530 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2531
robpercival214763f2016-07-01 23:27:012532 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2533 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2534 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2535 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152536
robpercival214763f2016-07-01 23:27:012537 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2538 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132539 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152540
2541 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132542 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012543 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152544
[email protected]2431756e2010-09-29 20:26:132545 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012546 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132547 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152548
2549 EXPECT_EQ(1, GetOrderOfRequest(1));
2550 EXPECT_EQ(2, GetOrderOfRequest(2));
2551 EXPECT_EQ(3, GetOrderOfRequest(3));
2552 EXPECT_EQ(4, GetOrderOfRequest(4));
2553
2554 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132555 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152556}
2557
[email protected]6ecf2b92011-12-15 01:14:522558class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042559 public:
[email protected]2431756e2010-09-29 20:26:132560 TestReleasingSocketRequest(TestClientSocketPool* pool,
2561 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182562 bool reset_releasing_handle)
2563 : pool_(pool),
2564 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522565 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322566 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2567 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522568 }
2569
Chris Watkins7a41d3552017-12-01 02:13:272570 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042571
2572 ClientSocketHandle* handle() { return &handle_; }
2573
[email protected]6ecf2b92011-12-15 01:14:522574 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042575
2576 private:
[email protected]6ecf2b92011-12-15 01:14:522577 void OnComplete(int result) {
2578 SetResult(result);
2579 if (reset_releasing_handle_)
2580 handle_.Reset();
2581
mmenked3641e12016-01-28 16:06:152582 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522583 EXPECT_EQ(expected_result_,
Paul Jensen8d6f87ec2018-01-13 00:46:542584 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152585 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202586 callback2_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522587 }
2588
[email protected]2431756e2010-09-29 20:26:132589 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182590 int expected_result_;
2591 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042592 ClientSocketHandle handle_;
2593 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522594 CompletionCallback callback_;
2595 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042596};
2597
[email protected]e60e47a2010-07-14 03:37:182598
2599TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2600 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2601
robpercival214763f2016-07-01 23:27:012602 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2603 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2604 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182605
[email protected]2431756e2010-09-29 20:26:132606 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182607 client_socket_factory_.allocation_count());
2608
2609 connect_job_factory_->set_job_type(
2610 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2611 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202612 EXPECT_EQ(
2613 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542614 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202615 ClientSocketPool::RespectLimits::ENABLED,
2616 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182617 // The next job should complete synchronously
2618 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2619
robpercival214763f2016-07-01 23:27:012620 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182621 EXPECT_FALSE(req.handle()->is_initialized());
2622 EXPECT_FALSE(req.handle()->socket());
2623 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432624 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182625}
2626
[email protected]b6501d3d2010-06-03 23:53:342627// http://crbug.com/44724 regression test.
2628// We start releasing the pool when we flush on network change. When that
2629// happens, the only active references are in the ClientSocketHandles. When a
2630// ConnectJob completes and calls back into the last ClientSocketHandle, that
2631// callback can release the last reference and delete the pool. After the
2632// callback finishes, we go back to the stack frame within the now-deleted pool.
2633// Executing any code that refers to members of the now-deleted pool can cause
2634// crashes.
2635TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2636 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2637 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2638
2639 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522640 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152641 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542642 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152643 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202644 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342645
[email protected]7af985a2012-12-14 22:40:422646 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342647
2648 // We'll call back into this now.
2649 callback.WaitForResult();
2650}
2651
[email protected]a7e38572010-06-07 18:22:242652TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2653 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2654 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2655
2656 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522657 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152658 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542659 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152660 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202661 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012662 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242663 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2664
[email protected]7af985a2012-12-14 22:40:422665 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242666
2667 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282668 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242669
mmenked3641e12016-01-28 16:06:152670 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542671 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152672 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202673 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012674 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242675 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2676}
2677
[email protected]6ecf2b92011-12-15 01:14:522678class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142679 public:
2680 ConnectWithinCallback(
2681 const std::string& group_name,
2682 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132683 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522684 : group_name_(group_name),
2685 params_(params),
2686 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322687 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2688 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142689 }
2690
Chris Watkins7a41d3552017-12-01 02:13:272691 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142692
2693 int WaitForNestedResult() {
2694 return nested_callback_.WaitForResult();
2695 }
2696
[email protected]6ecf2b92011-12-15 01:14:522697 const CompletionCallback& callback() const { return callback_; }
2698
[email protected]06f92462010-08-31 19:24:142699 private:
[email protected]6ecf2b92011-12-15 01:14:522700 void OnComplete(int result) {
2701 SetResult(result);
tfarina428341112016-09-22 13:38:202702 EXPECT_EQ(
2703 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542704 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202705 ClientSocketPool::RespectLimits::ENABLED,
2706 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522707 }
2708
[email protected]06f92462010-08-31 19:24:142709 const std::string group_name_;
2710 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132711 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142712 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522713 CompletionCallback callback_;
2714 TestCompletionCallback nested_callback_;
2715
2716 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142717};
2718
2719TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2720 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2721
2722 // First job will be waiting until it gets aborted.
2723 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2724
2725 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132726 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152727 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542728 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152729 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202730 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142731
2732 // Second job will be started during the first callback, and will
2733 // asynchronously complete with OK.
2734 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422735 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012736 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2737 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142738}
2739
[email protected]25eea382010-07-10 23:55:262740// Cancel a pending socket request while we're at max sockets,
2741// and verify that the backup socket firing doesn't cause a crash.
2742TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2743 // Max 4 sockets globally, max 4 sockets per group.
2744 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222745 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262746
[email protected]4baaf9d2010-08-31 15:15:442747 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2748 // timer.
[email protected]25eea382010-07-10 23:55:262749 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2750 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522751 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152752 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542753 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152754 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202755 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262756
2757 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2758 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2759 ClientSocketHandle handles[kDefaultMaxSockets];
2760 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522761 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542762 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202763 ClientSocketPool::RespectLimits::ENABLED,
2764 callback.callback(), pool_.get(),
2765 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262766 }
2767
fdoray5eeb7642016-06-22 16:11:282768 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262769
2770 // Cancel the pending request.
2771 handle.Reset();
2772
2773 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002774 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2775 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262776
fdoray5eeb7642016-06-22 16:11:282777 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262778 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2779}
2780
[email protected]3f00be82010-09-27 19:50:022781TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442782 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2783 pool_->EnableConnectBackupJobs();
2784
2785 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2786 // timer.
2787 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2788 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522789 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152790 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542791 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152792 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202793 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442794 ASSERT_TRUE(pool_->HasGroup("bar"));
2795 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102796 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442797
2798 // Cancel the socket request. This should cancel the backup timer. Wait for
2799 // the backup time to see if it indeed got canceled.
2800 handle.Reset();
2801 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002802 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2803 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282804 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442805 ASSERT_TRUE(pool_->HasGroup("bar"));
2806 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2807}
2808
[email protected]3f00be82010-09-27 19:50:022809TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2810 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2811 pool_->EnableConnectBackupJobs();
2812
2813 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2814 // timer.
2815 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2816 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522817 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152818 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542819 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152820 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202821 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022822 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2823 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522824 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202825 EXPECT_EQ(
2826 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542827 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202828 ClientSocketPool::RespectLimits::ENABLED,
2829 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022830 ASSERT_TRUE(pool_->HasGroup("bar"));
2831 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2832
2833 // Cancel request 1 and then complete request 2. With the requests finished,
2834 // the backup timer should be cancelled.
2835 handle.Reset();
robpercival214763f2016-07-01 23:27:012836 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022837 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002838 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2839 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282840 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022841}
2842
[email protected]eb5a99382010-07-11 03:18:262843// Test delayed socket binding for the case where we have two connects,
2844// and while one is waiting on a connect, the other frees up.
2845// The socket waiting on a connect should switch immediately to the freed
2846// up socket.
2847TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2849 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2850
2851 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522852 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132853 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542854 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152855 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202856 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012857 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262858
2859 // No idle sockets, no pending jobs.
2860 EXPECT_EQ(0, pool_->IdleSocketCount());
2861 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2862
2863 // Create a second socket to the same host, but this one will wait.
2864 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2865 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132866 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542867 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152868 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202869 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262870 // No idle sockets, and one connecting job.
2871 EXPECT_EQ(0, pool_->IdleSocketCount());
2872 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2873
2874 // Return the first handle to the pool. This will initiate the delayed
2875 // binding.
2876 handle1.Reset();
2877
fdoray5eeb7642016-06-22 16:11:282878 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262879
2880 // Still no idle sockets, still one pending connect job.
2881 EXPECT_EQ(0, pool_->IdleSocketCount());
2882 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2883
2884 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012885 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262886
2887 // And we can see there is still one job waiting.
2888 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2889
2890 // Finally, signal the waiting Connect.
2891 client_socket_factory_.SignalJobs();
2892 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2893
fdoray5eeb7642016-06-22 16:11:282894 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262895}
2896
2897// Test delayed socket binding when a group is at capacity and one
2898// of the group's sockets frees up.
2899TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2900 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2901 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2902
2903 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522904 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132905 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542906 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152907 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202908 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012909 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262910
2911 // No idle sockets, no pending jobs.
2912 EXPECT_EQ(0, pool_->IdleSocketCount());
2913 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2914
2915 // Create a second socket to the same host, but this one will wait.
2916 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2917 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132918 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542919 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152920 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202921 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262922 // No idle sockets, and one connecting job.
2923 EXPECT_EQ(0, pool_->IdleSocketCount());
2924 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2925
2926 // Return the first handle to the pool. This will initiate the delayed
2927 // binding.
2928 handle1.Reset();
2929
fdoray5eeb7642016-06-22 16:11:282930 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262931
2932 // Still no idle sockets, still one pending connect job.
2933 EXPECT_EQ(0, pool_->IdleSocketCount());
2934 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2935
2936 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012937 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262938
2939 // And we can see there is still one job waiting.
2940 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2941
2942 // Finally, signal the waiting Connect.
2943 client_socket_factory_.SignalJobs();
2944 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2945
fdoray5eeb7642016-06-22 16:11:282946 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262947}
2948
2949// Test out the case where we have one socket connected, one
2950// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512951// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262952// should complete, by taking the first socket's idle socket.
2953TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2954 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2955 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2956
2957 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522958 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132959 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542960 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152961 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202962 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012963 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262964
2965 // No idle sockets, no pending jobs.
2966 EXPECT_EQ(0, pool_->IdleSocketCount());
2967 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2968
2969 // Create a second socket to the same host, but this one will wait.
2970 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2971 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132972 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542973 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152974 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202975 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262976 // No idle sockets, and one connecting job.
2977 EXPECT_EQ(0, pool_->IdleSocketCount());
2978 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2979
2980 // Return the first handle to the pool. This will initiate the delayed
2981 // binding.
2982 handle1.Reset();
2983
fdoray5eeb7642016-06-22 16:11:282984 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262985
2986 // Still no idle sockets, still one pending connect job.
2987 EXPECT_EQ(0, pool_->IdleSocketCount());
2988 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2989
2990 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012991 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262992
2993 // And we can see there is still one job waiting.
2994 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2995
2996 // Finally, signal the waiting Connect.
2997 client_socket_factory_.SignalJobs();
2998 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2999
fdoray5eeb7642016-06-22 16:11:283000 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263001}
3002
[email protected]2abfe90a2010-08-25 17:49:513003// Cover the case where on an available socket slot, we have one pending
3004// request that completes synchronously, thereby making the Group empty.
3005TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3006 const int kUnlimitedSockets = 100;
3007 const int kOneSocketPerGroup = 1;
3008 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3009
3010 // Make the first request asynchronous fail.
3011 // This will free up a socket slot later.
3012 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3013
3014 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523015 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203016 EXPECT_EQ(
3017 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543018 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203019 ClientSocketPool::RespectLimits::ENABLED,
3020 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513021 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3022
3023 // Make the second request synchronously fail. This should make the Group
3024 // empty.
3025 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3026 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523027 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513028 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3029 // when created.
tfarina428341112016-09-22 13:38:203030 EXPECT_EQ(
3031 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543032 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203033 ClientSocketPool::RespectLimits::ENABLED,
3034 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513035
3036 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3037
robpercival214763f2016-07-01 23:27:013038 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3039 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513040 EXPECT_FALSE(pool_->HasGroup("a"));
3041}
3042
[email protected]e1b54dc2010-10-06 21:27:223043TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3044 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3045
3046 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3047
3048 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523049 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203050 EXPECT_EQ(
3051 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543052 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203053 ClientSocketPool::RespectLimits::ENABLED,
3054 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223055
3056 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523057 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203058 EXPECT_EQ(
3059 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543060 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203061 ClientSocketPool::RespectLimits::ENABLED,
3062 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223063 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523064 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203065 EXPECT_EQ(
3066 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543067 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203068 ClientSocketPool::RespectLimits::ENABLED,
3069 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223070
robpercival214763f2016-07-01 23:27:013071 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3072 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3073 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223074
3075 // Use the socket.
Ramin Halavati0a08cc82018-02-06 07:46:383076 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback(),
3077 TRAFFIC_ANNOTATION_FOR_TESTS));
3078 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback(),
3079 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223080
3081 handle1.Reset();
3082 handle2.Reset();
3083 handle3.Reset();
3084
tfarina428341112016-09-22 13:38:203085 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543086 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203087 ClientSocketPool::RespectLimits::ENABLED,
3088 callback1.callback(), pool_.get(), NetLogWithSource()));
3089 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543090 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203091 ClientSocketPool::RespectLimits::ENABLED,
3092 callback2.callback(), pool_.get(), NetLogWithSource()));
3093 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543094 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203095 ClientSocketPool::RespectLimits::ENABLED,
3096 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223097
3098 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3099 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3100 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3101}
3102
[email protected]2c2bef152010-10-13 00:55:033103TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3104 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3105 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3106
Charlie Harrison55ce6082018-05-14 02:25:573107 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033108
3109 ASSERT_TRUE(pool_->HasGroup("a"));
3110 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103111 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033112 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3113
3114 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523115 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203116 EXPECT_EQ(
3117 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543118 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203119 ClientSocketPool::RespectLimits::ENABLED,
3120 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033121
3122 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523123 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203124 EXPECT_EQ(
3125 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543126 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203127 ClientSocketPool::RespectLimits::ENABLED,
3128 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033129
3130 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103131 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033132 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3133
robpercival214763f2016-07-01 23:27:013134 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3135 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033136 handle1.Reset();
3137 handle2.Reset();
3138
3139 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103140 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033141 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3142}
3143
3144TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3145 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3146 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3147
3148 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523149 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203150 EXPECT_EQ(
3151 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543152 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203153 ClientSocketPool::RespectLimits::ENABLED,
3154 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033155
3156 ASSERT_TRUE(pool_->HasGroup("a"));
3157 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103158 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033159 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3160
Charlie Harrison55ce6082018-05-14 02:25:573161 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033162
3163 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103164 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033165 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3166
3167 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523168 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203169 EXPECT_EQ(
3170 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543171 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203172 ClientSocketPool::RespectLimits::ENABLED,
3173 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033174
3175 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103176 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033177 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3178
robpercival214763f2016-07-01 23:27:013179 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3180 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033181 handle1.Reset();
3182 handle2.Reset();
3183
3184 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103185 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033186 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3187}
3188
3189TEST_F(ClientSocketPoolBaseTest,
3190 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3191 CreatePool(4, 4);
3192 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3193
3194 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523195 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203196 EXPECT_EQ(
3197 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543198 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203199 ClientSocketPool::RespectLimits::ENABLED,
3200 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033201
3202 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523203 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203204 EXPECT_EQ(
3205 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543206 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203207 ClientSocketPool::RespectLimits::ENABLED,
3208 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033209
3210 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523211 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203212 EXPECT_EQ(
3213 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543214 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203215 ClientSocketPool::RespectLimits::ENABLED,
3216 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033217
3218 ASSERT_TRUE(pool_->HasGroup("a"));
3219 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103220 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033221 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3222
Charlie Harrison55ce6082018-05-14 02:25:573223 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033224
3225 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103226 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033227 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3228
robpercival214763f2016-07-01 23:27:013229 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3230 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3231 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033232 handle1.Reset();
3233 handle2.Reset();
3234 handle3.Reset();
3235
3236 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103237 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033238 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3239}
3240
3241TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3242 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3243 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3244
3245 ASSERT_FALSE(pool_->HasGroup("a"));
3246
Charlie Harrison55ce6082018-05-14 02:25:573247 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033248
3249 ASSERT_TRUE(pool_->HasGroup("a"));
3250 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103251 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033252
3253 ASSERT_FALSE(pool_->HasGroup("b"));
3254
Charlie Harrison55ce6082018-05-14 02:25:573255 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033256
3257 ASSERT_FALSE(pool_->HasGroup("b"));
3258}
3259
3260TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3261 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3262 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3263
3264 ASSERT_FALSE(pool_->HasGroup("a"));
3265
3266 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573267 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033268
3269 ASSERT_TRUE(pool_->HasGroup("a"));
3270 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103271 EXPECT_EQ(kDefaultMaxSockets - 1,
3272 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483273 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033274
3275 ASSERT_FALSE(pool_->HasGroup("b"));
3276
Charlie Harrison55ce6082018-05-14 02:25:573277 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033278
3279 ASSERT_TRUE(pool_->HasGroup("b"));
3280 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483281 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033282}
3283
3284TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3285 CreatePool(4, 4);
3286 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3287
3288 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523289 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203290 EXPECT_EQ(
3291 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543292 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203293 ClientSocketPool::RespectLimits::ENABLED,
3294 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013295 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033296 handle1.Reset();
3297
3298 ASSERT_TRUE(pool_->HasGroup("a"));
3299 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103300 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033301 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3302
Charlie Harrison55ce6082018-05-14 02:25:573303 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033304
3305 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103306 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033307 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3308}
3309
3310TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3311 CreatePool(4, 4);
3312 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3313
3314 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523315 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203316 EXPECT_EQ(
3317 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543318 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203319 ClientSocketPool::RespectLimits::ENABLED,
3320 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013321 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033322
3323 ASSERT_TRUE(pool_->HasGroup("a"));
3324 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103325 EXPECT_EQ(0, 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
Charlie Harrison55ce6082018-05-14 02:25:573329 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033330
3331 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103332 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033333 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3334 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3335}
3336
3337TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3338 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3339 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3340
3341 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573342 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033343
3344 ASSERT_TRUE(pool_->HasGroup("a"));
3345 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103346 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033347 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3348
3349 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573350 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033351
3352 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103353 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033354 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3355}
3356
[email protected]3c819f522010-12-02 02:03:123357TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3359 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3360
3361 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573362 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123363
3364 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523365
3366 connect_job_factory_->set_job_type(
3367 TestConnectJob::kMockAdditionalErrorStateJob);
3368 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573369 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523370
3371 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123372}
3373
[email protected]8159a1c2012-06-07 00:00:103374TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033375 CreatePool(4, 4);
3376 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3377
Charlie Harrison55ce6082018-05-14 02:25:573378 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033379
3380 ASSERT_TRUE(pool_->HasGroup("a"));
3381 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103382 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033383 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3384
Charlie Harrison55ce6082018-05-14 02:25:573385 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033386 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103387 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033388 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3389
3390 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523391 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203392 EXPECT_EQ(
3393 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543394 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203395 ClientSocketPool::RespectLimits::ENABLED,
3396 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013397 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033398
3399 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523400 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:543401 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153402 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203403 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033404 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013405 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3406 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033407 }
3408
[email protected]8159a1c2012-06-07 00:00:103409 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3410 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3411 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3412 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3413
[email protected]2c2bef152010-10-13 00:55:033414 handle1.Reset();
3415 handle2.Reset();
3416
[email protected]8159a1c2012-06-07 00:00:103417 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3418 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033419 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3420
Charlie Harrison55ce6082018-05-14 02:25:573421 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033422 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103423 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033424 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3425}
3426
3427TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3428 CreatePool(4, 4);
3429 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3430
Charlie Harrison55ce6082018-05-14 02:25:573431 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033432
3433 ASSERT_TRUE(pool_->HasGroup("a"));
3434 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103435 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033436 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3437
Charlie Harrison55ce6082018-05-14 02:25:573438 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033439 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103440 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033441 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3442
Charlie Harrison55ce6082018-05-14 02:25:573443 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033444 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103445 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033446 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3447
Charlie Harrison55ce6082018-05-14 02:25:573448 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033449 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103450 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033451 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3452}
3453
3454TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3455 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3456 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3457
Charlie Harrison55ce6082018-05-14 02:25:573458 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033459
3460 ASSERT_TRUE(pool_->HasGroup("a"));
3461 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103462 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033463 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3464
3465 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523466 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203467 EXPECT_EQ(
3468 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543469 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203470 ClientSocketPool::RespectLimits::ENABLED,
3471 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033472
3473 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103474 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033475 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3476
robpercival214763f2016-07-01 23:27:013477 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033478
[email protected]0dc88b32014-03-26 20:12:283479 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483480 // starts, it has a connect start time.
3481 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033482 handle1.Reset();
3483
3484 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3485}
3486
[email protected]034df0f32013-01-07 23:17:483487// Checks that fully connected preconnect jobs have no connect times, and are
3488// marked as reused.
3489TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3490 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3491 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573492 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483493
3494 ASSERT_TRUE(pool_->HasGroup("a"));
3495 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3496 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3497 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3498
3499 ClientSocketHandle handle;
3500 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203501 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543502 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203503 ClientSocketPool::RespectLimits::ENABLED,
3504 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483505
3506 // Make sure the idle socket was used.
3507 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3508
3509 TestLoadTimingInfoConnectedReused(handle);
3510 handle.Reset();
3511 TestLoadTimingInfoNotConnected(handle);
3512}
3513
[email protected]dcbe168a2010-12-02 03:14:463514// http://crbug.com/64940 regression test.
3515TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3516 const int kMaxTotalSockets = 3;
3517 const int kMaxSocketsPerGroup = 2;
3518 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3519 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3520
3521 // Note that group name ordering matters here. "a" comes before "b", so
3522 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3523
3524 // Set up one idle socket in "a".
3525 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523526 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203527 EXPECT_EQ(
3528 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543529 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203530 ClientSocketPool::RespectLimits::ENABLED,
3531 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463532
robpercival214763f2016-07-01 23:27:013533 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463534 handle1.Reset();
3535 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3536
3537 // Set up two active sockets in "b".
3538 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523539 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203540 EXPECT_EQ(
3541 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543542 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203543 ClientSocketPool::RespectLimits::ENABLED,
3544 callback1.callback(), pool_.get(), NetLogWithSource()));
3545 EXPECT_EQ(
3546 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543547 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203548 ClientSocketPool::RespectLimits::ENABLED,
3549 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463550
robpercival214763f2016-07-01 23:27:013551 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3552 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463553 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103554 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463555 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3556
3557 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3558 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3559 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3560 // sockets for "a", and "b" should still have 2 active sockets.
3561
Charlie Harrison55ce6082018-05-14 02:25:573562 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463563 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103564 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463565 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3566 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3567 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103568 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463569 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3570 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3571
3572 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3573 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3574 // "a" should result in closing 1 for "b".
3575 handle1.Reset();
3576 handle2.Reset();
3577 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3578 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3579
Charlie Harrison55ce6082018-05-14 02:25:573580 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463581 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103582 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463583 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3584 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3585 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103586 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463587 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3588 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3589}
3590
[email protected]b7b8be42011-07-12 12:46:413591TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073592 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3593 pool_->EnableConnectBackupJobs();
3594
3595 // Make the ConnectJob hang until it times out, shorten the timeout.
3596 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3597 connect_job_factory_->set_timeout_duration(
3598 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573599 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073600 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103601 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073602 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073603
[email protected]b7b8be42011-07-12 12:46:413604 // Verify the backup timer doesn't create a backup job, by making
3605 // the backup job a pending job instead of a waiting job, so it
3606 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073607 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453608 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173609 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343610 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283611 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073612 EXPECT_FALSE(pool_->HasGroup("a"));
3613}
3614
[email protected]b7b8be42011-07-12 12:46:413615TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073616 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3617 pool_->EnableConnectBackupJobs();
3618
3619 // Make the ConnectJob hang forever.
3620 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573621 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073622 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103623 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073624 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283625 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073626
3627 // Make the backup job be a pending job, so it completes normally.
3628 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3629 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523630 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153631 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543632 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153633 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203634 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413635 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073636 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103637 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073638 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3639 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013640 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073641
3642 // The hung connect job should still be there, but everything else should be
3643 // complete.
3644 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103645 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073646 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3647 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3648}
3649
[email protected]0dc88b32014-03-26 20:12:283650// Tests that a preconnect that starts out with unread data can still be used.
3651// http://crbug.com/334467
3652TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3653 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3654 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3655
Charlie Harrison55ce6082018-05-14 02:25:573656 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283657
3658 ASSERT_TRUE(pool_->HasGroup("a"));
3659 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3660 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3661 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3662
3663 // Fail future jobs to be sure that handle receives the preconnected socket
3664 // rather than closing it and making a new one.
3665 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3666 ClientSocketHandle handle;
3667 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203668 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543669 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203670 ClientSocketPool::RespectLimits::ENABLED,
3671 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283672
3673 ASSERT_TRUE(pool_->HasGroup("a"));
3674 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3675 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3676 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3677
3678 // Drain the pending read.
3679 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3680
3681 TestLoadTimingInfoConnectedReused(handle);
3682 handle.Reset();
3683
3684 // The socket should be usable now that it's idle again.
3685 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3686}
3687
[email protected]043b68c82013-08-22 23:41:523688class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203689 public:
3690 MockLayeredPool(TestClientSocketPool* pool,
3691 const std::string& group_name)
3692 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203693 group_name_(group_name),
3694 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523695 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203696 }
3697
Daniel Cheng4496d0822018-04-26 21:52:153698 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:203699
3700 int RequestSocket(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, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153703 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203704 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203705 }
3706
3707 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153708 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543709 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153710 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203711 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203712 }
3713
3714 bool ReleaseOneConnection() {
3715 if (!handle_.is_initialized() || !can_release_connection_) {
3716 return false;
3717 }
3718 handle_.socket()->Disconnect();
3719 handle_.Reset();
3720 return true;
3721 }
3722
3723 void set_can_release_connection(bool can_release_connection) {
3724 can_release_connection_ = can_release_connection;
3725 }
3726
3727 MOCK_METHOD0(CloseOneIdleConnection, bool());
3728
3729 private:
3730 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203731 ClientSocketHandle handle_;
3732 TestCompletionCallback callback_;
3733 const std::string group_name_;
3734 bool can_release_connection_;
3735};
3736
3737TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3738 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3739 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3740
3741 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013742 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203743 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3744 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523745 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203746}
3747
3748TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3749 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3750 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3751
3752 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013753 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203754 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3755 .WillOnce(Invoke(&mock_layered_pool,
3756 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523757 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203758}
3759
3760// Tests the basic case of closing an idle socket in a higher layered pool when
3761// a new request is issued and the lower layer pool is stalled.
3762TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3763 CreatePool(1, 1);
3764 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3765
3766 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013767 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203768 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3769 .WillOnce(Invoke(&mock_layered_pool,
3770 &MockLayeredPool::ReleaseOneConnection));
3771 ClientSocketHandle handle;
3772 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153773 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543774 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153775 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203776 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013777 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203778}
3779
3780// Same as above, but the idle socket is in the same group as the stalled
3781// socket, and closes the only other request in its group when closing requests
3782// in higher layered pools. This generally shouldn't happen, but it may be
3783// possible if a higher level pool issues a request and the request is
3784// subsequently cancelled. Even if it's not possible, best not to crash.
3785TEST_F(ClientSocketPoolBaseTest,
3786 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3787 CreatePool(2, 2);
3788 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3789
3790 // Need a socket in another group for the pool to be stalled (If a group
3791 // has the maximum number of connections already, it's not stalled).
3792 ClientSocketHandle handle1;
3793 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203794 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543795 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203796 ClientSocketPool::RespectLimits::ENABLED,
3797 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203798
3799 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013800 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203801 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3802 .WillOnce(Invoke(&mock_layered_pool,
3803 &MockLayeredPool::ReleaseOneConnection));
3804 ClientSocketHandle handle;
3805 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153806 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543807 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153808 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203809 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013810 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203811}
3812
3813// Tests the case when an idle socket can be closed when a new request is
3814// issued, and the new request belongs to a group that was previously stalled.
3815TEST_F(ClientSocketPoolBaseTest,
3816 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3817 CreatePool(2, 2);
3818 std::list<TestConnectJob::JobType> job_types;
3819 job_types.push_back(TestConnectJob::kMockJob);
3820 job_types.push_back(TestConnectJob::kMockJob);
3821 job_types.push_back(TestConnectJob::kMockJob);
3822 job_types.push_back(TestConnectJob::kMockJob);
3823 connect_job_factory_->set_job_types(&job_types);
3824
3825 ClientSocketHandle handle1;
3826 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203827 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543828 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203829 ClientSocketPool::RespectLimits::ENABLED,
3830 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203831
3832 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013833 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203834 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3835 .WillRepeatedly(Invoke(&mock_layered_pool,
3836 &MockLayeredPool::ReleaseOneConnection));
3837 mock_layered_pool.set_can_release_connection(false);
3838
3839 // The third request is made when the socket pool is in a stalled state.
3840 ClientSocketHandle handle3;
3841 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203842 EXPECT_EQ(
3843 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543844 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203845 ClientSocketPool::RespectLimits::ENABLED,
3846 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203847
3848 base::RunLoop().RunUntilIdle();
3849 EXPECT_FALSE(callback3.have_result());
3850
3851 // The fourth request is made when the pool is no longer stalled. The third
3852 // request should be serviced first, since it was issued first and has the
3853 // same priority.
3854 mock_layered_pool.set_can_release_connection(true);
3855 ClientSocketHandle handle4;
3856 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203857 EXPECT_EQ(
3858 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543859 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203860 ClientSocketPool::RespectLimits::ENABLED,
3861 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013862 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203863 EXPECT_FALSE(callback4.have_result());
3864
3865 // Closing a handle should free up another socket slot.
3866 handle1.Reset();
robpercival214763f2016-07-01 23:27:013867 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203868}
3869
3870// Tests the case when an idle socket can be closed when a new request is
3871// issued, and the new request belongs to a group that was previously stalled.
3872//
3873// The two differences from the above test are that the stalled requests are not
3874// in the same group as the layered pool's request, and the the fourth request
3875// has a higher priority than the third one, so gets a socket first.
3876TEST_F(ClientSocketPoolBaseTest,
3877 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3878 CreatePool(2, 2);
3879 std::list<TestConnectJob::JobType> job_types;
3880 job_types.push_back(TestConnectJob::kMockJob);
3881 job_types.push_back(TestConnectJob::kMockJob);
3882 job_types.push_back(TestConnectJob::kMockJob);
3883 job_types.push_back(TestConnectJob::kMockJob);
3884 connect_job_factory_->set_job_types(&job_types);
3885
3886 ClientSocketHandle handle1;
3887 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203888 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543889 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203890 ClientSocketPool::RespectLimits::ENABLED,
3891 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203892
3893 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013894 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203895 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3896 .WillRepeatedly(Invoke(&mock_layered_pool,
3897 &MockLayeredPool::ReleaseOneConnection));
3898 mock_layered_pool.set_can_release_connection(false);
3899
3900 // The third request is made when the socket pool is in a stalled state.
3901 ClientSocketHandle handle3;
3902 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203903 EXPECT_EQ(
3904 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543905 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:203906 ClientSocketPool::RespectLimits::ENABLED,
3907 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203908
3909 base::RunLoop().RunUntilIdle();
3910 EXPECT_FALSE(callback3.have_result());
3911
3912 // The fourth request is made when the pool is no longer stalled. This
3913 // request has a higher priority than the third request, so is serviced first.
3914 mock_layered_pool.set_can_release_connection(true);
3915 ClientSocketHandle handle4;
3916 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203917 EXPECT_EQ(
3918 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543919 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:203920 ClientSocketPool::RespectLimits::ENABLED,
3921 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013922 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203923 EXPECT_FALSE(callback3.have_result());
3924
3925 // Closing a handle should free up another socket slot.
3926 handle1.Reset();
robpercival214763f2016-07-01 23:27:013927 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203928}
3929
3930TEST_F(ClientSocketPoolBaseTest,
3931 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3932 CreatePool(1, 1);
3933 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3934
3935 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013936 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203937 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3938 .WillRepeatedly(Invoke(&mock_layered_pool1,
3939 &MockLayeredPool::ReleaseOneConnection));
3940 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013941 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3942 IsOk());
[email protected]58e562f2013-04-22 17:32:203943 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3944 .WillRepeatedly(Invoke(&mock_layered_pool2,
3945 &MockLayeredPool::ReleaseOneConnection));
3946 ClientSocketHandle handle;
3947 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153948 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543949 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153950 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203951 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013952 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203953}
3954
[email protected]b021ece62013-06-11 11:06:333955// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153956// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3957// socket instead of a request with the same priority that was issued earlier,
3958// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333959TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333960 CreatePool(1, 1);
3961
3962 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153963 EXPECT_EQ(
3964 OK, StartRequestWithIgnoreLimits(
3965 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333966 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3967
3968 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3969
mmenked3641e12016-01-28 16:06:153970 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3971 "a", MAXIMUM_PRIORITY,
3972 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333973 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3974
mmenked3641e12016-01-28 16:06:153975 // Issue a request that ignores the limits, so a new ConnectJob is
3976 // created.
3977 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3978 "a", MAXIMUM_PRIORITY,
3979 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333980 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3981
robpercival214763f2016-07-01 23:27:013982 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333983 EXPECT_FALSE(request(1)->have_result());
3984}
3985
[email protected]c55fabd2013-11-04 23:26:563986// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153987// issued for a request with RespectLimits::DISABLED is not cancelled when a
3988// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563989TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563990 CreatePool(1, 1);
3991
3992 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153993 EXPECT_EQ(
3994 OK, StartRequestWithIgnoreLimits(
3995 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563996 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3997
3998 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3999
mmenked3641e12016-01-28 16:06:154000 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4001 "a", MAXIMUM_PRIORITY,
4002 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564003 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4004
mmenked3641e12016-01-28 16:06:154005 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4006 // created.
4007 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4008 "a", MAXIMUM_PRIORITY,
4009 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334010 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4011
mmenked3641e12016-01-28 16:06:154012 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334013 // should not be cancelled.
4014 request(1)->handle()->Reset();
4015 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4016
robpercival214763f2016-07-01 23:27:014017 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334018 EXPECT_FALSE(request(1)->have_result());
4019}
4020
[email protected]f6d1d6eb2009-06-24 20:16:094021} // namespace
4022
4023} // namespace net