blob: a57d0846de587781a01eedbccb7a2f3807d4d1ad [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"
Bence Béky8ddc2492018-06-13 01:02:0427#include "net/base/completion_once_callback.h"
[email protected]034df0f32013-01-07 23:17:4828#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5929#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0630#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3131#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0932#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3533#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0734#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0035#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1936#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0037#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5638#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4639#include "net/log/test_net_log_entry.h"
40#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0941#include "net/socket/client_socket_factory.h"
42#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2643#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2844#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5445#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1746#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4447#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1048#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0149#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0150#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3851#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4852#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0953#include "testing/gtest/include/gtest/gtest.h"
54
robpercival214763f2016-07-01 23:27:0155using net::test::IsError;
56using net::test::IsOk;
57
[email protected]51fdc7c2012-04-10 19:19:4858using ::testing::Invoke;
59using ::testing::Return;
60
[email protected]f6d1d6eb2009-06-24 20:16:0961namespace net {
62
63namespace {
64
[email protected]211d21722009-07-22 15:48:5365const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2066const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0167
[email protected]034df0f32013-01-07 23:17:4868// Make sure |handle| sets load times correctly when it has been assigned a
69// reused socket.
70void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
71 LoadTimingInfo load_timing_info;
72 // Only pass true in as |is_reused|, as in general, HttpStream types should
73 // have stricter concepts of reuse than socket pools.
74 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
75
76 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1977 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4878
[email protected]b258e0792013-01-12 07:11:5979 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
80 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4881}
82
83// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3384// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4885// of a connection where |is_reused| is false may consider the connection
86// reused.
87void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
88 EXPECT_FALSE(handle.is_reused());
89
90 LoadTimingInfo load_timing_info;
91 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
92
93 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1994 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4895
[email protected]b258e0792013-01-12 07:11:5996 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
97 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
98 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4899
100 TestLoadTimingInfoConnectedReused(handle);
101}
102
103// Make sure |handle| sets load times correctly, in the case that it does not
104// currently have a socket.
105void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
106 // Should only be set to true once a socket is assigned, if at all.
107 EXPECT_FALSE(handle.is_reused());
108
109 LoadTimingInfo load_timing_info;
110 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
111
112 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19113 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48114
[email protected]b258e0792013-01-12 07:11:59115 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
116 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48117}
118
[email protected]df4b4ef2010-07-12 18:25:21119class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20120 public:
Chris Watkins7a41d3552017-12-01 02:13:27121 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48122
[email protected]df4b4ef2010-07-12 18:25:21123 private:
124 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27125 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21126};
[email protected]7fc5b09a2010-02-27 00:07:38127typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49128
[email protected]3268023f2011-05-05 00:08:10129class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09130 public:
[email protected]034df0f32013-01-07 23:17:48131 explicit MockClientSocket(net::NetLog* net_log)
132 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28133 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20134 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30135 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09136
[email protected]0dc88b32014-03-26 20:12:28137 // Sets whether the socket has unread data. If true, the next call to Read()
138 // will return 1 byte and IsConnectedAndIdle() will return false.
139 void set_has_unread_data(bool has_unread_data) {
140 has_unread_data_ = has_unread_data;
141 }
142
[email protected]3f55aa12011-12-07 02:03:33143 // Socket implementation.
dchengb03027d2014-10-21 12:00:20144 int Read(IOBuffer* /* buf */,
145 int len,
Brad Lassey3a814172018-04-26 03:30:21146 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28147 if (has_unread_data_ && len > 0) {
148 has_unread_data_ = false;
149 was_used_to_convey_data_ = true;
150 return 1;
151 }
[email protected]e86df8dc2013-03-30 13:18:28152 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33153 }
[email protected]ab838892009-06-30 18:49:05154
[email protected]a2b2cfc2017-12-06 09:06:08155 int Write(
156 IOBuffer* /* buf */,
157 int len,
Brad Lassey3a814172018-04-26 03:30:21158 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08159 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01160 was_used_to_convey_data_ = true;
161 return len;
[email protected]ab838892009-06-30 18:49:05162 }
Avi Drissman13fc8932015-12-20 04:40:46163 int SetReceiveBufferSize(int32_t size) override { return OK; }
164 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05165
[email protected]dbf036f2011-12-06 23:33:24166 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21167 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24168 connected_ = true;
169 return OK;
170 }
[email protected]f6d1d6eb2009-06-24 20:16:09171
dchengb03027d2014-10-21 12:00:20172 void Disconnect() override { connected_ = false; }
173 bool IsConnected() const override { return connected_; }
174 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28175 return connected_ && !has_unread_data_;
176 }
[email protected]0b7648c2009-07-06 20:14:01177
dchengb03027d2014-10-21 12:00:20178 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16179 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09180 }
[email protected]f6d1d6eb2009-06-24 20:16:09181
dchengb03027d2014-10-21 12:00:20182 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35183 return ERR_UNEXPECTED;
184 }
185
tfarina428341112016-09-22 13:38:20186 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02187
dchengb03027d2014-10-21 12:00:20188 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37189 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20190 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
191 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03192 void GetConnectionAttempts(ConnectionAttempts* out) const override {
193 out->clear();
194 }
195 void ClearConnectionAttempts() override {}
196 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49197 int64_t GetTotalReceivedBytes() const override {
198 NOTIMPLEMENTED();
199 return 0;
200 }
Paul Jensen0f49dec2017-12-12 23:39:58201 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45202
[email protected]f6d1d6eb2009-06-24 20:16:09203 private:
204 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28205 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20206 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01207 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09208
[email protected]ab838892009-06-30 18:49:05209 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09210};
211
[email protected]5fc08e32009-07-15 17:09:57212class TestConnectJob;
213
[email protected]f6d1d6eb2009-06-24 20:16:09214class MockClientSocketFactory : public ClientSocketFactory {
215 public:
[email protected]ab838892009-06-30 18:49:05216 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09217
danakj655b66c2016-04-16 00:51:38218 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04219 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41220 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19221 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41222 NOTREACHED();
danakj655b66c2016-04-16 00:51:38223 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41224 }
225
Helen Lid5bb9222018-04-12 15:33:09226 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07227 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38228 std::unique_ptr<
229 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07230 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19231 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09232 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09233 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09234 }
235
danakj655b66c2016-04-16 00:51:38236 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
237 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27238 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21239 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13240 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09241 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38242 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09243 }
Helen Liac3c51e2018-04-24 00:02:13244 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
245 std::unique_ptr<ClientSocketHandle> transport_socket,
246 const std::string& user_agent,
247 const HostPortPair& endpoint,
248 HttpAuthController* http_auth_controller,
249 bool tunnel,
250 bool using_spdy,
251 NextProto negotiated_protocol,
252 bool is_https_proxy,
253 const NetworkTrafficAnnotationTag& traffic_annotation) override {
254 NOTIMPLEMENTED();
255 return nullptr;
256 }
[email protected]f6d1d6eb2009-06-24 20:16:09257
dchengb03027d2014-10-21 12:00:20258 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59259
[email protected]5fc08e32009-07-15 17:09:57260 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55261
[email protected]5fc08e32009-07-15 17:09:57262 void SignalJobs();
263
[email protected]03b7c8c2013-07-20 04:38:55264 void SignalJob(size_t job);
265
266 void SetJobLoadState(size_t job, LoadState load_state);
267
[email protected]f6d1d6eb2009-06-24 20:16:09268 int allocation_count() const { return allocation_count_; }
269
[email protected]f6d1d6eb2009-06-24 20:16:09270 private:
271 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57272 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09273};
274
[email protected]ab838892009-06-30 18:49:05275class TestConnectJob : public ConnectJob {
276 public:
277 enum JobType {
278 kMockJob,
279 kMockFailingJob,
280 kMockPendingJob,
281 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57282 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13283 kMockRecoverableJob,
284 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18285 kMockAdditionalErrorStateJob,
286 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28287 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05288 };
289
[email protected]994d4932010-07-12 17:55:13290 // The kMockPendingJob uses a slight delay before allowing the connect
291 // to complete.
292 static const int kPendingConnectDelay = 2;
293
[email protected]ab838892009-06-30 18:49:05294 TestConnectJob(JobType job_type,
295 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49296 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34297 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05298 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30299 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17300 NetLog* net_log)
tfarina428341112016-09-22 13:38:20301 : ConnectJob(
302 group_name,
303 timeout_duration,
304 request.priority(),
Paul Jensen8d6f87ec2018-01-13 00:46:54305 request.socket_tag(),
tfarina428341112016-09-22 13:38:20306 request.respect_limits(),
307 delegate,
davidbenb7048f092016-11-30 21:20:26308 NetLogWithSource::Make(net_log,
309 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58310 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05311 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18312 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39313 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15314 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05315
[email protected]974ebd62009-08-03 23:14:34316 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13317 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34318 }
319
[email protected]03b7c8c2013-07-20 04:38:55320 void set_load_state(LoadState load_state) { load_state_ = load_state; }
321
322 // From ConnectJob:
323
dchengb03027d2014-10-21 12:00:20324 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21325
dchengb03027d2014-10-21 12:00:20326 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18327 if (store_additional_error_state_) {
328 // Set all of the additional error state fields in some way.
329 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43330 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45331 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43332 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18333 }
334 }
335
[email protected]974ebd62009-08-03 23:14:34336 private:
[email protected]03b7c8c2013-07-20 04:38:55337 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05338
dchengb03027d2014-10-21 12:00:20339 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05340 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21341 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19342 NetLogSource());
danakj655b66c2016-04-16 00:51:38343 SetSocket(std::unique_ptr<StreamSocket>(
344 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05345 switch (job_type_) {
346 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13347 return DoConnect(true /* successful */, false /* sync */,
348 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05349 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13350 return DoConnect(false /* error */, false /* sync */,
351 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05352 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57353 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47354
355 // Depending on execution timings, posting a delayed task can result
356 // in the task getting executed the at the earliest possible
357 // opportunity or only after returning once from the message loop and
358 // then a second call into the message loop. In order to make behavior
359 // more deterministic, we change the default delay to 2ms. This should
360 // always require us to wait for the second call into the message loop.
361 //
362 // N.B. The correct fix for this and similar timing problems is to
363 // abstract time for the purpose of unittests. Unfortunately, we have
364 // a lot of third-party components that directly call the various
365 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45366 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05367 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13368 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45369 weak_factory_.GetWeakPtr(), true /* successful */,
370 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53371 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05372 return ERR_IO_PENDING;
373 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57374 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45375 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05376 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13377 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45378 weak_factory_.GetWeakPtr(), false /* error */,
379 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53380 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05381 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57382 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55383 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57384 client_socket_factory_->WaitForSignal(this);
385 waiting_success_ = true;
386 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13387 case kMockRecoverableJob:
388 return DoConnect(false /* error */, false /* sync */,
389 true /* recoverable */);
390 case kMockPendingRecoverableJob:
391 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45392 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13393 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13394 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45395 weak_factory_.GetWeakPtr(), false /* error */,
396 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53397 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13398 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18399 case kMockAdditionalErrorStateJob:
400 store_additional_error_state_ = true;
401 return DoConnect(false /* error */, false /* sync */,
402 false /* recoverable */);
403 case kMockPendingAdditionalErrorStateJob:
404 set_load_state(LOAD_STATE_CONNECTING);
405 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45406 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18407 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13408 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45409 weak_factory_.GetWeakPtr(), false /* error */,
410 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53411 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18412 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28413 case kMockUnreadDataJob: {
414 int ret = DoConnect(true /* successful */, false /* sync */,
415 false /* recoverable */);
416 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
417 return ret;
418 }
[email protected]ab838892009-06-30 18:49:05419 default:
420 NOTREACHED();
danakj655b66c2016-04-16 00:51:38421 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05422 return ERR_FAILED;
423 }
424 }
425
[email protected]e772db3f2010-07-12 18:11:13426 int DoConnect(bool succeed, bool was_async, bool recoverable) {
427 int result = OK;
[email protected]ab838892009-06-30 18:49:05428 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55429 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13430 } else if (recoverable) {
431 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40432 } else {
[email protected]e772db3f2010-07-12 18:11:13433 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38434 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05435 }
[email protected]2ab05b52009-07-01 23:57:58436
437 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30438 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05439 return result;
440 }
441
[email protected]5fc08e32009-07-15 17:09:57442 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05443 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57444 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21445 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18446 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05447
[email protected]d5492c52013-11-10 20:44:39448 base::WeakPtrFactory<TestConnectJob> weak_factory_;
449
[email protected]ab838892009-06-30 18:49:05450 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
451};
452
[email protected]d80a4322009-08-14 07:07:49453class TestConnectJobFactory
454 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05455 public:
[email protected]034df0f32013-01-07 23:17:48456 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
457 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05458 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48459 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48460 client_socket_factory_(client_socket_factory),
461 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33462 }
[email protected]ab838892009-06-30 18:49:05463
Chris Watkins7a41d3552017-12-01 02:13:27464 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05465
466 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
467
[email protected]51fdc7c2012-04-10 19:19:48468 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
469 job_types_ = job_types;
470 CHECK(!job_types_->empty());
471 }
472
[email protected]974ebd62009-08-03 23:14:34473 void set_timeout_duration(base::TimeDelta timeout_duration) {
474 timeout_duration_ = timeout_duration;
475 }
476
[email protected]3f55aa12011-12-07 02:03:33477 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55478
danakj655b66c2016-04-16 00:51:38479 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05480 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49481 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13482 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48483 EXPECT_TRUE(!job_types_ || !job_types_->empty());
484 TestConnectJob::JobType job_type = job_type_;
485 if (job_types_ && !job_types_->empty()) {
486 job_type = job_types_->front();
487 job_types_->pop_front();
488 }
danakj655b66c2016-04-16 00:51:38489 return std::unique_ptr<ConnectJob>(
490 new TestConnectJob(job_type, group_name, request, timeout_duration_,
491 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05492 }
493
dchengb03027d2014-10-21 12:00:20494 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26495 return timeout_duration_;
496 }
497
[email protected]ab838892009-06-30 18:49:05498 private:
499 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48500 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34501 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57502 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48503 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05504
505 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
506};
507
508class TestClientSocketPool : public ClientSocketPool {
509 public:
[email protected]12322e7e2013-08-15 17:49:26510 typedef TestSocketParams SocketParams;
511
[email protected]ab838892009-06-30 18:49:05512 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53513 int max_sockets,
[email protected]ab838892009-06-30 18:49:05514 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16515 base::TimeDelta unused_idle_socket_timeout,
516 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49517 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41518 : base_(NULL,
519 max_sockets,
520 max_sockets_per_group,
521 unused_idle_socket_timeout,
522 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38523 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05524
Chris Watkins7a41d3552017-12-01 02:13:27525 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13526
dchengb03027d2014-10-21 12:00:20527 int RequestSocket(const std::string& group_name,
528 const void* params,
ttuttle859dc7a2015-04-23 19:42:29529 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54530 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15531 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20532 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03533 CompletionOnceCallback callback,
tfarina428341112016-09-22 13:38:20534 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21535 const scoped_refptr<TestSocketParams>* casted_socket_params =
536 static_cast<const scoped_refptr<TestSocketParams>*>(params);
537 return base_.RequestSocket(group_name, *casted_socket_params, priority,
Bence Béky5a8662b2018-07-03 13:04:03538 socket_tag, respect_limits, handle,
539 std::move(callback), net_log);
[email protected]ab838892009-06-30 18:49:05540 }
541
dchengb03027d2014-10-21 12:00:20542 void RequestSockets(const std::string& group_name,
543 const void* params,
544 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57545 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03546 const scoped_refptr<TestSocketParams>* casted_params =
547 static_cast<const scoped_refptr<TestSocketParams>*>(params);
548
Charlie Harrison55ce6082018-05-14 02:25:57549 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03550 }
551
rdsmith29dbad12017-02-17 02:22:18552 void SetPriority(const std::string& group_name,
553 ClientSocketHandle* handle,
554 RequestPriority priority) override {
555 base_.SetPriority(group_name, handle, priority);
556 }
557
dchengb03027d2014-10-21 12:00:20558 void CancelRequest(const std::string& group_name,
559 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49560 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05561 }
562
dchengb03027d2014-10-21 12:00:20563 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38564 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20565 int id) override {
dchengc7eeda422015-12-26 03:56:48566 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24567 }
568
dchengb03027d2014-10-21 12:00:20569 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05570
dchengb03027d2014-10-21 12:00:20571 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48572
dchengb03027d2014-10-21 12:00:20573 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05574
xunjieli92feb332017-03-03 17:19:23575 void CloseIdleSocketsInGroup(const std::string& group_name) override {
576 base_.CloseIdleSocketsInGroup(group_name);
577 }
578
dchengb03027d2014-10-21 12:00:20579 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05580
dchengb03027d2014-10-21 12:00:20581 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49582 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05583 }
584
dchengb03027d2014-10-21 12:00:20585 LoadState GetLoadState(const std::string& group_name,
586 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49587 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05588 }
589
dchengb03027d2014-10-21 12:00:20590 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52591 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48592 }
593
dchengb03027d2014-10-21 12:00:20594 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52595 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48596 }
597
danakj655b66c2016-04-16 00:51:38598 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59599 const std::string& name,
600 const std::string& type,
mostynbba063d6032014-10-09 11:01:13601 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27602 return base_.GetInfoAsValue(name, type);
603 }
604
dchengb03027d2014-10-21 12:00:20605 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26606 return base_.ConnectionTimeout();
607 }
608
[email protected]d80a4322009-08-14 07:07:49609 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20610
[email protected]8159a1c2012-06-07 00:00:10611 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
612 return base_.NumUnassignedConnectJobsInGroup(group_name);
613 }
614
[email protected]974ebd62009-08-03 23:14:34615 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49616 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34617 }
618
[email protected]2c2bef152010-10-13 00:55:03619 int NumActiveSocketsInGroup(const std::string& group_name) const {
620 return base_.NumActiveSocketsInGroup(group_name);
621 }
622
[email protected]2abfe90a2010-08-25 17:49:51623 bool HasGroup(const std::string& group_name) const {
624 return base_.HasGroup(group_name);
625 }
626
[email protected]9bf28db2009-08-29 01:35:16627 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
628
[email protected]06d94042010-08-25 01:45:22629 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54630
[email protected]043b68c82013-08-22 23:41:52631 bool CloseOneIdleConnectionInHigherLayeredPool() {
632 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48633 }
634
[email protected]ab838892009-06-30 18:49:05635 private:
[email protected]d80a4322009-08-14 07:07:49636 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05637
638 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
639};
640
[email protected]a937a06d2009-08-19 21:19:24641} // namespace
642
[email protected]a937a06d2009-08-19 21:19:24643namespace {
644
[email protected]5fc08e32009-07-15 17:09:57645void MockClientSocketFactory::SignalJobs() {
646 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
647 it != waiting_jobs_.end(); ++it) {
648 (*it)->Signal();
649 }
650 waiting_jobs_.clear();
651}
652
[email protected]03b7c8c2013-07-20 04:38:55653void MockClientSocketFactory::SignalJob(size_t job) {
654 ASSERT_LT(job, waiting_jobs_.size());
655 waiting_jobs_[job]->Signal();
656 waiting_jobs_.erase(waiting_jobs_.begin() + job);
657}
658
659void MockClientSocketFactory::SetJobLoadState(size_t job,
660 LoadState load_state) {
661 ASSERT_LT(job, waiting_jobs_.size());
662 waiting_jobs_[job]->set_load_state(load_state);
663}
664
[email protected]974ebd62009-08-03 23:14:34665class TestConnectJobDelegate : public ConnectJob::Delegate {
666 public:
Weza03bae02018-07-13 17:17:33667 TestConnectJobDelegate() : have_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;
Weza03bae02018-07-13 17:17:33677 if (quit_wait_on_result_)
678 std::move(quit_wait_on_result_).Run();
[email protected]974ebd62009-08-03 23:14:34679 }
680
681 int WaitForResult() {
Weza03bae02018-07-13 17:17:33682 DCHECK(!quit_wait_on_result_);
[email protected]974ebd62009-08-03 23:14:34683 while (!have_result_) {
Weza03bae02018-07-13 17:17:33684 base::RunLoop run_loop;
685 quit_wait_on_result_ = run_loop.QuitClosure();
686 run_loop.Run();
[email protected]974ebd62009-08-03 23:14:34687 }
688 have_result_ = false; // auto-reset for next callback
689 return result_;
690 }
691
692 private:
693 bool have_result_;
Weza03bae02018-07-13 17:17:33694 base::OnceClosure quit_wait_on_result_;
[email protected]974ebd62009-08-03 23:14:34695 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),
Bence Béky8ddc2492018-06-13 01:02:042565 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522566
Chris Watkins7a41d3552017-12-01 02:13:272567 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042568
2569 ClientSocketHandle* handle() { return &handle_; }
2570
Bence Béky8ddc2492018-06-13 01:02:042571 CompletionOnceCallback callback() {
2572 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2573 base::Unretained(this));
2574 }
[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());
Bence Béky8ddc2492018-06-13 01:02:042583 EXPECT_EQ(
2584 expected_result_,
2585 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2586 ClientSocketPool::RespectLimits::ENABLED,
2587 CompletionOnceCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522588 }
2589
[email protected]2431756e2010-09-29 20:26:132590 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182591 int expected_result_;
2592 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042593 ClientSocketHandle handle_;
2594 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042595};
2596
[email protected]e60e47a2010-07-14 03:37:182597
2598TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2599 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2600
robpercival214763f2016-07-01 23:27:012601 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2602 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2603 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182604
[email protected]2431756e2010-09-29 20:26:132605 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182606 client_socket_factory_.allocation_count());
2607
2608 connect_job_factory_->set_job_type(
2609 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2610 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202611 EXPECT_EQ(
2612 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542613 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202614 ClientSocketPool::RespectLimits::ENABLED,
2615 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182616 // The next job should complete synchronously
2617 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2618
robpercival214763f2016-07-01 23:27:012619 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182620 EXPECT_FALSE(req.handle()->is_initialized());
2621 EXPECT_FALSE(req.handle()->socket());
2622 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432623 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182624}
2625
[email protected]b6501d3d2010-06-03 23:53:342626// http://crbug.com/44724 regression test.
2627// We start releasing the pool when we flush on network change. When that
2628// happens, the only active references are in the ClientSocketHandles. When a
2629// ConnectJob completes and calls back into the last ClientSocketHandle, that
2630// callback can release the last reference and delete the pool. After the
2631// callback finishes, we go back to the stack frame within the now-deleted pool.
2632// Executing any code that refers to members of the now-deleted pool can cause
2633// crashes.
2634TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2635 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2636 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2637
2638 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522639 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152640 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542641 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152642 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202643 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342644
[email protected]7af985a2012-12-14 22:40:422645 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342646
2647 // We'll call back into this now.
2648 callback.WaitForResult();
2649}
2650
[email protected]a7e38572010-06-07 18:22:242651TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2652 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2653 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2654
2655 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522656 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152657 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542658 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152659 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202660 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012661 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242662 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2663
[email protected]7af985a2012-12-14 22:40:422664 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242665
2666 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282667 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242668
mmenked3641e12016-01-28 16:06:152669 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542670 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152671 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202672 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012673 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242674 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2675}
2676
[email protected]6ecf2b92011-12-15 01:14:522677class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142678 public:
Bence Béky8ddc2492018-06-13 01:02:042679 ConnectWithinCallback(const std::string& group_name,
2680 const scoped_refptr<TestSocketParams>& params,
2681 TestClientSocketPool* pool)
2682 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142683
Chris Watkins7a41d3552017-12-01 02:13:272684 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142685
2686 int WaitForNestedResult() {
2687 return nested_callback_.WaitForResult();
2688 }
2689
Bence Béky8ddc2492018-06-13 01:02:042690 CompletionOnceCallback callback() {
2691 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2692 base::Unretained(this));
2693 }
[email protected]6ecf2b92011-12-15 01:14:522694
[email protected]06f92462010-08-31 19:24:142695 private:
[email protected]6ecf2b92011-12-15 01:14:522696 void OnComplete(int result) {
2697 SetResult(result);
tfarina428341112016-09-22 13:38:202698 EXPECT_EQ(
2699 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542700 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202701 ClientSocketPool::RespectLimits::ENABLED,
2702 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522703 }
2704
[email protected]06f92462010-08-31 19:24:142705 const std::string group_name_;
2706 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132707 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142708 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522709 TestCompletionCallback nested_callback_;
2710
2711 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142712};
2713
2714TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2715 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2716
2717 // First job will be waiting until it gets aborted.
2718 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2719
2720 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132721 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152722 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542723 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152724 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202725 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142726
2727 // Second job will be started during the first callback, and will
2728 // asynchronously complete with OK.
2729 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422730 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012731 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2732 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142733}
2734
[email protected]25eea382010-07-10 23:55:262735// Cancel a pending socket request while we're at max sockets,
2736// and verify that the backup socket firing doesn't cause a crash.
2737TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2738 // Max 4 sockets globally, max 4 sockets per group.
2739 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222740 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262741
[email protected]4baaf9d2010-08-31 15:15:442742 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2743 // timer.
[email protected]25eea382010-07-10 23:55:262744 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2745 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522746 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152747 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542748 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152749 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202750 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262751
2752 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2753 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2754 ClientSocketHandle handles[kDefaultMaxSockets];
2755 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522756 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542757 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202758 ClientSocketPool::RespectLimits::ENABLED,
2759 callback.callback(), pool_.get(),
2760 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262761 }
2762
fdoray5eeb7642016-06-22 16:11:282763 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262764
2765 // Cancel the pending request.
2766 handle.Reset();
2767
2768 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002769 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2770 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262771
fdoray5eeb7642016-06-22 16:11:282772 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262773 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2774}
2775
[email protected]3f00be82010-09-27 19:50:022776TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442777 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2778 pool_->EnableConnectBackupJobs();
2779
2780 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2781 // timer.
2782 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2783 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522784 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152785 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542786 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152787 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202788 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442789 ASSERT_TRUE(pool_->HasGroup("bar"));
2790 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102791 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442792
2793 // Cancel the socket request. This should cancel the backup timer. Wait for
2794 // the backup time to see if it indeed got canceled.
2795 handle.Reset();
2796 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002797 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2798 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282799 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442800 ASSERT_TRUE(pool_->HasGroup("bar"));
2801 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2802}
2803
[email protected]3f00be82010-09-27 19:50:022804TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2805 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2806 pool_->EnableConnectBackupJobs();
2807
2808 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2809 // timer.
2810 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2811 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522812 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152813 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542814 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152815 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202816 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022817 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2818 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522819 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202820 EXPECT_EQ(
2821 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542822 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202823 ClientSocketPool::RespectLimits::ENABLED,
2824 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022825 ASSERT_TRUE(pool_->HasGroup("bar"));
2826 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2827
2828 // Cancel request 1 and then complete request 2. With the requests finished,
2829 // the backup timer should be cancelled.
2830 handle.Reset();
robpercival214763f2016-07-01 23:27:012831 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022832 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002833 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2834 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282835 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022836}
2837
[email protected]eb5a99382010-07-11 03:18:262838// Test delayed socket binding for the case where we have two connects,
2839// and while one is waiting on a connect, the other frees up.
2840// The socket waiting on a connect should switch immediately to the freed
2841// up socket.
2842TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2843 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2844 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2845
2846 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522847 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132848 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542849 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152850 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202851 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012852 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262853
2854 // No idle sockets, no pending jobs.
2855 EXPECT_EQ(0, pool_->IdleSocketCount());
2856 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2857
2858 // Create a second socket to the same host, but this one will wait.
2859 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2860 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132861 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542862 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152863 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202864 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262865 // No idle sockets, and one connecting job.
2866 EXPECT_EQ(0, pool_->IdleSocketCount());
2867 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2868
2869 // Return the first handle to the pool. This will initiate the delayed
2870 // binding.
2871 handle1.Reset();
2872
fdoray5eeb7642016-06-22 16:11:282873 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262874
2875 // Still no idle sockets, still one pending connect job.
2876 EXPECT_EQ(0, pool_->IdleSocketCount());
2877 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2878
2879 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012880 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262881
2882 // And we can see there is still one job waiting.
2883 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2884
2885 // Finally, signal the waiting Connect.
2886 client_socket_factory_.SignalJobs();
2887 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2888
fdoray5eeb7642016-06-22 16:11:282889 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262890}
2891
2892// Test delayed socket binding when a group is at capacity and one
2893// of the group's sockets frees up.
2894TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2895 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2896 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2897
2898 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522899 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132900 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542901 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152902 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202903 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012904 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262905
2906 // No idle sockets, no pending jobs.
2907 EXPECT_EQ(0, pool_->IdleSocketCount());
2908 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2909
2910 // Create a second socket to the same host, but this one will wait.
2911 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2912 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132913 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542914 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152915 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202916 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262917 // No idle sockets, and one connecting job.
2918 EXPECT_EQ(0, pool_->IdleSocketCount());
2919 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2920
2921 // Return the first handle to the pool. This will initiate the delayed
2922 // binding.
2923 handle1.Reset();
2924
fdoray5eeb7642016-06-22 16:11:282925 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262926
2927 // Still no idle sockets, still one pending connect job.
2928 EXPECT_EQ(0, pool_->IdleSocketCount());
2929 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2930
2931 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012932 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262933
2934 // And we can see there is still one job waiting.
2935 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2936
2937 // Finally, signal the waiting Connect.
2938 client_socket_factory_.SignalJobs();
2939 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2940
fdoray5eeb7642016-06-22 16:11:282941 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262942}
2943
2944// Test out the case where we have one socket connected, one
2945// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512946// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262947// should complete, by taking the first socket's idle socket.
2948TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2949 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2950 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2951
2952 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522953 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132954 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542955 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152956 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202957 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012958 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262959
2960 // No idle sockets, no pending jobs.
2961 EXPECT_EQ(0, pool_->IdleSocketCount());
2962 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2963
2964 // Create a second socket to the same host, but this one will wait.
2965 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2966 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132967 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542968 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152969 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202970 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262971 // No idle sockets, and one connecting job.
2972 EXPECT_EQ(0, pool_->IdleSocketCount());
2973 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2974
2975 // Return the first handle to the pool. This will initiate the delayed
2976 // binding.
2977 handle1.Reset();
2978
fdoray5eeb7642016-06-22 16:11:282979 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262980
2981 // Still no idle sockets, still one pending connect job.
2982 EXPECT_EQ(0, pool_->IdleSocketCount());
2983 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2984
2985 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012986 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262987
2988 // And we can see there is still one job waiting.
2989 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2990
2991 // Finally, signal the waiting Connect.
2992 client_socket_factory_.SignalJobs();
2993 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2994
fdoray5eeb7642016-06-22 16:11:282995 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262996}
2997
[email protected]2abfe90a2010-08-25 17:49:512998// Cover the case where on an available socket slot, we have one pending
2999// request that completes synchronously, thereby making the Group empty.
3000TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3001 const int kUnlimitedSockets = 100;
3002 const int kOneSocketPerGroup = 1;
3003 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3004
3005 // Make the first request asynchronous fail.
3006 // This will free up a socket slot later.
3007 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3008
3009 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523010 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203011 EXPECT_EQ(
3012 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543013 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203014 ClientSocketPool::RespectLimits::ENABLED,
3015 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513016 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3017
3018 // Make the second request synchronously fail. This should make the Group
3019 // empty.
3020 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3021 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523022 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513023 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3024 // when created.
tfarina428341112016-09-22 13:38:203025 EXPECT_EQ(
3026 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543027 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203028 ClientSocketPool::RespectLimits::ENABLED,
3029 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513030
3031 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3032
robpercival214763f2016-07-01 23:27:013033 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3034 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513035 EXPECT_FALSE(pool_->HasGroup("a"));
3036}
3037
[email protected]e1b54dc2010-10-06 21:27:223038TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3039 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3040
3041 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3042
3043 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523044 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203045 EXPECT_EQ(
3046 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543047 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203048 ClientSocketPool::RespectLimits::ENABLED,
3049 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223050
3051 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523052 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203053 EXPECT_EQ(
3054 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543055 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203056 ClientSocketPool::RespectLimits::ENABLED,
3057 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223058 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523059 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203060 EXPECT_EQ(
3061 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543062 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203063 ClientSocketPool::RespectLimits::ENABLED,
3064 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223065
robpercival214763f2016-07-01 23:27:013066 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3067 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3068 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223069
3070 // Use the socket.
Ramin Halavati0a08cc82018-02-06 07:46:383071 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback(),
3072 TRAFFIC_ANNOTATION_FOR_TESTS));
3073 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback(),
3074 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223075
3076 handle1.Reset();
3077 handle2.Reset();
3078 handle3.Reset();
3079
tfarina428341112016-09-22 13:38:203080 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543081 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203082 ClientSocketPool::RespectLimits::ENABLED,
3083 callback1.callback(), pool_.get(), NetLogWithSource()));
3084 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543085 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203086 ClientSocketPool::RespectLimits::ENABLED,
3087 callback2.callback(), pool_.get(), NetLogWithSource()));
3088 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543089 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203090 ClientSocketPool::RespectLimits::ENABLED,
3091 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223092
3093 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3094 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3095 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3096}
3097
[email protected]2c2bef152010-10-13 00:55:033098TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3099 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3100 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3101
Charlie Harrison55ce6082018-05-14 02:25:573102 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033103
3104 ASSERT_TRUE(pool_->HasGroup("a"));
3105 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103106 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033107 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3108
3109 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523110 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203111 EXPECT_EQ(
3112 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543113 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203114 ClientSocketPool::RespectLimits::ENABLED,
3115 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033116
3117 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523118 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203119 EXPECT_EQ(
3120 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543121 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203122 ClientSocketPool::RespectLimits::ENABLED,
3123 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033124
3125 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103126 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033127 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3128
robpercival214763f2016-07-01 23:27:013129 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3130 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033131 handle1.Reset();
3132 handle2.Reset();
3133
3134 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103135 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033136 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3137}
3138
3139TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3140 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3141 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3142
3143 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523144 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203145 EXPECT_EQ(
3146 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543147 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203148 ClientSocketPool::RespectLimits::ENABLED,
3149 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033150
3151 ASSERT_TRUE(pool_->HasGroup("a"));
3152 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103153 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033154 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3155
Charlie Harrison55ce6082018-05-14 02:25:573156 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033157
3158 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103159 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033160 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3161
3162 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523163 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203164 EXPECT_EQ(
3165 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543166 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203167 ClientSocketPool::RespectLimits::ENABLED,
3168 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033169
3170 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103171 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033172 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3173
robpercival214763f2016-07-01 23:27:013174 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3175 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033176 handle1.Reset();
3177 handle2.Reset();
3178
3179 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103180 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033181 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3182}
3183
3184TEST_F(ClientSocketPoolBaseTest,
3185 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3186 CreatePool(4, 4);
3187 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3188
3189 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523190 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203191 EXPECT_EQ(
3192 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543193 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203194 ClientSocketPool::RespectLimits::ENABLED,
3195 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033196
3197 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523198 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203199 EXPECT_EQ(
3200 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543201 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203202 ClientSocketPool::RespectLimits::ENABLED,
3203 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033204
3205 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523206 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203207 EXPECT_EQ(
3208 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543209 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203210 ClientSocketPool::RespectLimits::ENABLED,
3211 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033212
3213 ASSERT_TRUE(pool_->HasGroup("a"));
3214 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103215 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033216 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3217
Charlie Harrison55ce6082018-05-14 02:25:573218 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033219
3220 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103221 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033222 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3223
robpercival214763f2016-07-01 23:27:013224 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3225 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3226 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033227 handle1.Reset();
3228 handle2.Reset();
3229 handle3.Reset();
3230
3231 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103232 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033233 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3234}
3235
3236TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3237 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3238 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3239
3240 ASSERT_FALSE(pool_->HasGroup("a"));
3241
Charlie Harrison55ce6082018-05-14 02:25:573242 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033243
3244 ASSERT_TRUE(pool_->HasGroup("a"));
3245 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103246 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033247
3248 ASSERT_FALSE(pool_->HasGroup("b"));
3249
Charlie Harrison55ce6082018-05-14 02:25:573250 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033251
3252 ASSERT_FALSE(pool_->HasGroup("b"));
3253}
3254
3255TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3256 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3257 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3258
3259 ASSERT_FALSE(pool_->HasGroup("a"));
3260
3261 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573262 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033263
3264 ASSERT_TRUE(pool_->HasGroup("a"));
3265 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103266 EXPECT_EQ(kDefaultMaxSockets - 1,
3267 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483268 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033269
3270 ASSERT_FALSE(pool_->HasGroup("b"));
3271
Charlie Harrison55ce6082018-05-14 02:25:573272 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033273
3274 ASSERT_TRUE(pool_->HasGroup("b"));
3275 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483276 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033277}
3278
3279TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3280 CreatePool(4, 4);
3281 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3282
3283 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523284 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203285 EXPECT_EQ(
3286 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543287 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203288 ClientSocketPool::RespectLimits::ENABLED,
3289 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013290 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033291 handle1.Reset();
3292
3293 ASSERT_TRUE(pool_->HasGroup("a"));
3294 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103295 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033296 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3297
Charlie Harrison55ce6082018-05-14 02:25:573298 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033299
3300 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103301 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033302 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3303}
3304
3305TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3306 CreatePool(4, 4);
3307 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3308
3309 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523310 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203311 EXPECT_EQ(
3312 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543313 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203314 ClientSocketPool::RespectLimits::ENABLED,
3315 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013316 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033317
3318 ASSERT_TRUE(pool_->HasGroup("a"));
3319 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103320 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033321 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3322 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3323
Charlie Harrison55ce6082018-05-14 02:25:573324 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033325
3326 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103327 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033328 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3329 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3330}
3331
3332TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3333 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3334 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3335
3336 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573337 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033338
3339 ASSERT_TRUE(pool_->HasGroup("a"));
3340 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103341 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033342 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3343
3344 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573345 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033346
3347 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103348 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033349 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3350}
3351
[email protected]3c819f522010-12-02 02:03:123352TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3353 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3354 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3355
3356 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573357 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123358
3359 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523360
3361 connect_job_factory_->set_job_type(
3362 TestConnectJob::kMockAdditionalErrorStateJob);
3363 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573364 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523365
3366 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123367}
3368
[email protected]8159a1c2012-06-07 00:00:103369TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033370 CreatePool(4, 4);
3371 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3372
Charlie Harrison55ce6082018-05-14 02:25:573373 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033374
3375 ASSERT_TRUE(pool_->HasGroup("a"));
3376 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103377 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033378 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3379
Charlie Harrison55ce6082018-05-14 02:25:573380 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033381 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
3385 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523386 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203387 EXPECT_EQ(
3388 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543389 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203390 ClientSocketPool::RespectLimits::ENABLED,
3391 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013392 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033393
3394 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523395 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:543396 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153397 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203398 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033399 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013400 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3401 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033402 }
3403
[email protected]8159a1c2012-06-07 00:00:103404 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3405 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3406 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3407 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3408
[email protected]2c2bef152010-10-13 00:55:033409 handle1.Reset();
3410 handle2.Reset();
3411
[email protected]8159a1c2012-06-07 00:00:103412 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3413 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033414 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3415
Charlie Harrison55ce6082018-05-14 02:25:573416 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033417 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103418 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033419 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3420}
3421
3422TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3423 CreatePool(4, 4);
3424 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3425
Charlie Harrison55ce6082018-05-14 02:25:573426 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033427
3428 ASSERT_TRUE(pool_->HasGroup("a"));
3429 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103430 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033431 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3432
Charlie Harrison55ce6082018-05-14 02:25:573433 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033434 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103435 EXPECT_EQ(2, 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_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033439 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103440 EXPECT_EQ(3, 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_, 1, 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}
3448
3449TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3450 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3451 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3452
Charlie Harrison55ce6082018-05-14 02:25:573453 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033454
3455 ASSERT_TRUE(pool_->HasGroup("a"));
3456 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103457 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033458 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3459
3460 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523461 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203462 EXPECT_EQ(
3463 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543464 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203465 ClientSocketPool::RespectLimits::ENABLED,
3466 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033467
3468 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103469 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033470 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3471
robpercival214763f2016-07-01 23:27:013472 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033473
[email protected]0dc88b32014-03-26 20:12:283474 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483475 // starts, it has a connect start time.
3476 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033477 handle1.Reset();
3478
3479 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3480}
3481
[email protected]034df0f32013-01-07 23:17:483482// Checks that fully connected preconnect jobs have no connect times, and are
3483// marked as reused.
3484TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3485 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3486 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573487 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483488
3489 ASSERT_TRUE(pool_->HasGroup("a"));
3490 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3491 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3492 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3493
3494 ClientSocketHandle handle;
3495 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203496 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543497 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203498 ClientSocketPool::RespectLimits::ENABLED,
3499 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483500
3501 // Make sure the idle socket was used.
3502 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3503
3504 TestLoadTimingInfoConnectedReused(handle);
3505 handle.Reset();
3506 TestLoadTimingInfoNotConnected(handle);
3507}
3508
[email protected]dcbe168a2010-12-02 03:14:463509// http://crbug.com/64940 regression test.
3510TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3511 const int kMaxTotalSockets = 3;
3512 const int kMaxSocketsPerGroup = 2;
3513 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3514 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3515
3516 // Note that group name ordering matters here. "a" comes before "b", so
3517 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3518
3519 // Set up one idle socket in "a".
3520 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523521 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203522 EXPECT_EQ(
3523 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543524 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203525 ClientSocketPool::RespectLimits::ENABLED,
3526 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463527
robpercival214763f2016-07-01 23:27:013528 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463529 handle1.Reset();
3530 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3531
3532 // Set up two active sockets in "b".
3533 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523534 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203535 EXPECT_EQ(
3536 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543537 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203538 ClientSocketPool::RespectLimits::ENABLED,
3539 callback1.callback(), pool_.get(), NetLogWithSource()));
3540 EXPECT_EQ(
3541 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543542 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203543 ClientSocketPool::RespectLimits::ENABLED,
3544 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463545
robpercival214763f2016-07-01 23:27:013546 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3547 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463548 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103549 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463550 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3551
3552 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3553 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3554 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3555 // sockets for "a", and "b" should still have 2 active sockets.
3556
Charlie Harrison55ce6082018-05-14 02:25:573557 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463558 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103559 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463560 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3561 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3562 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103563 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463564 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3565 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3566
3567 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3568 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3569 // "a" should result in closing 1 for "b".
3570 handle1.Reset();
3571 handle2.Reset();
3572 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3573 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3574
Charlie Harrison55ce6082018-05-14 02:25:573575 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463576 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103577 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463578 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3579 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3580 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103581 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463582 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3583 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3584}
3585
[email protected]b7b8be42011-07-12 12:46:413586TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073587 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3588 pool_->EnableConnectBackupJobs();
3589
3590 // Make the ConnectJob hang until it times out, shorten the timeout.
3591 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3592 connect_job_factory_->set_timeout_duration(
3593 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573594 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073595 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103596 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073597 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073598
[email protected]b7b8be42011-07-12 12:46:413599 // Verify the backup timer doesn't create a backup job, by making
3600 // the backup job a pending job instead of a waiting job, so it
3601 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073602 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453603 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443604 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343605 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283606 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073607 EXPECT_FALSE(pool_->HasGroup("a"));
3608}
3609
[email protected]b7b8be42011-07-12 12:46:413610TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073611 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3612 pool_->EnableConnectBackupJobs();
3613
3614 // Make the ConnectJob hang forever.
3615 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573616 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073617 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103618 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073619 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283620 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073621
3622 // Make the backup job be a pending job, so it completes normally.
3623 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3624 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523625 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153626 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543627 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153628 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203629 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413630 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073631 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103632 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073633 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3634 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013635 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073636
3637 // The hung connect job should still be there, but everything else should be
3638 // complete.
3639 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103640 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073641 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3642 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3643}
3644
[email protected]0dc88b32014-03-26 20:12:283645// Tests that a preconnect that starts out with unread data can still be used.
3646// http://crbug.com/334467
3647TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3648 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3649 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3650
Charlie Harrison55ce6082018-05-14 02:25:573651 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283652
3653 ASSERT_TRUE(pool_->HasGroup("a"));
3654 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3655 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3656 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3657
3658 // Fail future jobs to be sure that handle receives the preconnected socket
3659 // rather than closing it and making a new one.
3660 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3661 ClientSocketHandle handle;
3662 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203663 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543664 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203665 ClientSocketPool::RespectLimits::ENABLED,
3666 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283667
3668 ASSERT_TRUE(pool_->HasGroup("a"));
3669 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3670 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3671 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3672
3673 // Drain the pending read.
3674 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3675
3676 TestLoadTimingInfoConnectedReused(handle);
3677 handle.Reset();
3678
3679 // The socket should be usable now that it's idle again.
3680 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3681}
3682
[email protected]043b68c82013-08-22 23:41:523683class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203684 public:
3685 MockLayeredPool(TestClientSocketPool* pool,
3686 const std::string& group_name)
3687 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203688 group_name_(group_name),
3689 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523690 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203691 }
3692
Daniel Cheng4496d0822018-04-26 21:52:153693 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:203694
3695 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153696 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543697 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153698 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203699 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203700 }
3701
3702 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153703 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543704 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153705 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203706 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203707 }
3708
3709 bool ReleaseOneConnection() {
3710 if (!handle_.is_initialized() || !can_release_connection_) {
3711 return false;
3712 }
3713 handle_.socket()->Disconnect();
3714 handle_.Reset();
3715 return true;
3716 }
3717
3718 void set_can_release_connection(bool can_release_connection) {
3719 can_release_connection_ = can_release_connection;
3720 }
3721
3722 MOCK_METHOD0(CloseOneIdleConnection, bool());
3723
3724 private:
3725 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203726 ClientSocketHandle handle_;
3727 TestCompletionCallback callback_;
3728 const std::string group_name_;
3729 bool can_release_connection_;
3730};
3731
3732TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3733 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3734 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3735
3736 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013737 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203738 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3739 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523740 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203741}
3742
3743TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3744 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3745 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3746
3747 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013748 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203749 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3750 .WillOnce(Invoke(&mock_layered_pool,
3751 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523752 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203753}
3754
3755// Tests the basic case of closing an idle socket in a higher layered pool when
3756// a new request is issued and the lower layer pool is stalled.
3757TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3758 CreatePool(1, 1);
3759 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3760
3761 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013762 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203763 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3764 .WillOnce(Invoke(&mock_layered_pool,
3765 &MockLayeredPool::ReleaseOneConnection));
3766 ClientSocketHandle handle;
3767 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153768 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543769 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153770 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203771 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013772 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203773}
3774
3775// Same as above, but the idle socket is in the same group as the stalled
3776// socket, and closes the only other request in its group when closing requests
3777// in higher layered pools. This generally shouldn't happen, but it may be
3778// possible if a higher level pool issues a request and the request is
3779// subsequently cancelled. Even if it's not possible, best not to crash.
3780TEST_F(ClientSocketPoolBaseTest,
3781 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3782 CreatePool(2, 2);
3783 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3784
3785 // Need a socket in another group for the pool to be stalled (If a group
3786 // has the maximum number of connections already, it's not stalled).
3787 ClientSocketHandle handle1;
3788 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203789 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543790 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203791 ClientSocketPool::RespectLimits::ENABLED,
3792 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203793
3794 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013795 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203796 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3797 .WillOnce(Invoke(&mock_layered_pool,
3798 &MockLayeredPool::ReleaseOneConnection));
3799 ClientSocketHandle handle;
3800 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153801 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543802 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153803 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203804 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013805 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203806}
3807
3808// Tests the case when an idle socket can be closed when a new request is
3809// issued, and the new request belongs to a group that was previously stalled.
3810TEST_F(ClientSocketPoolBaseTest,
3811 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3812 CreatePool(2, 2);
3813 std::list<TestConnectJob::JobType> job_types;
3814 job_types.push_back(TestConnectJob::kMockJob);
3815 job_types.push_back(TestConnectJob::kMockJob);
3816 job_types.push_back(TestConnectJob::kMockJob);
3817 job_types.push_back(TestConnectJob::kMockJob);
3818 connect_job_factory_->set_job_types(&job_types);
3819
3820 ClientSocketHandle handle1;
3821 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203822 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543823 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203824 ClientSocketPool::RespectLimits::ENABLED,
3825 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203826
3827 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013828 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203829 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3830 .WillRepeatedly(Invoke(&mock_layered_pool,
3831 &MockLayeredPool::ReleaseOneConnection));
3832 mock_layered_pool.set_can_release_connection(false);
3833
3834 // The third request is made when the socket pool is in a stalled state.
3835 ClientSocketHandle handle3;
3836 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203837 EXPECT_EQ(
3838 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543839 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203840 ClientSocketPool::RespectLimits::ENABLED,
3841 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203842
3843 base::RunLoop().RunUntilIdle();
3844 EXPECT_FALSE(callback3.have_result());
3845
3846 // The fourth request is made when the pool is no longer stalled. The third
3847 // request should be serviced first, since it was issued first and has the
3848 // same priority.
3849 mock_layered_pool.set_can_release_connection(true);
3850 ClientSocketHandle handle4;
3851 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203852 EXPECT_EQ(
3853 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543854 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203855 ClientSocketPool::RespectLimits::ENABLED,
3856 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013857 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203858 EXPECT_FALSE(callback4.have_result());
3859
3860 // Closing a handle should free up another socket slot.
3861 handle1.Reset();
robpercival214763f2016-07-01 23:27:013862 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203863}
3864
3865// Tests the case when an idle socket can be closed when a new request is
3866// issued, and the new request belongs to a group that was previously stalled.
3867//
3868// The two differences from the above test are that the stalled requests are not
3869// in the same group as the layered pool's request, and the the fourth request
3870// has a higher priority than the third one, so gets a socket first.
3871TEST_F(ClientSocketPoolBaseTest,
3872 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3873 CreatePool(2, 2);
3874 std::list<TestConnectJob::JobType> job_types;
3875 job_types.push_back(TestConnectJob::kMockJob);
3876 job_types.push_back(TestConnectJob::kMockJob);
3877 job_types.push_back(TestConnectJob::kMockJob);
3878 job_types.push_back(TestConnectJob::kMockJob);
3879 connect_job_factory_->set_job_types(&job_types);
3880
3881 ClientSocketHandle handle1;
3882 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203883 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543884 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203885 ClientSocketPool::RespectLimits::ENABLED,
3886 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203887
3888 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013889 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203890 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3891 .WillRepeatedly(Invoke(&mock_layered_pool,
3892 &MockLayeredPool::ReleaseOneConnection));
3893 mock_layered_pool.set_can_release_connection(false);
3894
3895 // The third request is made when the socket pool is in a stalled state.
3896 ClientSocketHandle handle3;
3897 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203898 EXPECT_EQ(
3899 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543900 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:203901 ClientSocketPool::RespectLimits::ENABLED,
3902 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203903
3904 base::RunLoop().RunUntilIdle();
3905 EXPECT_FALSE(callback3.have_result());
3906
3907 // The fourth request is made when the pool is no longer stalled. This
3908 // request has a higher priority than the third request, so is serviced first.
3909 mock_layered_pool.set_can_release_connection(true);
3910 ClientSocketHandle handle4;
3911 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203912 EXPECT_EQ(
3913 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543914 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:203915 ClientSocketPool::RespectLimits::ENABLED,
3916 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013917 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203918 EXPECT_FALSE(callback3.have_result());
3919
3920 // Closing a handle should free up another socket slot.
3921 handle1.Reset();
robpercival214763f2016-07-01 23:27:013922 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203923}
3924
3925TEST_F(ClientSocketPoolBaseTest,
3926 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3927 CreatePool(1, 1);
3928 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3929
3930 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013931 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203932 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3933 .WillRepeatedly(Invoke(&mock_layered_pool1,
3934 &MockLayeredPool::ReleaseOneConnection));
3935 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013936 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3937 IsOk());
[email protected]58e562f2013-04-22 17:32:203938 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3939 .WillRepeatedly(Invoke(&mock_layered_pool2,
3940 &MockLayeredPool::ReleaseOneConnection));
3941 ClientSocketHandle handle;
3942 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153943 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543944 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153945 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203946 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013947 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203948}
3949
[email protected]b021ece62013-06-11 11:06:333950// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153951// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3952// socket instead of a request with the same priority that was issued earlier,
3953// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333954TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333955 CreatePool(1, 1);
3956
3957 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153958 EXPECT_EQ(
3959 OK, StartRequestWithIgnoreLimits(
3960 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333961 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3962
3963 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3964
mmenked3641e12016-01-28 16:06:153965 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3966 "a", MAXIMUM_PRIORITY,
3967 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333968 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3969
mmenked3641e12016-01-28 16:06:153970 // Issue a request that ignores the limits, so a new ConnectJob is
3971 // created.
3972 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3973 "a", MAXIMUM_PRIORITY,
3974 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333975 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3976
robpercival214763f2016-07-01 23:27:013977 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333978 EXPECT_FALSE(request(1)->have_result());
3979}
3980
[email protected]c55fabd2013-11-04 23:26:563981// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153982// issued for a request with RespectLimits::DISABLED is not cancelled when a
3983// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563984TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563985 CreatePool(1, 1);
3986
3987 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153988 EXPECT_EQ(
3989 OK, StartRequestWithIgnoreLimits(
3990 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563991 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3992
3993 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3994
mmenked3641e12016-01-28 16:06:153995 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3996 "a", MAXIMUM_PRIORITY,
3997 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563998 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3999
mmenked3641e12016-01-28 16:06:154000 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4001 // created.
4002 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4003 "a", MAXIMUM_PRIORITY,
4004 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334005 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4006
mmenked3641e12016-01-28 16:06:154007 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334008 // should not be cancelled.
4009 request(1)->handle()->Reset();
4010 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4011
robpercival214763f2016-07-01 23:27:014012 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334013 EXPECT_FALSE(request(1)->have_result());
4014}
4015
[email protected]f6d1d6eb2009-06-24 20:16:094016} // namespace
4017
4018} // namespace net