blob: 297d694b899158374f337394fff1e51f178f6acb [file] [log] [blame]
[email protected]e34400c32012-01-24 02:49:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]ab838892009-06-30 18:49:055#include "net/socket/client_socket_pool_base.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
tbansalf82cc8e2015-10-14 20:05:497#include <stdint.h>
dchengc7eeda422015-12-26 03:56:488#include <utility>
[email protected]51fdc7c2012-04-10 19:19:489#include <vector>
10
[email protected]6ecf2b92011-12-15 01:14:5211#include "base/bind.h"
12#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5913#include "base/callback.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
mmenke33d24423d2015-05-19 19:41:0915#include "base/logging.h"
Avi Drissman13fc8932015-12-20 04:40:4616#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1318#include "base/memory/weak_ptr.h"
[email protected]18b577412013-07-18 04:19:1519#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0326#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4827#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5928#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0629#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3130#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0931#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3532#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0733#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0034#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1935#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0036#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5637#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4638#include "net/log/test_net_log_entry.h"
39#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0940#include "net/socket/client_socket_factory.h"
41#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2642#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2843#include "net/socket/socket_performance_watcher.h"
[email protected]75439d3b2009-07-23 22:11:1744#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4445#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1046#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0147#include "net/test/gtest_util.h"
[email protected]a2b2cfc2017-12-06 09:06:0848#include "net/traffic_annotation/network_traffic_annotation.h"
[email protected]51fdc7c2012-04-10 19:19:4849#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0950#include "testing/gtest/include/gtest/gtest.h"
51
robpercival214763f2016-07-01 23:27:0152using net::test::IsError;
53using net::test::IsOk;
54
[email protected]51fdc7c2012-04-10 19:19:4855using ::testing::Invoke;
56using ::testing::Return;
57
[email protected]f6d1d6eb2009-06-24 20:16:0958namespace net {
59
60namespace {
61
[email protected]211d21722009-07-22 15:48:5362const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2063const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0164
[email protected]034df0f32013-01-07 23:17:4865// Make sure |handle| sets load times correctly when it has been assigned a
66// reused socket.
67void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
68 LoadTimingInfo load_timing_info;
69 // Only pass true in as |is_reused|, as in general, HttpStream types should
70 // have stricter concepts of reuse than socket pools.
71 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
72
73 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1974 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4875
[email protected]b258e0792013-01-12 07:11:5976 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
77 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4878}
79
80// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3381// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4882// of a connection where |is_reused| is false may consider the connection
83// reused.
84void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
85 EXPECT_FALSE(handle.is_reused());
86
87 LoadTimingInfo load_timing_info;
88 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
89
90 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1991 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4892
[email protected]b258e0792013-01-12 07:11:5993 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
94 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
95 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4896
97 TestLoadTimingInfoConnectedReused(handle);
98}
99
100// Make sure |handle| sets load times correctly, in the case that it does not
101// currently have a socket.
102void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
103 // Should only be set to true once a socket is assigned, if at all.
104 EXPECT_FALSE(handle.is_reused());
105
106 LoadTimingInfo load_timing_info;
107 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
108
109 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19110 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48111
[email protected]b258e0792013-01-12 07:11:59112 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
113 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48114}
115
[email protected]df4b4ef2010-07-12 18:25:21116class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20117 public:
Chris Watkins7a41d3552017-12-01 02:13:27118 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48119
[email protected]df4b4ef2010-07-12 18:25:21120 private:
121 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27122 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21123};
[email protected]7fc5b09a2010-02-27 00:07:38124typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49125
[email protected]3268023f2011-05-05 00:08:10126class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09127 public:
[email protected]034df0f32013-01-07 23:17:48128 explicit MockClientSocket(net::NetLog* net_log)
129 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28130 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20131 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Alexandr Ilin65ec9582017-10-02 14:50:31132 was_used_to_convey_data_(false),
133 motivation_(HttpRequestInfo::NORMAL_MOTIVATION) {}
[email protected]f6d1d6eb2009-06-24 20:16:09134
[email protected]0dc88b32014-03-26 20:12:28135 // Sets whether the socket has unread data. If true, the next call to Read()
136 // will return 1 byte and IsConnectedAndIdle() will return false.
137 void set_has_unread_data(bool has_unread_data) {
138 has_unread_data_ = has_unread_data;
139 }
140
Alexandr Ilin65ec9582017-10-02 14:50:31141 HttpRequestInfo::RequestMotivation motivation() const { return motivation_; }
142
[email protected]3f55aa12011-12-07 02:03:33143 // Socket implementation.
dchengb03027d2014-10-21 12:00:20144 int Read(IOBuffer* /* buf */,
145 int len,
146 const CompletionCallback& /* 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,
158 const CompletionCallback& /* callback */,
159 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.
dchengb03027d2014-10-21 12:00:20167 int Connect(const CompletionCallback& 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
Alexandr Ilin65ec9582017-10-02 14:50:31188 void SetSubresourceSpeculation() override {
189 motivation_ = HttpRequestInfo::PRECONNECT_MOTIVATED;
190 }
191 void SetOmniboxSpeculation() override {
192 motivation_ = HttpRequestInfo::OMNIBOX_MOTIVATED;
193 }
dchengb03027d2014-10-21 12:00:20194 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37195 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20196 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
197 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03198 void GetConnectionAttempts(ConnectionAttempts* out) const override {
199 out->clear();
200 }
201 void ClearConnectionAttempts() override {}
202 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49203 int64_t GetTotalReceivedBytes() const override {
204 NOTIMPLEMENTED();
205 return 0;
206 }
[email protected]9b5614a2010-08-25 20:29:45207
[email protected]f6d1d6eb2009-06-24 20:16:09208 private:
209 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28210 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20211 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01212 bool was_used_to_convey_data_;
Alexandr Ilin65ec9582017-10-02 14:50:31213 HttpRequestInfo::RequestMotivation motivation_;
[email protected]f6d1d6eb2009-06-24 20:16:09214
[email protected]ab838892009-06-30 18:49:05215 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09216};
217
[email protected]5fc08e32009-07-15 17:09:57218class TestConnectJob;
219
[email protected]f6d1d6eb2009-06-24 20:16:09220class MockClientSocketFactory : public ClientSocketFactory {
221 public:
[email protected]ab838892009-06-30 18:49:05222 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09223
danakj655b66c2016-04-16 00:51:38224 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04225 DatagramSocket::BindType bind_type,
226 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41227 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19228 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41229 NOTREACHED();
danakj655b66c2016-04-16 00:51:38230 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41231 }
232
danakj655b66c2016-04-16 00:51:38233 std::unique_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07234 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38235 std::unique_ptr<
236 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07237 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19238 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09239 allocation_count_++;
danakj655b66c2016-04-16 00:51:38240 return std::unique_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09241 }
242
danakj655b66c2016-04-16 00:51:38243 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
244 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27245 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21246 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13247 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09248 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38249 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09250 }
251
dchengb03027d2014-10-21 12:00:20252 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59253
[email protected]5fc08e32009-07-15 17:09:57254 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55255
[email protected]5fc08e32009-07-15 17:09:57256 void SignalJobs();
257
[email protected]03b7c8c2013-07-20 04:38:55258 void SignalJob(size_t job);
259
260 void SetJobLoadState(size_t job, LoadState load_state);
261
[email protected]f6d1d6eb2009-06-24 20:16:09262 int allocation_count() const { return allocation_count_; }
263
[email protected]f6d1d6eb2009-06-24 20:16:09264 private:
265 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57266 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09267};
268
[email protected]ab838892009-06-30 18:49:05269class TestConnectJob : public ConnectJob {
270 public:
271 enum JobType {
272 kMockJob,
273 kMockFailingJob,
274 kMockPendingJob,
275 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57276 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13277 kMockRecoverableJob,
278 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18279 kMockAdditionalErrorStateJob,
280 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28281 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05282 };
283
[email protected]994d4932010-07-12 17:55:13284 // The kMockPendingJob uses a slight delay before allowing the connect
285 // to complete.
286 static const int kPendingConnectDelay = 2;
287
[email protected]ab838892009-06-30 18:49:05288 TestConnectJob(JobType job_type,
289 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49290 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34291 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05292 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30293 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17294 NetLog* net_log)
tfarina428341112016-09-22 13:38:20295 : ConnectJob(
296 group_name,
297 timeout_duration,
298 request.priority(),
299 request.respect_limits(),
300 delegate,
davidbenb7048f092016-11-30 21:20:26301 NetLogWithSource::Make(net_log,
302 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58303 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05304 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18305 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39306 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15307 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05308
[email protected]974ebd62009-08-03 23:14:34309 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13310 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34311 }
312
[email protected]03b7c8c2013-07-20 04:38:55313 void set_load_state(LoadState load_state) { load_state_ = load_state; }
314
315 // From ConnectJob:
316
dchengb03027d2014-10-21 12:00:20317 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21318
dchengb03027d2014-10-21 12:00:20319 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18320 if (store_additional_error_state_) {
321 // Set all of the additional error state fields in some way.
322 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43323 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45324 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43325 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18326 }
327 }
328
[email protected]974ebd62009-08-03 23:14:34329 private:
[email protected]03b7c8c2013-07-20 04:38:55330 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05331
dchengb03027d2014-10-21 12:00:20332 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05333 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21334 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19335 NetLogSource());
danakj655b66c2016-04-16 00:51:38336 SetSocket(std::unique_ptr<StreamSocket>(
337 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05338 switch (job_type_) {
339 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13340 return DoConnect(true /* successful */, false /* sync */,
341 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05342 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13343 return DoConnect(false /* error */, false /* sync */,
344 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05345 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57346 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47347
348 // Depending on execution timings, posting a delayed task can result
349 // in the task getting executed the at the earliest possible
350 // opportunity or only after returning once from the message loop and
351 // then a second call into the message loop. In order to make behavior
352 // more deterministic, we change the default delay to 2ms. This should
353 // always require us to wait for the second call into the message loop.
354 //
355 // N.B. The correct fix for this and similar timing problems is to
356 // abstract time for the purpose of unittests. Unfortunately, we have
357 // a lot of third-party components that directly call the various
358 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45359 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05360 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13361 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45362 weak_factory_.GetWeakPtr(), true /* successful */,
363 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53364 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05365 return ERR_IO_PENDING;
366 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57367 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45368 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05369 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13370 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45371 weak_factory_.GetWeakPtr(), false /* error */,
372 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53373 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05374 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57375 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55376 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57377 client_socket_factory_->WaitForSignal(this);
378 waiting_success_ = true;
379 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13380 case kMockRecoverableJob:
381 return DoConnect(false /* error */, false /* sync */,
382 true /* recoverable */);
383 case kMockPendingRecoverableJob:
384 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45385 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13386 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13387 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45388 weak_factory_.GetWeakPtr(), false /* error */,
389 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53390 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13391 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18392 case kMockAdditionalErrorStateJob:
393 store_additional_error_state_ = true;
394 return DoConnect(false /* error */, false /* sync */,
395 false /* recoverable */);
396 case kMockPendingAdditionalErrorStateJob:
397 set_load_state(LOAD_STATE_CONNECTING);
398 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45399 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18400 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13401 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45402 weak_factory_.GetWeakPtr(), false /* error */,
403 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53404 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18405 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28406 case kMockUnreadDataJob: {
407 int ret = DoConnect(true /* successful */, false /* sync */,
408 false /* recoverable */);
409 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
410 return ret;
411 }
[email protected]ab838892009-06-30 18:49:05412 default:
413 NOTREACHED();
danakj655b66c2016-04-16 00:51:38414 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05415 return ERR_FAILED;
416 }
417 }
418
[email protected]e772db3f2010-07-12 18:11:13419 int DoConnect(bool succeed, bool was_async, bool recoverable) {
420 int result = OK;
[email protected]ab838892009-06-30 18:49:05421 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55422 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13423 } else if (recoverable) {
424 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40425 } else {
[email protected]e772db3f2010-07-12 18:11:13426 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38427 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05428 }
[email protected]2ab05b52009-07-01 23:57:58429
430 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30431 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05432 return result;
433 }
434
[email protected]5fc08e32009-07-15 17:09:57435 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05436 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57437 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21438 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18439 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05440
[email protected]d5492c52013-11-10 20:44:39441 base::WeakPtrFactory<TestConnectJob> weak_factory_;
442
[email protected]ab838892009-06-30 18:49:05443 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
444};
445
[email protected]d80a4322009-08-14 07:07:49446class TestConnectJobFactory
447 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05448 public:
[email protected]034df0f32013-01-07 23:17:48449 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
450 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05451 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48452 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48453 client_socket_factory_(client_socket_factory),
454 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33455 }
[email protected]ab838892009-06-30 18:49:05456
Chris Watkins7a41d3552017-12-01 02:13:27457 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05458
459 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
460
[email protected]51fdc7c2012-04-10 19:19:48461 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
462 job_types_ = job_types;
463 CHECK(!job_types_->empty());
464 }
465
[email protected]974ebd62009-08-03 23:14:34466 void set_timeout_duration(base::TimeDelta timeout_duration) {
467 timeout_duration_ = timeout_duration;
468 }
469
[email protected]3f55aa12011-12-07 02:03:33470 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55471
danakj655b66c2016-04-16 00:51:38472 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05473 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49474 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13475 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48476 EXPECT_TRUE(!job_types_ || !job_types_->empty());
477 TestConnectJob::JobType job_type = job_type_;
478 if (job_types_ && !job_types_->empty()) {
479 job_type = job_types_->front();
480 job_types_->pop_front();
481 }
danakj655b66c2016-04-16 00:51:38482 return std::unique_ptr<ConnectJob>(
483 new TestConnectJob(job_type, group_name, request, timeout_duration_,
484 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05485 }
486
dchengb03027d2014-10-21 12:00:20487 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26488 return timeout_duration_;
489 }
490
[email protected]ab838892009-06-30 18:49:05491 private:
492 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48493 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34494 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57495 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48496 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05497
498 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
499};
500
501class TestClientSocketPool : public ClientSocketPool {
502 public:
[email protected]12322e7e2013-08-15 17:49:26503 typedef TestSocketParams SocketParams;
504
[email protected]ab838892009-06-30 18:49:05505 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53506 int max_sockets,
[email protected]ab838892009-06-30 18:49:05507 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16508 base::TimeDelta unused_idle_socket_timeout,
509 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49510 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41511 : base_(NULL,
512 max_sockets,
513 max_sockets_per_group,
514 unused_idle_socket_timeout,
515 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38516 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05517
Chris Watkins7a41d3552017-12-01 02:13:27518 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13519
dchengb03027d2014-10-21 12:00:20520 int RequestSocket(const std::string& group_name,
521 const void* params,
ttuttle859dc7a2015-04-23 19:42:29522 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15523 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20524 ClientSocketHandle* handle,
525 const CompletionCallback& callback,
tfarina428341112016-09-22 13:38:20526 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21527 const scoped_refptr<TestSocketParams>* casted_socket_params =
528 static_cast<const scoped_refptr<TestSocketParams>*>(params);
529 return base_.RequestSocket(group_name, *casted_socket_params, priority,
mmenked3641e12016-01-28 16:06:15530 respect_limits, handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05531 }
532
dchengb03027d2014-10-21 12:00:20533 void RequestSockets(const std::string& group_name,
534 const void* params,
535 int num_sockets,
Alexandr Ilin65ec9582017-10-02 14:50:31536 const NetLogWithSource& net_log,
537 HttpRequestInfo::RequestMotivation motivation) override {
[email protected]2c2bef152010-10-13 00:55:03538 const scoped_refptr<TestSocketParams>* casted_params =
539 static_cast<const scoped_refptr<TestSocketParams>*>(params);
540
Alexandr Ilin65ec9582017-10-02 14:50:31541 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log,
542 motivation);
[email protected]2c2bef152010-10-13 00:55:03543 }
544
rdsmith29dbad12017-02-17 02:22:18545 void SetPriority(const std::string& group_name,
546 ClientSocketHandle* handle,
547 RequestPriority priority) override {
548 base_.SetPriority(group_name, handle, priority);
549 }
550
dchengb03027d2014-10-21 12:00:20551 void CancelRequest(const std::string& group_name,
552 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49553 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05554 }
555
dchengb03027d2014-10-21 12:00:20556 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38557 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20558 int id) override {
dchengc7eeda422015-12-26 03:56:48559 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24560 }
561
dchengb03027d2014-10-21 12:00:20562 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05563
dchengb03027d2014-10-21 12:00:20564 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48565
dchengb03027d2014-10-21 12:00:20566 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05567
xunjieli92feb332017-03-03 17:19:23568 void CloseIdleSocketsInGroup(const std::string& group_name) override {
569 base_.CloseIdleSocketsInGroup(group_name);
570 }
571
dchengb03027d2014-10-21 12:00:20572 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05573
dchengb03027d2014-10-21 12:00:20574 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49575 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05576 }
577
dchengb03027d2014-10-21 12:00:20578 LoadState GetLoadState(const std::string& group_name,
579 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49580 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05581 }
582
dchengb03027d2014-10-21 12:00:20583 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52584 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48585 }
586
dchengb03027d2014-10-21 12:00:20587 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52588 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48589 }
590
danakj655b66c2016-04-16 00:51:38591 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59592 const std::string& name,
593 const std::string& type,
mostynbba063d6032014-10-09 11:01:13594 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27595 return base_.GetInfoAsValue(name, type);
596 }
597
dchengb03027d2014-10-21 12:00:20598 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26599 return base_.ConnectionTimeout();
600 }
601
[email protected]d80a4322009-08-14 07:07:49602 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20603
[email protected]8159a1c2012-06-07 00:00:10604 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
605 return base_.NumUnassignedConnectJobsInGroup(group_name);
606 }
607
[email protected]974ebd62009-08-03 23:14:34608 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49609 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34610 }
611
[email protected]2c2bef152010-10-13 00:55:03612 int NumActiveSocketsInGroup(const std::string& group_name) const {
613 return base_.NumActiveSocketsInGroup(group_name);
614 }
615
[email protected]2abfe90a2010-08-25 17:49:51616 bool HasGroup(const std::string& group_name) const {
617 return base_.HasGroup(group_name);
618 }
619
[email protected]9bf28db2009-08-29 01:35:16620 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
621
[email protected]06d94042010-08-25 01:45:22622 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54623
[email protected]043b68c82013-08-22 23:41:52624 bool CloseOneIdleConnectionInHigherLayeredPool() {
625 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48626 }
627
[email protected]ab838892009-06-30 18:49:05628 private:
[email protected]d80a4322009-08-14 07:07:49629 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05630
631 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
632};
633
[email protected]a937a06d2009-08-19 21:19:24634} // namespace
635
[email protected]a937a06d2009-08-19 21:19:24636namespace {
637
[email protected]5fc08e32009-07-15 17:09:57638void MockClientSocketFactory::SignalJobs() {
639 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
640 it != waiting_jobs_.end(); ++it) {
641 (*it)->Signal();
642 }
643 waiting_jobs_.clear();
644}
645
[email protected]03b7c8c2013-07-20 04:38:55646void MockClientSocketFactory::SignalJob(size_t job) {
647 ASSERT_LT(job, waiting_jobs_.size());
648 waiting_jobs_[job]->Signal();
649 waiting_jobs_.erase(waiting_jobs_.begin() + job);
650}
651
652void MockClientSocketFactory::SetJobLoadState(size_t job,
653 LoadState load_state) {
654 ASSERT_LT(job, waiting_jobs_.size());
655 waiting_jobs_[job]->set_load_state(load_state);
656}
657
[email protected]974ebd62009-08-03 23:14:34658class TestConnectJobDelegate : public ConnectJob::Delegate {
659 public:
660 TestConnectJobDelegate()
661 : have_result_(false), waiting_for_result_(false), result_(OK) {}
Chris Watkins7a41d3552017-12-01 02:13:27662 ~TestConnectJobDelegate() override = default;
[email protected]974ebd62009-08-03 23:14:34663
dchengb03027d2014-10-21 12:00:20664 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34665 result_ = result;
danakj655b66c2016-04-16 00:51:38666 std::unique_ptr<ConnectJob> owned_job(job);
667 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07668 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44669 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34670 have_result_ = true;
671 if (waiting_for_result_)
Gabriel Charette53a9ef812017-07-26 12:36:23672 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]974ebd62009-08-03 23:14:34673 }
674
675 int WaitForResult() {
676 DCHECK(!waiting_for_result_);
677 while (!have_result_) {
678 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28679 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34680 waiting_for_result_ = false;
681 }
682 have_result_ = false; // auto-reset for next callback
683 return result_;
684 }
685
686 private:
687 bool have_result_;
688 bool waiting_for_result_;
689 int result_;
690};
691
[email protected]2431756e2010-09-29 20:26:13692class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09693 protected:
mmenked3641e12016-01-28 16:06:15694 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54695 connect_backup_jobs_enabled_ =
696 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
697 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
698 }
[email protected]2431756e2010-09-29 20:26:13699
dcheng67be2b1f2014-10-27 21:47:29700 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54701 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
702 connect_backup_jobs_enabled_);
703 }
[email protected]c9d6a1d2009-07-14 16:15:20704
[email protected]211d21722009-07-22 15:48:53705 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16706 CreatePoolWithIdleTimeouts(
707 max_sockets,
708 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30709 ClientSocketPool::unused_idle_socket_timeout(),
710 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16711 }
712
713 void CreatePoolWithIdleTimeouts(
714 int max_sockets, int max_sockets_per_group,
715 base::TimeDelta unused_idle_socket_timeout,
716 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20717 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48718 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
719 &net_log_);
[email protected]2431756e2010-09-29 20:26:13720 pool_.reset(new TestClientSocketPool(max_sockets,
721 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13722 unused_idle_socket_timeout,
723 used_idle_socket_timeout,
724 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20725 }
[email protected]f6d1d6eb2009-06-24 20:16:09726
mmenked3641e12016-01-28 16:06:15727 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33728 const std::string& group_name,
729 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15730 ClientSocketPool::RespectLimits respect_limits) {
731 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
732 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33733 }
734
735 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15736 return StartRequestWithIgnoreLimits(
737 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09738 }
739
[email protected]2431756e2010-09-29 20:26:13740 int GetOrderOfRequest(size_t index) const {
741 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09742 }
743
[email protected]2431756e2010-09-29 20:26:13744 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
745 return test_base_.ReleaseOneConnection(keep_alive);
746 }
747
748 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
749 test_base_.ReleaseAllConnections(keep_alive);
750 }
751
752 TestSocketRequest* request(int i) { return test_base_.request(i); }
753 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38754 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42755 return test_base_.requests();
756 }
rdsmith29dbad12017-02-17 02:22:18757 // Only counts the requests that get sockets asynchronously;
758 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13759 size_t completion_count() const { return test_base_.completion_count(); }
760
vishal.b62985ca92015-04-17 08:45:51761 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54762 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09763 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04764 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21765 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38766 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13767 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09768};
769
[email protected]974ebd62009-08-03 23:14:34770// Even though a timeout is specified, it doesn't time out on a synchronous
771// completion.
772TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
773 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06774 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49775 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07776 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15777 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20778 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
779 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38780 std::unique_ptr<TestConnectJob> job(
781 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
782 base::TimeDelta::FromMicroseconds(1), &delegate,
783 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01784 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34785}
786
787TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
788 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06789 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51790 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53791
[email protected]d80a4322009-08-14 07:07:49792 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07793 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15794 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20795 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
796 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34797 // Deleted by TestConnectJobDelegate.
798 TestConnectJob* job =
799 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12800 "a",
[email protected]974ebd62009-08-03 23:14:34801 request,
802 base::TimeDelta::FromMicroseconds(1),
803 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30804 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17805 &log);
robpercival214763f2016-07-01 23:27:01806 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00807 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01808 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30809
mmenke43758e62015-05-04 21:09:46810 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40811 log.GetEntries(&entries);
812
813 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00814 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
815 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46816 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00817 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
818 EXPECT_TRUE(LogContainsEvent(entries, 2,
819 NetLogEventType::CONNECT_JOB_SET_SOCKET,
820 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46821 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00822 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
823 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46824 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00825 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
826 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
827 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34828}
829
[email protected]5fc08e32009-07-15 17:09:57830TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53831 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20832
[email protected]6ecf2b92011-12-15 01:14:52833 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06834 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51835 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48836 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53837
mmenked3641e12016-01-28 16:06:15838 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
839 ClientSocketPool::RespectLimits::ENABLED,
840 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09841 EXPECT_TRUE(handle.is_initialized());
842 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48843 TestLoadTimingInfoConnectedNotReused(handle);
844
[email protected]f6d1d6eb2009-06-24 20:16:09845 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48846 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30847
mmenke43758e62015-05-04 21:09:46848 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40849 log.GetEntries(&entries);
850
851 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00852 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53853 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00854 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
855 NetLogEventPhase::NONE));
856 EXPECT_TRUE(LogContainsEvent(entries, 2,
857 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
858 NetLogEventPhase::NONE));
859 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09860}
861
[email protected]ab838892009-06-30 18:49:05862TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53863 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20864
[email protected]ab838892009-06-30 18:49:05865 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51866 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53867
[email protected]2431756e2010-09-29 20:26:13868 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52869 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18870 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13871 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43872 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45873 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13874 handle.set_ssl_error_response_info(info);
875 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:15876 handle.Init("a", params_, DEFAULT_PRIORITY,
877 ClientSocketPool::RespectLimits::ENABLED,
878 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13879 EXPECT_FALSE(handle.socket());
880 EXPECT_FALSE(handle.is_ssl_error());
881 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48882 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30883
mmenke43758e62015-05-04 21:09:46884 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40885 log.GetEntries(&entries);
886
887 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00888 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17889 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00890 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
891 NetLogEventPhase::NONE));
892 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09893}
894
[email protected]211d21722009-07-22 15:48:53895TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
[email protected]211d21722009-07-22 15:48:53896 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
897
[email protected]9e743cd2010-03-16 07:03:53898 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30899
robpercival214763f2016-07-01 23:27:01900 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
901 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
902 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
903 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53904
[email protected]2431756e2010-09-29 20:26:13905 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53906 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13907 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53908
robpercival214763f2016-07-01 23:27:01909 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
910 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
911 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53912
[email protected]2431756e2010-09-29 20:26:13913 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53914
[email protected]2431756e2010-09-29 20:26:13915 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53916 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13917 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53918
919 EXPECT_EQ(1, GetOrderOfRequest(1));
920 EXPECT_EQ(2, GetOrderOfRequest(2));
921 EXPECT_EQ(3, GetOrderOfRequest(3));
922 EXPECT_EQ(4, GetOrderOfRequest(4));
923 EXPECT_EQ(5, GetOrderOfRequest(5));
924 EXPECT_EQ(6, GetOrderOfRequest(6));
925 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17926
927 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13928 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53929}
930
931TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
[email protected]211d21722009-07-22 15:48:53932 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
933
[email protected]9e743cd2010-03-16 07:03:53934 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30935
[email protected]211d21722009-07-22 15:48:53936 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01937 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
938 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
939 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
940 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53941
[email protected]2431756e2010-09-29 20:26:13942 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53943 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13944 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53945
946 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01947 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53948
[email protected]2431756e2010-09-29 20:26:13949 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53950
[email protected]2431756e2010-09-29 20:26:13951 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53952 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13953 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53954
955 EXPECT_EQ(1, GetOrderOfRequest(1));
956 EXPECT_EQ(2, GetOrderOfRequest(2));
957 EXPECT_EQ(3, GetOrderOfRequest(3));
958 EXPECT_EQ(4, GetOrderOfRequest(4));
959 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17960
961 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13962 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53963}
964
965TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
[email protected]211d21722009-07-22 15:48:53966 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
967
robpercival214763f2016-07-01 23:27:01968 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
969 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
970 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
971 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53972
[email protected]2431756e2010-09-29 20:26:13973 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53974 client_socket_factory_.allocation_count());
975
robpercival214763f2016-07-01 23:27:01976 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
977 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
978 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53979
[email protected]2431756e2010-09-29 20:26:13980 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53981
[email protected]2431756e2010-09-29 20:26:13982 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53983
984 // First 4 requests don't have to wait, and finish in order.
985 EXPECT_EQ(1, GetOrderOfRequest(1));
986 EXPECT_EQ(2, GetOrderOfRequest(2));
987 EXPECT_EQ(3, GetOrderOfRequest(3));
988 EXPECT_EQ(4, GetOrderOfRequest(4));
989
[email protected]ac790b42009-12-02 04:31:31990 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
991 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53992 EXPECT_EQ(7, GetOrderOfRequest(5));
993 EXPECT_EQ(6, GetOrderOfRequest(6));
994 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17995
996 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13997 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53998}
999
rdsmith29dbad12017-02-17 02:22:181000// Test reprioritizing a request before completion doesn't interfere with
1001// its completion.
1002TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1003 CreatePool(kDefaultMaxSockets, 1);
1004
1005 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1006 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1007 EXPECT_TRUE(request(0)->handle()->socket());
1008 EXPECT_FALSE(request(1)->handle()->socket());
1009
1010 request(1)->handle()->SetPriority(MEDIUM);
1011
1012 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1013
1014 EXPECT_TRUE(request(1)->handle()->socket());
1015}
1016
1017// Reprioritize a request up past another one and make sure that changes the
1018// completion order.
1019TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1020 CreatePool(kDefaultMaxSockets, 1);
1021
1022 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1023 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1024 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1025 EXPECT_TRUE(request(0)->handle()->socket());
1026 EXPECT_FALSE(request(1)->handle()->socket());
1027 EXPECT_FALSE(request(2)->handle()->socket());
1028
1029 request(2)->handle()->SetPriority(HIGHEST);
1030
1031 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1032
1033 EXPECT_EQ(1, GetOrderOfRequest(1));
1034 EXPECT_EQ(3, GetOrderOfRequest(2));
1035 EXPECT_EQ(2, GetOrderOfRequest(3));
1036}
1037
1038// Reprioritize a request without changing relative priorities and check
1039// that the order doesn't change.
1040TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1041 CreatePool(kDefaultMaxSockets, 1);
1042
1043 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1044 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1045 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1046 EXPECT_TRUE(request(0)->handle()->socket());
1047 EXPECT_FALSE(request(1)->handle()->socket());
1048 EXPECT_FALSE(request(2)->handle()->socket());
1049
1050 request(2)->handle()->SetPriority(MEDIUM);
1051
1052 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1053
1054 EXPECT_EQ(1, GetOrderOfRequest(1));
1055 EXPECT_EQ(2, GetOrderOfRequest(2));
1056 EXPECT_EQ(3, GetOrderOfRequest(3));
1057}
1058
1059// Reprioritize a request past down another one and make sure that changes the
1060// completion order.
1061TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1062 CreatePool(kDefaultMaxSockets, 1);
1063
1064 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1065 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1066 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1067 EXPECT_TRUE(request(0)->handle()->socket());
1068 EXPECT_FALSE(request(1)->handle()->socket());
1069 EXPECT_FALSE(request(2)->handle()->socket());
1070
1071 request(1)->handle()->SetPriority(LOW);
1072
1073 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1074
1075 EXPECT_EQ(1, GetOrderOfRequest(1));
1076 EXPECT_EQ(3, GetOrderOfRequest(2));
1077 EXPECT_EQ(2, GetOrderOfRequest(3));
1078}
1079
1080// Reprioritize a request to the same level as another and confirm it is
1081// put after the old request.
1082TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1083 CreatePool(kDefaultMaxSockets, 1);
1084
1085 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1086 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1087 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1088 EXPECT_TRUE(request(0)->handle()->socket());
1089 EXPECT_FALSE(request(1)->handle()->socket());
1090 EXPECT_FALSE(request(2)->handle()->socket());
1091
1092 request(1)->handle()->SetPriority(MEDIUM);
1093
1094 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1095
1096 EXPECT_EQ(1, GetOrderOfRequest(1));
1097 EXPECT_EQ(3, GetOrderOfRequest(2));
1098 EXPECT_EQ(2, GetOrderOfRequest(3));
1099}
1100
[email protected]211d21722009-07-22 15:48:531101TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
[email protected]211d21722009-07-22 15:48:531102 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1103
robpercival214763f2016-07-01 23:27:011104 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1105 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1106 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1107 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531108
[email protected]2431756e2010-09-29 20:26:131109 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531110 client_socket_factory_.allocation_count());
1111
robpercival214763f2016-07-01 23:27:011112 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1113 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1114 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531115
[email protected]2431756e2010-09-29 20:26:131116 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531117
[email protected]2431756e2010-09-29 20:26:131118 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531119 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131120 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531121
1122 // First 4 requests don't have to wait, and finish in order.
1123 EXPECT_EQ(1, GetOrderOfRequest(1));
1124 EXPECT_EQ(2, GetOrderOfRequest(2));
1125 EXPECT_EQ(3, GetOrderOfRequest(3));
1126 EXPECT_EQ(4, GetOrderOfRequest(4));
1127
1128 // Request ("b", 7) has the highest priority, but we can't make new socket for
1129 // group "b", because it has reached the per-group limit. Then we make
1130 // socket for ("c", 6), because it has higher priority than ("a", 4),
1131 // and we still can't make a socket for group "b".
1132 EXPECT_EQ(5, GetOrderOfRequest(5));
1133 EXPECT_EQ(6, GetOrderOfRequest(6));
1134 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171135
1136 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131137 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531138}
1139
1140// Make sure that we count connecting sockets against the total limit.
1141TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
[email protected]211d21722009-07-22 15:48:531142 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1143
robpercival214763f2016-07-01 23:27:011144 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1145 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1146 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531147
1148 // Create one asynchronous request.
1149 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011150 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531151
[email protected]6b175382009-10-13 06:47:471152 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1153 // actually become pending until 2ms after they have been created. In order
1154 // to flush all tasks, we need to wait so that we know there are no
1155 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001156 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281157 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471158
[email protected]211d21722009-07-22 15:48:531159 // The next synchronous request should wait for its turn.
1160 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011161 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531162
[email protected]2431756e2010-09-29 20:26:131163 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531164
[email protected]2431756e2010-09-29 20:26:131165 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531166 client_socket_factory_.allocation_count());
1167
1168 EXPECT_EQ(1, GetOrderOfRequest(1));
1169 EXPECT_EQ(2, GetOrderOfRequest(2));
1170 EXPECT_EQ(3, GetOrderOfRequest(3));
1171 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171172 EXPECT_EQ(5, GetOrderOfRequest(5));
1173
1174 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131175 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531176}
1177
[email protected]6427fe22010-04-16 22:27:411178TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
[email protected]6427fe22010-04-16 22:27:411179 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1180 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1181
robpercival214763f2016-07-01 23:27:011182 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1183 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1184 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1185 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411186
1187 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1188
1189 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1190
robpercival214763f2016-07-01 23:27:011191 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1192 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411193
1194 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1195
[email protected]2431756e2010-09-29 20:26:131196 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411197 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131198 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411199 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131200 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1201 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411202 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]6427fe22010-04-16 22:27:411203}
1204
[email protected]d7027bb2010-05-10 18:58:541205TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1206 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1207 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1208
1209 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521210 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131211 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151212 handle.Init("a", params_, DEFAULT_PRIORITY,
1213 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201214 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541215
1216 ClientSocketHandle handles[4];
1217 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521218 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201219 EXPECT_EQ(
1220 ERR_IO_PENDING,
1221 handles[i].Init("b", params_, DEFAULT_PRIORITY,
1222 ClientSocketPool::RespectLimits::ENABLED,
1223 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541224 }
1225
1226 // One will be stalled, cancel all the handles now.
1227 // This should hit the OnAvailableSocketSlot() code where we previously had
1228 // stalled groups, but no longer have any.
1229 for (size_t i = 0; i < arraysize(handles); ++i)
1230 handles[i].Reset();
1231}
1232
[email protected]eb5a99382010-07-11 03:18:261233TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541234 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1235 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1236
[email protected]eb5a99382010-07-11 03:18:261237 {
1238 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521239 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261240 for (int i = 0; i < kDefaultMaxSockets; ++i) {
tfarina428341112016-09-22 13:38:201241 EXPECT_EQ(OK,
1242 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1243 ClientSocketPool::RespectLimits::ENABLED,
1244 callbacks[i].callback(), pool_.get(),
1245 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261246 }
1247
1248 // Force a stalled group.
1249 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521250 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201251 EXPECT_EQ(ERR_IO_PENDING,
1252 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1253 ClientSocketPool::RespectLimits::ENABLED,
1254 callback.callback(), pool_.get(),
1255 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261256
1257 // Cancel the stalled request.
1258 stalled_handle.Reset();
1259
1260 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1261 EXPECT_EQ(0, pool_->IdleSocketCount());
1262
1263 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541264 }
1265
[email protected]43a21b82010-06-10 21:30:541266 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1267 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261268}
[email protected]43a21b82010-06-10 21:30:541269
[email protected]eb5a99382010-07-11 03:18:261270TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1271 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1272 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1273
1274 {
1275 ClientSocketHandle handles[kDefaultMaxSockets];
1276 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521277 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201278 EXPECT_EQ(ERR_IO_PENDING,
1279 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1280 ClientSocketPool::RespectLimits::ENABLED,
1281 callback.callback(), pool_.get(),
1282 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261283 }
1284
1285 // Force a stalled group.
1286 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1287 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521288 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201289 EXPECT_EQ(ERR_IO_PENDING,
1290 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1291 ClientSocketPool::RespectLimits::ENABLED,
1292 callback.callback(), pool_.get(),
1293 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261294
1295 // Since it is stalled, it should have no connect jobs.
1296 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101297 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261298
1299 // Cancel the stalled request.
1300 handles[0].Reset();
1301
[email protected]eb5a99382010-07-11 03:18:261302 // Now we should have a connect job.
1303 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101304 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261305
1306 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011307 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261308
1309 EXPECT_EQ(kDefaultMaxSockets + 1,
1310 client_socket_factory_.allocation_count());
1311 EXPECT_EQ(0, pool_->IdleSocketCount());
1312 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101313 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261314
1315 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541316 }
1317
[email protected]eb5a99382010-07-11 03:18:261318 EXPECT_EQ(1, pool_->IdleSocketCount());
1319}
[email protected]43a21b82010-06-10 21:30:541320
[email protected]eb5a99382010-07-11 03:18:261321TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1322 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1323 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541324
[email protected]eb5a99382010-07-11 03:18:261325 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521326 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261327 {
[email protected]51fdc7c2012-04-10 19:19:481328 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261329 ClientSocketHandle handles[kDefaultMaxSockets];
1330 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521331 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201332 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
1333 params_, DEFAULT_PRIORITY,
1334 ClientSocketPool::RespectLimits::ENABLED,
1335 callback.callback(), pool_.get(),
1336 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261337 }
1338
1339 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1340 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481341 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261342
1343 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201344 EXPECT_EQ(ERR_IO_PENDING,
1345 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1346 ClientSocketPool::RespectLimits::ENABLED,
1347 callback.callback(), pool_.get(),
1348 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481349 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261350
1351 // Dropping out of scope will close all handles and return them to idle.
1352 }
[email protected]43a21b82010-06-10 21:30:541353
1354 // But if we wait for it, the released idle sockets will be closed in
1355 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011356 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261357
1358 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1359 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541360}
1361
1362// Regression test for http://crbug.com/40952.
1363TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
[email protected]43a21b82010-06-10 21:30:541364 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221365 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541366 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1367
1368 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1369 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521370 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201371 EXPECT_EQ(
1372 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1373 ClientSocketPool::RespectLimits::ENABLED,
1374 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541375 }
1376
1377 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281378 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541379
1380 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1381 // reuse a socket.
1382 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1383 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521384 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541385
1386 // "0" is special here, since it should be the first entry in the sorted map,
1387 // which is the one which we would close an idle socket for. We shouldn't
1388 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201389 EXPECT_EQ(OK,
1390 handle.Init("0", params_, DEFAULT_PRIORITY,
1391 ClientSocketPool::RespectLimits::ENABLED,
1392 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541393
[email protected]43a21b82010-06-10 21:30:541394 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1395 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1396}
1397
[email protected]ab838892009-06-30 18:49:051398TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531399 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091400
robpercival214763f2016-07-01 23:27:011401 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1402 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1403 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1404 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1405 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1406 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1407 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1408 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091409
[email protected]2431756e2010-09-29 20:26:131410 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201411 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1412 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131413 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1414 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091415
[email protected]c9d6a1d2009-07-14 16:15:201416 EXPECT_EQ(1, GetOrderOfRequest(1));
1417 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031418 EXPECT_EQ(8, GetOrderOfRequest(3));
1419 EXPECT_EQ(6, GetOrderOfRequest(4));
1420 EXPECT_EQ(4, GetOrderOfRequest(5));
1421 EXPECT_EQ(3, GetOrderOfRequest(6));
1422 EXPECT_EQ(5, GetOrderOfRequest(7));
1423 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171424
1425 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131426 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091427}
1428
[email protected]ab838892009-06-30 18:49:051429TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531430 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091431
robpercival214763f2016-07-01 23:27:011432 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1433 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1434 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1435 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1436 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1437 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1438 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091439
[email protected]2431756e2010-09-29 20:26:131440 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091441
[email protected]2431756e2010-09-29 20:26:131442 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011443 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201444
[email protected]2431756e2010-09-29 20:26:131445 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201446 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131447 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1448 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091449}
1450
1451// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051452// The pending connect job will be cancelled and should not call back into
1453// ClientSocketPoolBase.
1454TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531455 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201456
[email protected]ab838892009-06-30 18:49:051457 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131458 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521459 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151460 EXPECT_EQ(ERR_IO_PENDING,
1461 handle.Init("a", params_, DEFAULT_PRIORITY,
1462 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201463 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131464 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091465}
1466
[email protected]ab838892009-06-30 18:49:051467TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531468 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201469
[email protected]ab838892009-06-30 18:49:051470 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061471 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521472 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091473
mmenked3641e12016-01-28 16:06:151474 EXPECT_EQ(ERR_IO_PENDING,
1475 handle.Init("a", params_, DEFAULT_PRIORITY,
1476 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201477 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091478
1479 handle.Reset();
1480
[email protected]6ecf2b92011-12-15 01:14:521481 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131482 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151483 handle.Init("a", params_, DEFAULT_PRIORITY,
1484 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201485 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091486
robpercival214763f2016-07-01 23:27:011487 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091488 EXPECT_FALSE(callback.have_result());
1489
1490 handle.Reset();
1491}
1492
[email protected]ab838892009-06-30 18:49:051493TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531494 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091495
robpercival214763f2016-07-01 23:27:011496 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1497 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1498 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1499 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1500 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1501 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1502 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091503
1504 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201505 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131506 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1507 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091508
[email protected]2431756e2010-09-29 20:26:131509 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091510
[email protected]c9d6a1d2009-07-14 16:15:201511 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1512 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131513 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1514 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091515
[email protected]c9d6a1d2009-07-14 16:15:201516 EXPECT_EQ(1, GetOrderOfRequest(1));
1517 EXPECT_EQ(2, GetOrderOfRequest(2));
1518 EXPECT_EQ(5, GetOrderOfRequest(3));
1519 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131520 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1521 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201522 EXPECT_EQ(4, GetOrderOfRequest(6));
1523 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171524
1525 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131526 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091527}
1528
mmenke33d24423d2015-05-19 19:41:091529// Function to be used as a callback on socket request completion. It first
1530// disconnects the successfully connected socket from the first request, and
1531// then reuses the ClientSocketHandle to request another socket.
1532//
1533// |nested_callback| is called with the result of the second socket request.
1534void RequestSocketOnComplete(ClientSocketHandle* handle,
1535 TestClientSocketPool* pool,
1536 TestConnectJobFactory* test_connect_job_factory,
1537 TestConnectJob::JobType next_job_type,
1538 const CompletionCallback& nested_callback,
1539 int first_request_result) {
robpercival214763f2016-07-01 23:27:011540 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091541
1542 test_connect_job_factory->set_job_type(next_job_type);
1543
1544 // Don't allow reuse of the socket. Disconnect it and then release it.
1545 if (handle->socket())
1546 handle->socket()->Disconnect();
1547 handle->Reset();
1548
mmenked3641e12016-01-28 16:06:151549 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091550 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151551 int rv = handle->Init("a", params, LOWEST,
1552 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201553 nested_callback, pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091554 if (rv != ERR_IO_PENDING) {
1555 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1556 nested_callback.Run(rv);
1557 } else {
1558 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521559 }
mmenke33d24423d2015-05-19 19:41:091560}
[email protected]f6d1d6eb2009-06-24 20:16:091561
mmenke33d24423d2015-05-19 19:41:091562// Tests the case where a second socket is requested in a completion callback,
1563// and the second socket connects asynchronously. Reuses the same
1564// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581565TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531566 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201567
[email protected]0b7648c2009-07-06 20:14:011568 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061569 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091570 TestCompletionCallback second_result_callback;
1571 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151572 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091573 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1574 connect_job_factory_, TestConnectJob::kMockPendingJob,
1575 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201576 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011577 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091578
robpercival214763f2016-07-01 23:27:011579 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581580}
[email protected]f6d1d6eb2009-06-24 20:16:091581
mmenke33d24423d2015-05-19 19:41:091582// Tests the case where a second socket is requested in a completion callback,
1583// and the second socket connects synchronously. Reuses the same
1584// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581585TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531586 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201587
[email protected]0b7648c2009-07-06 20:14:011588 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061589 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091590 TestCompletionCallback second_result_callback;
1591 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151592 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091593 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1594 connect_job_factory_, TestConnectJob::kMockPendingJob,
1595 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201596 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011597 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581598
robpercival214763f2016-07-01 23:27:011599 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091600}
1601
1602// Make sure that pending requests get serviced after active requests get
1603// cancelled.
[email protected]ab838892009-06-30 18:49:051604TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531605 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201606
[email protected]0b7648c2009-07-06 20:14:011607 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091608
robpercival214763f2016-07-01 23:27:011609 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1610 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1611 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1612 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1613 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1614 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1615 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091616
[email protected]c9d6a1d2009-07-14 16:15:201617 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1618 // Let's cancel them.
1619 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131620 ASSERT_FALSE(request(i)->handle()->is_initialized());
1621 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091622 }
1623
[email protected]f6d1d6eb2009-06-24 20:16:091624 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131625 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011626 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131627 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091628 }
1629
[email protected]2431756e2010-09-29 20:26:131630 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1631 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091632}
1633
1634// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051635TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531636 const size_t kMaxSockets = 5;
1637 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201638
[email protected]0b7648c2009-07-06 20:14:011639 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091640
[email protected]211d21722009-07-22 15:48:531641 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1642 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091643
1644 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531645 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011646 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091647
[email protected]211d21722009-07-22 15:48:531648 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011649 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091650}
1651
mmenke9d72fe42017-05-18 22:36:071652// Make sure that pending requests that complete synchronously get serviced
1653// after active requests fail. See https://crbug.com/723748
1654TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1655 const size_t kNumberOfRequests = 10;
1656 const size_t kMaxSockets = 1;
1657 CreatePool(kMaxSockets, kMaxSockets);
1658
1659 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1660
1661 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1662
1663 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1664
1665 // Queue up all the other requests
1666 for (size_t i = 1; i < kNumberOfRequests; ++i)
1667 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1668
1669 // Make sure all requests fail, instead of hanging.
1670 for (size_t i = 0; i < kNumberOfRequests; ++i)
1671 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1672}
1673
[email protected]5fc08e32009-07-15 17:09:571674TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531675 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571676
1677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1678
[email protected]2431756e2010-09-29 20:26:131679 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521680 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151681 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1682 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201683 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011684 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571685
1686 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131687 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571688
mmenked3641e12016-01-28 16:06:151689 rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1690 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));
1693 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571694
[email protected]2431756e2010-09-29 20:26:131695 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481696 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571697 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1698}
1699
xunjieli26619e72016-11-23 19:39:551700TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551701 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1702 ClientSocketHandle handle;
1703 TestCompletionCallback callback;
1704 BoundTestNetLog log;
1705 int rv = handle.Init("a", params_, LOWEST,
1706 ClientSocketPool::RespectLimits::ENABLED,
1707 callback.callback(), pool_.get(), log.bound());
1708 EXPECT_THAT(rv, IsOk());
1709 handle.Reset();
1710 EXPECT_EQ(1, pool_->IdleSocketCount());
1711 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551712}
1713
xunjieli92feb332017-03-03 17:19:231714TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231715 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1716 TestCompletionCallback callback;
1717 BoundTestNetLog log;
1718 ClientSocketHandle handle1;
1719 int rv = handle1.Init("a", params_, LOWEST,
1720 ClientSocketPool::RespectLimits::ENABLED,
1721 callback.callback(), pool_.get(), log.bound());
1722 EXPECT_THAT(rv, IsOk());
1723 ClientSocketHandle handle2;
1724 rv = handle2.Init("a", params_, LOWEST,
1725 ClientSocketPool::RespectLimits::ENABLED,
1726 callback.callback(), pool_.get(), log.bound());
1727 ClientSocketHandle handle3;
1728 rv = handle3.Init("b", params_, LOWEST,
1729 ClientSocketPool::RespectLimits::ENABLED,
1730 callback.callback(), pool_.get(), log.bound());
1731 EXPECT_THAT(rv, IsOk());
1732 handle1.Reset();
1733 handle2.Reset();
1734 handle3.Reset();
1735 EXPECT_EQ(3, pool_->IdleSocketCount());
1736 pool_->CloseIdleSocketsInGroup("a");
1737 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231738}
1739
xunjieli26619e72016-11-23 19:39:551740TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551741 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1742 ClientSocketHandle handle;
1743 TestCompletionCallback callback;
1744 BoundTestNetLog log;
1745 int rv = handle.Init("a", params_, LOWEST,
1746 ClientSocketPool::RespectLimits::ENABLED,
1747 callback.callback(), pool_.get(), log.bound());
1748 EXPECT_THAT(rv, IsOk());
1749 StreamSocket* socket = handle.socket();
1750 handle.Reset();
1751 EXPECT_EQ(1, pool_->IdleSocketCount());
1752
1753 // Disconnect socket now to make the socket unusable.
1754 socket->Disconnect();
1755 ClientSocketHandle handle2;
1756 rv = handle2.Init("a", params_, LOWEST,
1757 ClientSocketPool::RespectLimits::ENABLED,
1758 callback.callback(), pool_.get(), log.bound());
1759 EXPECT_THAT(rv, IsOk());
1760 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551761}
1762
[email protected]2b7523d2009-07-29 20:29:231763// Regression test for http://crbug.com/17985.
1764TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
[email protected]2b7523d2009-07-29 20:29:231765 const int kMaxSockets = 3;
1766 const int kMaxSocketsPerGroup = 2;
1767 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1768
[email protected]ac790b42009-12-02 04:31:311769 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231770
robpercival214763f2016-07-01 23:27:011771 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1772 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231773
1774 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011775 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231776
1777 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011778 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231779
1780 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011781 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1782 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231783
[email protected]eb5a99382010-07-11 03:18:261784 // Release the first two sockets from "a". Because this is a keepalive,
1785 // the first release will unblock the pending request for "a". The
1786 // second release will unblock a request for "c", becaue it is the next
1787 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131788 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2431756e2010-09-29 20:26:131789 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231790
1791 // Closing idle sockets should not get us into trouble, but in the bug
1792 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411793 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541794 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261795
[email protected]2da659e2013-05-23 20:51:341796 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281797 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231798}
1799
[email protected]4d3b05d2010-01-27 21:27:291800TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531801 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571802
1803 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131804 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521805 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511806 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:151807 int rv = handle.Init("a", params_, LOWEST,
1808 ClientSocketPool::RespectLimits::ENABLED,
1809 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011810 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131811 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481812 TestLoadTimingInfoNotConnected(handle);
1813
robpercival214763f2016-07-01 23:27:011814 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131815 EXPECT_TRUE(handle.is_initialized());
1816 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481817 TestLoadTimingInfoConnectedNotReused(handle);
1818
[email protected]2431756e2010-09-29 20:26:131819 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481820 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301821
mmenke43758e62015-05-04 21:09:461822 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401823 log.GetEntries(&entries);
1824
1825 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001826 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171827 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001828 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1829 NetLogEventPhase::NONE));
1830 EXPECT_TRUE(LogContainsEvent(entries, 2,
1831 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1832 NetLogEventPhase::NONE));
1833 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571834}
1835
[email protected]4d3b05d2010-01-27 21:27:291836TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571837 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531838 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571839
1840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131841 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521842 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511843 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181844 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131845 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431846 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451847 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131848 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151849 EXPECT_EQ(ERR_IO_PENDING,
1850 handle.Init("a", params_, DEFAULT_PRIORITY,
1851 ClientSocketPool::RespectLimits::ENABLED,
1852 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131853 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011854 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131855 EXPECT_FALSE(handle.is_ssl_error());
1856 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301857
mmenke43758e62015-05-04 21:09:461858 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401859 log.GetEntries(&entries);
1860
1861 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001862 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171863 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001864 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1865 NetLogEventPhase::NONE));
1866 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571867}
1868
mmenke6be122f2015-03-09 22:22:471869// Check that an async ConnectJob failure does not result in creation of a new
1870// ConnectJob when there's another pending request also waiting on its own
1871// ConnectJob. See http://crbug.com/463960.
1872TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1873 CreatePool(2, 2);
1874 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1875
robpercival214763f2016-07-01 23:27:011876 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1877 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471878
robpercival214763f2016-07-01 23:27:011879 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1880 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471881
1882 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1883}
1884
[email protected]4d3b05d2010-01-27 21:27:291885TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101886 // TODO(eroman): Add back the log expectations! Removed them because the
1887 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531888 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571889
1890 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131891 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521892 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131893 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521894 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571895
[email protected]2431756e2010-09-29 20:26:131896 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151897 handle.Init("a", params_, DEFAULT_PRIORITY,
1898 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201899 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511900 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201901 EXPECT_EQ(
1902 ERR_IO_PENDING,
1903 handle2.Init("a", params_, DEFAULT_PRIORITY,
1904 ClientSocketPool::RespectLimits::ENABLED,
1905 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571906
[email protected]2431756e2010-09-29 20:26:131907 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571908
[email protected]fd7b7c92009-08-20 19:38:301909
1910 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301911
robpercival214763f2016-07-01 23:27:011912 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131913 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301914
1915 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531916 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571917}
1918
[email protected]4d3b05d2010-01-27 21:27:291919TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341920 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1921
[email protected]17a0c6c2009-08-04 00:07:041922 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1923
robpercival214763f2016-07-01 23:27:011924 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1925 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1926 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1927 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341928
1929 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131930 (*requests())[2]->handle()->Reset();
1931 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341932 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1933
[email protected]2431756e2010-09-29 20:26:131934 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341935 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1936
[email protected]2431756e2010-09-29 20:26:131937 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261938 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341939}
1940
[email protected]5fc08e32009-07-15 17:09:571941// When requests and ConnectJobs are not coupled, the request will get serviced
1942// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291943TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531944 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571945
1946 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321947 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571948
[email protected]2431756e2010-09-29 20:26:131949 std::vector<TestSocketRequest*> request_order;
1950 size_t completion_count; // unused
1951 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:201952 int rv = req1.handle()->Init(
1953 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
1954 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011955 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1956 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571957
1958 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1959 // without a job.
1960 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1961
[email protected]2431756e2010-09-29 20:26:131962 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151963 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1964 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201965 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011966 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131967 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151968 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1969 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201970 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011971 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571972
1973 // Both Requests 2 and 3 are pending. We release socket 1 which should
1974 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331975 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341976 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281977 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331978 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011979 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331980 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571981
1982 // Signal job 2, which should service request 3.
1983
1984 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011985 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571986
[email protected]2431756e2010-09-29 20:26:131987 ASSERT_EQ(3U, request_order.size());
1988 EXPECT_EQ(&req1, request_order[0]);
1989 EXPECT_EQ(&req2, request_order[1]);
1990 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571991 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1992}
1993
1994// The requests are not coupled to the jobs. So, the requests should finish in
1995// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291996TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531997 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571998 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321999 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572000
[email protected]2431756e2010-09-29 20:26:132001 std::vector<TestSocketRequest*> request_order;
2002 size_t completion_count; // unused
2003 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:202004 int rv = req1.handle()->Init(
2005 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
2006 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012007 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572008
[email protected]2431756e2010-09-29 20:26:132009 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152010 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
2011 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202012 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012013 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572014
2015 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322016 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572017
[email protected]2431756e2010-09-29 20:26:132018 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152019 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
2020 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202021 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012022 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572023
robpercival214763f2016-07-01 23:27:012024 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2025 EXPECT_THAT(req2.WaitForResult(), IsOk());
2026 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572027
[email protected]2431756e2010-09-29 20:26:132028 ASSERT_EQ(3U, request_order.size());
2029 EXPECT_EQ(&req1, request_order[0]);
2030 EXPECT_EQ(&req2, request_order[1]);
2031 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572032}
2033
[email protected]03b7c8c2013-07-20 04:38:552034// Test GetLoadState in the case there's only one socket request.
2035TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532036 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552037 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572038
[email protected]2431756e2010-09-29 20:26:132039 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522040 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152041 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2042 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202043 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012044 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552045 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572046
[email protected]03b7c8c2013-07-20 04:38:552047 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2048 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2049
2050 // No point in completing the connection, since ClientSocketHandles only
2051 // expect the LoadState to be checked while connecting.
2052}
2053
2054// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002055// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552056TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2057 CreatePool(2, 2);
2058 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2059
2060 ClientSocketHandle handle;
2061 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152062 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2063 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202064 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012065 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002066 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2067
2068 ClientSocketHandle handle2;
2069 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152070 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2071 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202072 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012073 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002074 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2075
2076 // Check that both handles report the state of the first job.
2077 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2078 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2079
2080 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2081
2082 // Check that both handles change to LOAD_STATE_CONNECTING.
2083 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2084 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2085}
2086
2087// Test that the second connection request does not affect the pool's load
2088// status.
2089TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2090 CreatePool(2, 2);
2091 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2092
2093 ClientSocketHandle handle;
2094 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152095 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2096 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202097 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012098 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572099
[email protected]2431756e2010-09-29 20:26:132100 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522101 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152102 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2103 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202104 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012105 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002106 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552107
[email protected]03b7c8c2013-07-20 04:38:552108 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2109 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2110
haavardm835c1d62015-04-22 08:18:002111 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552112 // second handle switches to the state of the remaining ConnectJob.
2113 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012114 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002115 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552116}
2117
2118// Test GetLoadState in the case the per-group limit is reached.
2119TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2120 CreatePool(2, 1);
2121 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2122
2123 ClientSocketHandle handle;
2124 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152125 int rv = handle.Init("a", params_, MEDIUM,
2126 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202127 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012128 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552129 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2130
2131 // Request another socket from the same pool, buth with a higher priority.
2132 // The first request should now be stalled at the socket group limit.
2133 ClientSocketHandle handle2;
2134 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152135 rv = handle2.Init("a", params_, HIGHEST,
2136 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202137 callback2.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_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2140 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2141
2142 // The first handle should remain stalled as the other socket goes through
2143 // the connect process.
2144
2145 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2146 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2147 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2148
2149 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012150 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552151 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2152
2153 // Closing the second socket should cause the stalled handle to finally get a
2154 // ConnectJob.
2155 handle2.socket()->Disconnect();
2156 handle2.Reset();
2157 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2158}
2159
2160// Test GetLoadState in the case the per-pool limit is reached.
2161TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2162 CreatePool(2, 2);
2163 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2164
2165 ClientSocketHandle handle;
2166 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152167 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2168 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202169 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012170 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552171
2172 // Request for socket from another pool.
2173 ClientSocketHandle handle2;
2174 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152175 rv = handle2.Init("b", params_, DEFAULT_PRIORITY,
2176 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202177 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012178 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552179
2180 // Request another socket from the first pool. Request should stall at the
2181 // socket pool limit.
2182 ClientSocketHandle handle3;
2183 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152184 rv = handle3.Init("a", params_, DEFAULT_PRIORITY,
2185 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202186 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012187 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552188
2189 // The third handle should remain stalled as the other sockets in its group
2190 // goes through the connect process.
2191
2192 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2193 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2194
2195 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2196 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2197 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2198
2199 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012200 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552201 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2202
2203 // Closing a socket should allow the stalled handle to finally get a new
2204 // ConnectJob.
2205 handle.socket()->Disconnect();
2206 handle.Reset();
2207 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572208}
2209
[email protected]e772db3f2010-07-12 18:11:132210TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2211 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2212 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2213
[email protected]2431756e2010-09-29 20:26:132214 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522215 TestCompletionCallback callback;
2216 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
mmenked3641e12016-01-28 16:06:152217 handle.Init("a", params_, DEFAULT_PRIORITY,
2218 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202219 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132220 EXPECT_TRUE(handle.is_initialized());
2221 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132222}
2223
2224TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2225 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2226
2227 connect_job_factory_->set_job_type(
2228 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132229 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522230 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132231 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152232 handle.Init("a", params_, DEFAULT_PRIORITY,
2233 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202234 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132235 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012236 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132237 EXPECT_TRUE(handle.is_initialized());
2238 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132239}
2240
[email protected]e60e47a2010-07-14 03:37:182241TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2242 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2243 connect_job_factory_->set_job_type(
2244 TestConnectJob::kMockAdditionalErrorStateJob);
2245
[email protected]2431756e2010-09-29 20:26:132246 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522247 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132248 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:152249 handle.Init("a", params_, DEFAULT_PRIORITY,
2250 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202251 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132252 EXPECT_FALSE(handle.is_initialized());
2253 EXPECT_FALSE(handle.socket());
2254 EXPECT_TRUE(handle.is_ssl_error());
2255 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182256}
2257
2258TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2259 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2260
2261 connect_job_factory_->set_job_type(
2262 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132263 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522264 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132265 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152266 handle.Init("a", params_, DEFAULT_PRIORITY,
2267 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202268 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132269 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012270 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132271 EXPECT_FALSE(handle.is_initialized());
2272 EXPECT_FALSE(handle.socket());
2273 EXPECT_TRUE(handle.is_ssl_error());
2274 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182275}
2276
martijn003cd612016-05-19 22:24:382277// Make sure we can reuse sockets.
2278TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412279 CreatePoolWithIdleTimeouts(
2280 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032281 base::TimeDelta(), // Time out unused sockets immediately.
2282 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2283
2284 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2285
2286 ClientSocketHandle handle;
2287 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152288 int rv = handle.Init("a", params_, LOWEST,
2289 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202290 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012291 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032292 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012293 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032294
2295 // Use and release the socket.
2296 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482297 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032298 handle.Reset();
2299
2300 // Should now have one idle socket.
2301 ASSERT_EQ(1, pool_->IdleSocketCount());
2302
2303 // Request a new socket. This should reuse the old socket and complete
2304 // synchronously.
vishal.b62985ca92015-04-17 08:45:512305 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:152306 rv = handle.Init("a", params_, LOWEST,
2307 ClientSocketPool::RespectLimits::ENABLED,
2308 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012309 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032310 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482311 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032312
2313 ASSERT_TRUE(pool_->HasGroup("a"));
2314 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2315 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]e7b1c6d2c2012-05-05 00:54:032316
mmenke43758e62015-05-04 21:09:462317 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032318 log.GetEntries(&entries);
2319 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002320 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032321}
2322
blundellb8163592f2015-12-16 14:22:422323#if defined(OS_IOS)
2324// TODO(droger): Enable this test (crbug.com/512595).
martijn003cd612016-05-19 22:24:382325#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2326 DISABLED_CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422327#else
martijn003cd612016-05-19 22:24:382328#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2329 CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422330#endif
martijn003cd612016-05-19 22:24:382331// Make sure we cleanup old unused sockets.
2332TEST_F(ClientSocketPoolBaseTest, MAYBE_CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032333 CreatePoolWithIdleTimeouts(
2334 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2335 base::TimeDelta(), // Time out unused sockets immediately
2336 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412337
2338 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2339
2340 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2341
2342 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522343 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152344 int rv = handle.Init("a", params_, LOWEST,
2345 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202346 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012347 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412348 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2349
2350 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522351 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152352 rv = handle2.Init("a", params_, LOWEST,
2353 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202354 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012355 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412356 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2357
2358 // Cancel one of the requests. Wait for the other, which will get the first
2359 // job. Release the socket. Run the loop again to make sure the second
2360 // socket is sitting idle and the first one is released (since ReleaseSocket()
2361 // just posts a DoReleaseSocket() task).
2362
2363 handle.Reset();
robpercival214763f2016-07-01 23:27:012364 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412365 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552366 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412367 handle2.Reset();
2368
[email protected]e7b1c6d2c2012-05-05 00:54:032369 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2370 // actually become pending until 2ms after they have been created. In order
2371 // to flush all tasks, we need to wait so that we know there are no
2372 // soon-to-be-pending tasks waiting.
2373 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282374 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412375
[email protected]e7b1c6d2c2012-05-05 00:54:032376 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412377 ASSERT_EQ(2, pool_->IdleSocketCount());
2378
2379 // Request a new socket. This should cleanup the unused and timed out ones.
2380 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512381 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522382 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152383 rv = handle.Init("a", params_, LOWEST,
2384 ClientSocketPool::RespectLimits::ENABLED,
2385 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012386 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2387 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412388 EXPECT_FALSE(handle.is_reused());
2389
[email protected]e7b1c6d2c2012-05-05 00:54:032390 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412391 ASSERT_TRUE(pool_->HasGroup("a"));
2392 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2393 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2394
mmenke43758e62015-05-04 21:09:462395 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412396 log.GetEntries(&entries);
2397 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002398 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412399}
2400
[email protected]2041cf342010-02-19 03:15:592401// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162402// because of multiple releasing disconnected sockets.
2403TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2404 CreatePoolWithIdleTimeouts(
2405 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2406 base::TimeDelta(), // Time out unused sockets immediately.
2407 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2408
2409 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2410
2411 // Startup 4 connect jobs. Two of them will be pending.
2412
[email protected]2431756e2010-09-29 20:26:132413 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522414 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152415 int rv = handle.Init("a", params_, LOWEST,
2416 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202417 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012418 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162419
[email protected]2431756e2010-09-29 20:26:132420 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522421 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152422 rv = handle2.Init("a", params_, LOWEST,
2423 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202424 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012425 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162426
[email protected]2431756e2010-09-29 20:26:132427 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522428 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152429 rv = handle3.Init("a", params_, LOWEST,
2430 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202431 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012432 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162433
[email protected]2431756e2010-09-29 20:26:132434 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522435 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:152436 rv = handle4.Init("a", params_, LOWEST,
2437 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202438 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012439 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162440
2441 // Release two disconnected sockets.
2442
[email protected]2431756e2010-09-29 20:26:132443 handle.socket()->Disconnect();
2444 handle.Reset();
2445 handle2.socket()->Disconnect();
2446 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162447
robpercival214763f2016-07-01 23:27:012448 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132449 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012450 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132451 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162452}
2453
[email protected]d7027bb2010-05-10 18:58:542454// Regression test for http://crbug.com/42267.
2455// When DoReleaseSocket() is processed for one socket, it is blocked because the
2456// other stalled groups all have releasing sockets, so no progress can be made.
2457TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2458 CreatePoolWithIdleTimeouts(
2459 4 /* socket limit */, 4 /* socket limit per group */,
2460 base::TimeDelta(), // Time out unused sockets immediately.
2461 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2462
2463 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2464
2465 // Max out the socket limit with 2 per group.
2466
[email protected]2431756e2010-09-29 20:26:132467 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522468 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132469 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522470 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542471
2472 for (int i = 0; i < 2; ++i) {
mmenked3641e12016-01-28 16:06:152473 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST,
2474 ClientSocketPool::RespectLimits::ENABLED,
2475 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202476 NetLogWithSource()));
mmenked3641e12016-01-28 16:06:152477 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST,
2478 ClientSocketPool::RespectLimits::ENABLED,
2479 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202480 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542481 }
[email protected]b89f7e42010-05-20 20:37:002482
[email protected]d7027bb2010-05-10 18:58:542483 // Make 4 pending requests, 2 per group.
2484
2485 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202486 EXPECT_EQ(ERR_IO_PENDING,
2487 handle_a[i].Init("a", params_, LOWEST,
2488 ClientSocketPool::RespectLimits::ENABLED,
2489 callback_a[i].callback(), pool_.get(),
2490 NetLogWithSource()));
2491 EXPECT_EQ(ERR_IO_PENDING,
2492 handle_b[i].Init("b", params_, LOWEST,
2493 ClientSocketPool::RespectLimits::ENABLED,
2494 callback_b[i].callback(), pool_.get(),
2495 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542496 }
2497
2498 // Release b's socket first. The order is important, because in
2499 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2500 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2501 // first, which has a releasing socket, so it refuses to start up another
2502 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132503 handle_b[0].socket()->Disconnect();
2504 handle_b[0].Reset();
2505 handle_a[0].socket()->Disconnect();
2506 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542507
2508 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282509 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542510
[email protected]2431756e2010-09-29 20:26:132511 handle_b[1].socket()->Disconnect();
2512 handle_b[1].Reset();
2513 handle_a[1].socket()->Disconnect();
2514 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542515
2516 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2518 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542519 }
2520}
2521
[email protected]fd4fe0b2010-02-08 23:02:152522TEST_F(ClientSocketPoolBaseTest,
2523 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
[email protected]fd4fe0b2010-02-08 23:02:152524 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2525
2526 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2527
robpercival214763f2016-07-01 23:27:012528 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2529 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2530 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2531 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152532
robpercival214763f2016-07-01 23:27:012533 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2534 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132535 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152536
2537 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132538 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012539 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152540
[email protected]2431756e2010-09-29 20:26:132541 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012542 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132543 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152544
2545 EXPECT_EQ(1, GetOrderOfRequest(1));
2546 EXPECT_EQ(2, GetOrderOfRequest(2));
2547 EXPECT_EQ(3, GetOrderOfRequest(3));
2548 EXPECT_EQ(4, GetOrderOfRequest(4));
2549
2550 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132551 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152552}
2553
[email protected]6ecf2b92011-12-15 01:14:522554class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042555 public:
[email protected]2431756e2010-09-29 20:26:132556 TestReleasingSocketRequest(TestClientSocketPool* pool,
2557 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182558 bool reset_releasing_handle)
2559 : pool_(pool),
2560 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522561 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322562 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2563 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522564 }
2565
Chris Watkins7a41d3552017-12-01 02:13:272566 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042567
2568 ClientSocketHandle* handle() { return &handle_; }
2569
[email protected]6ecf2b92011-12-15 01:14:522570 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042571
2572 private:
[email protected]6ecf2b92011-12-15 01:14:522573 void OnComplete(int result) {
2574 SetResult(result);
2575 if (reset_releasing_handle_)
2576 handle_.Reset();
2577
mmenked3641e12016-01-28 16:06:152578 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522579 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072580 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:152581 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202582 callback2_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522583 }
2584
[email protected]2431756e2010-09-29 20:26:132585 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182586 int expected_result_;
2587 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042588 ClientSocketHandle handle_;
2589 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522590 CompletionCallback callback_;
2591 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042592};
2593
[email protected]e60e47a2010-07-14 03:37:182594
2595TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2596 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2597
robpercival214763f2016-07-01 23:27:012598 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2599 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2600 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182601
[email protected]2431756e2010-09-29 20:26:132602 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182603 client_socket_factory_.allocation_count());
2604
2605 connect_job_factory_->set_job_type(
2606 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2607 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202608 EXPECT_EQ(
2609 ERR_IO_PENDING,
2610 req.handle()->Init("a", params_, DEFAULT_PRIORITY,
2611 ClientSocketPool::RespectLimits::ENABLED,
2612 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182613 // The next job should complete synchronously
2614 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2615
robpercival214763f2016-07-01 23:27:012616 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182617 EXPECT_FALSE(req.handle()->is_initialized());
2618 EXPECT_FALSE(req.handle()->socket());
2619 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432620 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182621}
2622
[email protected]b6501d3d2010-06-03 23:53:342623// http://crbug.com/44724 regression test.
2624// We start releasing the pool when we flush on network change. When that
2625// happens, the only active references are in the ClientSocketHandles. When a
2626// ConnectJob completes and calls back into the last ClientSocketHandle, that
2627// callback can release the last reference and delete the pool. After the
2628// callback finishes, we go back to the stack frame within the now-deleted pool.
2629// Executing any code that refers to members of the now-deleted pool can cause
2630// crashes.
2631TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2632 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2633 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2634
2635 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522636 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152637 EXPECT_EQ(ERR_IO_PENDING,
2638 handle.Init("a", params_, DEFAULT_PRIORITY,
2639 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202640 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342641
[email protected]7af985a2012-12-14 22:40:422642 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342643
2644 // We'll call back into this now.
2645 callback.WaitForResult();
2646}
2647
[email protected]a7e38572010-06-07 18:22:242648TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2649 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2650 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2651
2652 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522653 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152654 EXPECT_EQ(ERR_IO_PENDING,
2655 handle.Init("a", params_, DEFAULT_PRIORITY,
2656 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202657 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012658 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242659 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2660
[email protected]7af985a2012-12-14 22:40:422661 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242662
2663 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282664 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242665
mmenked3641e12016-01-28 16:06:152666 EXPECT_EQ(ERR_IO_PENDING,
2667 handle.Init("a", params_, DEFAULT_PRIORITY,
2668 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202669 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012670 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242671 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2672}
2673
[email protected]6ecf2b92011-12-15 01:14:522674class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142675 public:
2676 ConnectWithinCallback(
2677 const std::string& group_name,
2678 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132679 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522680 : group_name_(group_name),
2681 params_(params),
2682 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322683 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2684 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142685 }
2686
Chris Watkins7a41d3552017-12-01 02:13:272687 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142688
2689 int WaitForNestedResult() {
2690 return nested_callback_.WaitForResult();
2691 }
2692
[email protected]6ecf2b92011-12-15 01:14:522693 const CompletionCallback& callback() const { return callback_; }
2694
[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,
2700 handle_.Init(group_name_, params_, DEFAULT_PRIORITY,
2701 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 CompletionCallback callback_;
2710 TestCompletionCallback nested_callback_;
2711
2712 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142713};
2714
2715TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2716 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2717
2718 // First job will be waiting until it gets aborted.
2719 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2720
2721 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132722 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152723 EXPECT_EQ(ERR_IO_PENDING,
2724 handle.Init("a", params_, DEFAULT_PRIORITY,
2725 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202726 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142727
2728 // Second job will be started during the first callback, and will
2729 // asynchronously complete with OK.
2730 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422731 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012732 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2733 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142734}
2735
[email protected]25eea382010-07-10 23:55:262736// Cancel a pending socket request while we're at max sockets,
2737// and verify that the backup socket firing doesn't cause a crash.
2738TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2739 // Max 4 sockets globally, max 4 sockets per group.
2740 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222741 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262742
[email protected]4baaf9d2010-08-31 15:15:442743 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2744 // timer.
[email protected]25eea382010-07-10 23:55:262745 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2746 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522747 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152748 EXPECT_EQ(ERR_IO_PENDING,
2749 handle.Init("bar", params_, DEFAULT_PRIORITY,
2750 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202751 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262752
2753 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2754 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2755 ClientSocketHandle handles[kDefaultMaxSockets];
2756 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522757 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:202758 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY,
2759 ClientSocketPool::RespectLimits::ENABLED,
2760 callback.callback(), pool_.get(),
2761 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262762 }
2763
fdoray5eeb7642016-06-22 16:11:282764 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262765
2766 // Cancel the pending request.
2767 handle.Reset();
2768
2769 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002770 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2771 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262772
fdoray5eeb7642016-06-22 16:11:282773 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262774 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2775}
2776
[email protected]3f00be82010-09-27 19:50:022777TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442778 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2779 pool_->EnableConnectBackupJobs();
2780
2781 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2782 // timer.
2783 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2784 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522785 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152786 EXPECT_EQ(ERR_IO_PENDING,
2787 handle.Init("bar", params_, DEFAULT_PRIORITY,
2788 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202789 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442790 ASSERT_TRUE(pool_->HasGroup("bar"));
2791 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102792 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442793
2794 // Cancel the socket request. This should cancel the backup timer. Wait for
2795 // the backup time to see if it indeed got canceled.
2796 handle.Reset();
2797 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002798 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2799 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282800 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442801 ASSERT_TRUE(pool_->HasGroup("bar"));
2802 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2803}
2804
[email protected]3f00be82010-09-27 19:50:022805TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2806 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2807 pool_->EnableConnectBackupJobs();
2808
2809 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2810 // timer.
2811 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2812 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522813 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152814 EXPECT_EQ(ERR_IO_PENDING,
2815 handle.Init("bar", params_, DEFAULT_PRIORITY,
2816 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202817 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022818 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2819 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522820 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202821 EXPECT_EQ(
2822 ERR_IO_PENDING,
2823 handle2.Init("bar", params_, DEFAULT_PRIORITY,
2824 ClientSocketPool::RespectLimits::ENABLED,
2825 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022826 ASSERT_TRUE(pool_->HasGroup("bar"));
2827 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2828
2829 // Cancel request 1 and then complete request 2. With the requests finished,
2830 // the backup timer should be cancelled.
2831 handle.Reset();
robpercival214763f2016-07-01 23:27:012832 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022833 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002834 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2835 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282836 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022837}
2838
[email protected]eb5a99382010-07-11 03:18:262839// Test delayed socket binding for the case where we have two connects,
2840// and while one is waiting on a connect, the other frees up.
2841// The socket waiting on a connect should switch immediately to the freed
2842// up socket.
2843TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2844 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2845 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2846
2847 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522848 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132849 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152850 handle1.Init("a", params_, DEFAULT_PRIORITY,
2851 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202852 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012853 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262854
2855 // No idle sockets, no pending jobs.
2856 EXPECT_EQ(0, pool_->IdleSocketCount());
2857 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2858
2859 // Create a second socket to the same host, but this one will wait.
2860 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2861 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132862 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152863 handle2.Init("a", params_, DEFAULT_PRIORITY,
2864 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202865 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262866 // No idle sockets, and one connecting job.
2867 EXPECT_EQ(0, pool_->IdleSocketCount());
2868 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2869
2870 // Return the first handle to the pool. This will initiate the delayed
2871 // binding.
2872 handle1.Reset();
2873
fdoray5eeb7642016-06-22 16:11:282874 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262875
2876 // Still no idle sockets, still one pending connect job.
2877 EXPECT_EQ(0, pool_->IdleSocketCount());
2878 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2879
2880 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012881 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262882
2883 // And we can see there is still one job waiting.
2884 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2885
2886 // Finally, signal the waiting Connect.
2887 client_socket_factory_.SignalJobs();
2888 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2889
fdoray5eeb7642016-06-22 16:11:282890 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262891}
2892
2893// Test delayed socket binding when a group is at capacity and one
2894// of the group's sockets frees up.
2895TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2896 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2897 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2898
2899 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522900 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132901 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152902 handle1.Init("a", params_, DEFAULT_PRIORITY,
2903 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202904 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012905 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262906
2907 // No idle sockets, no pending jobs.
2908 EXPECT_EQ(0, pool_->IdleSocketCount());
2909 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2910
2911 // Create a second socket to the same host, but this one will wait.
2912 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2913 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132914 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152915 handle2.Init("a", params_, DEFAULT_PRIORITY,
2916 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202917 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262918 // No idle sockets, and one connecting job.
2919 EXPECT_EQ(0, pool_->IdleSocketCount());
2920 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2921
2922 // Return the first handle to the pool. This will initiate the delayed
2923 // binding.
2924 handle1.Reset();
2925
fdoray5eeb7642016-06-22 16:11:282926 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262927
2928 // Still no idle sockets, still one pending connect job.
2929 EXPECT_EQ(0, pool_->IdleSocketCount());
2930 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2931
2932 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012933 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262934
2935 // And we can see there is still one job waiting.
2936 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2937
2938 // Finally, signal the waiting Connect.
2939 client_socket_factory_.SignalJobs();
2940 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2941
fdoray5eeb7642016-06-22 16:11:282942 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262943}
2944
2945// Test out the case where we have one socket connected, one
2946// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512947// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262948// should complete, by taking the first socket's idle socket.
2949TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2950 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2951 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2952
2953 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522954 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132955 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152956 handle1.Init("a", params_, DEFAULT_PRIORITY,
2957 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202958 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012959 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262960
2961 // No idle sockets, no pending jobs.
2962 EXPECT_EQ(0, pool_->IdleSocketCount());
2963 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2964
2965 // Create a second socket to the same host, but this one will wait.
2966 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2967 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132968 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152969 handle2.Init("a", params_, DEFAULT_PRIORITY,
2970 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202971 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262972 // No idle sockets, and one connecting job.
2973 EXPECT_EQ(0, pool_->IdleSocketCount());
2974 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2975
2976 // Return the first handle to the pool. This will initiate the delayed
2977 // binding.
2978 handle1.Reset();
2979
fdoray5eeb7642016-06-22 16:11:282980 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262981
2982 // Still no idle sockets, still one pending connect job.
2983 EXPECT_EQ(0, pool_->IdleSocketCount());
2984 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2985
2986 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012987 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262988
2989 // And we can see there is still one job waiting.
2990 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2991
2992 // Finally, signal the waiting Connect.
2993 client_socket_factory_.SignalJobs();
2994 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2995
fdoray5eeb7642016-06-22 16:11:282996 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262997}
2998
[email protected]2abfe90a2010-08-25 17:49:512999// Cover the case where on an available socket slot, we have one pending
3000// request that completes synchronously, thereby making the Group empty.
3001TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3002 const int kUnlimitedSockets = 100;
3003 const int kOneSocketPerGroup = 1;
3004 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3005
3006 // Make the first request asynchronous fail.
3007 // This will free up a socket slot later.
3008 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3009
3010 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523011 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203012 EXPECT_EQ(
3013 ERR_IO_PENDING,
3014 handle1.Init("a", params_, DEFAULT_PRIORITY,
3015 ClientSocketPool::RespectLimits::ENABLED,
3016 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513017 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3018
3019 // Make the second request synchronously fail. This should make the Group
3020 // empty.
3021 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3022 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523023 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513024 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3025 // when created.
tfarina428341112016-09-22 13:38:203026 EXPECT_EQ(
3027 ERR_IO_PENDING,
3028 handle2.Init("a", params_, DEFAULT_PRIORITY,
3029 ClientSocketPool::RespectLimits::ENABLED,
3030 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513031
3032 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3033
robpercival214763f2016-07-01 23:27:013034 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3035 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513036 EXPECT_FALSE(pool_->HasGroup("a"));
3037}
3038
[email protected]e1b54dc2010-10-06 21:27:223039TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3040 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3041
3042 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3043
3044 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523045 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203046 EXPECT_EQ(
3047 ERR_IO_PENDING,
3048 handle1.Init("a", params_, DEFAULT_PRIORITY,
3049 ClientSocketPool::RespectLimits::ENABLED,
3050 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223051
3052 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523053 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203054 EXPECT_EQ(
3055 ERR_IO_PENDING,
3056 handle2.Init("a", params_, DEFAULT_PRIORITY,
3057 ClientSocketPool::RespectLimits::ENABLED,
3058 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223059 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523060 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203061 EXPECT_EQ(
3062 ERR_IO_PENDING,
3063 handle3.Init("a", params_, DEFAULT_PRIORITY,
3064 ClientSocketPool::RespectLimits::ENABLED,
3065 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223066
robpercival214763f2016-07-01 23:27:013067 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3068 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3069 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223070
3071 // Use the socket.
[email protected]83039bb2011-12-09 18:43:553072 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
3073 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:223074
3075 handle1.Reset();
3076 handle2.Reset();
3077 handle3.Reset();
3078
tfarina428341112016-09-22 13:38:203079 EXPECT_EQ(
3080 OK, handle1.Init("a", params_, DEFAULT_PRIORITY,
3081 ClientSocketPool::RespectLimits::ENABLED,
3082 callback1.callback(), pool_.get(), NetLogWithSource()));
3083 EXPECT_EQ(
3084 OK, handle2.Init("a", params_, DEFAULT_PRIORITY,
3085 ClientSocketPool::RespectLimits::ENABLED,
3086 callback2.callback(), pool_.get(), NetLogWithSource()));
3087 EXPECT_EQ(
3088 OK, handle3.Init("a", params_, DEFAULT_PRIORITY,
3089 ClientSocketPool::RespectLimits::ENABLED,
3090 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223091
3092 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3093 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3094 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3095}
3096
[email protected]2c2bef152010-10-13 00:55:033097TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3098 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3099 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3100
Alexandr Ilin65ec9582017-10-02 14:50:313101 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3102 HttpRequestInfo::NORMAL_MOTIVATION);
[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,
3113 handle1.Init("a", params_, DEFAULT_PRIORITY,
3114 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,
3121 handle2.Init("a", params_, DEFAULT_PRIORITY,
3122 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,
3147 handle1.Init("a", params_, DEFAULT_PRIORITY,
3148 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
Alexandr Ilin65ec9582017-10-02 14:50:313156 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3157 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033158
3159 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103160 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033161 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3162
3163 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523164 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203165 EXPECT_EQ(
3166 ERR_IO_PENDING,
3167 handle2.Init("a", params_, DEFAULT_PRIORITY,
3168 ClientSocketPool::RespectLimits::ENABLED,
3169 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033170
3171 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103172 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033173 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3174
robpercival214763f2016-07-01 23:27:013175 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3176 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033177 handle1.Reset();
3178 handle2.Reset();
3179
3180 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103181 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033182 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3183}
3184
3185TEST_F(ClientSocketPoolBaseTest,
3186 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3187 CreatePool(4, 4);
3188 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3189
3190 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523191 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203192 EXPECT_EQ(
3193 ERR_IO_PENDING,
3194 handle1.Init("a", params_, DEFAULT_PRIORITY,
3195 ClientSocketPool::RespectLimits::ENABLED,
3196 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033197
3198 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523199 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203200 EXPECT_EQ(
3201 ERR_IO_PENDING,
3202 handle2.Init("a", params_, DEFAULT_PRIORITY,
3203 ClientSocketPool::RespectLimits::ENABLED,
3204 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033205
3206 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523207 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203208 EXPECT_EQ(
3209 ERR_IO_PENDING,
3210 handle3.Init("a", params_, DEFAULT_PRIORITY,
3211 ClientSocketPool::RespectLimits::ENABLED,
3212 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033213
3214 ASSERT_TRUE(pool_->HasGroup("a"));
3215 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103216 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033217 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3218
Alexandr Ilin65ec9582017-10-02 14:50:313219 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3220 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033221
3222 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103223 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033224 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3225
robpercival214763f2016-07-01 23:27:013226 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3227 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3228 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033229 handle1.Reset();
3230 handle2.Reset();
3231 handle3.Reset();
3232
3233 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103234 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033235 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3236}
3237
3238TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3239 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3240 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3241
3242 ASSERT_FALSE(pool_->HasGroup("a"));
3243
Alexandr Ilin65ec9582017-10-02 14:50:313244 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource(),
3245 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033246
3247 ASSERT_TRUE(pool_->HasGroup("a"));
3248 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103249 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033250
3251 ASSERT_FALSE(pool_->HasGroup("b"));
3252
Alexandr Ilin65ec9582017-10-02 14:50:313253 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource(),
3254 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033255
3256 ASSERT_FALSE(pool_->HasGroup("b"));
3257}
3258
3259TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3260 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3261 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3262
3263 ASSERT_FALSE(pool_->HasGroup("a"));
3264
3265 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Alexandr Ilin65ec9582017-10-02 14:50:313266 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033267
3268 ASSERT_TRUE(pool_->HasGroup("a"));
3269 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103270 EXPECT_EQ(kDefaultMaxSockets - 1,
3271 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483272 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033273
3274 ASSERT_FALSE(pool_->HasGroup("b"));
3275
Alexandr Ilin65ec9582017-10-02 14:50:313276 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource(),
3277 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033278
3279 ASSERT_TRUE(pool_->HasGroup("b"));
3280 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483281 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033282}
3283
3284TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3285 CreatePool(4, 4);
3286 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3287
3288 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523289 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203290 EXPECT_EQ(
3291 ERR_IO_PENDING,
3292 handle1.Init("a", params_, DEFAULT_PRIORITY,
3293 ClientSocketPool::RespectLimits::ENABLED,
3294 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013295 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033296 handle1.Reset();
3297
3298 ASSERT_TRUE(pool_->HasGroup("a"));
3299 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103300 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033301 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3302
Alexandr Ilin65ec9582017-10-02 14:50:313303 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3304 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033305
3306 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103307 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033308 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3309}
3310
3311TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3312 CreatePool(4, 4);
3313 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3314
3315 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523316 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203317 EXPECT_EQ(
3318 ERR_IO_PENDING,
3319 handle1.Init("a", params_, DEFAULT_PRIORITY,
3320 ClientSocketPool::RespectLimits::ENABLED,
3321 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013322 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033323
3324 ASSERT_TRUE(pool_->HasGroup("a"));
3325 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103326 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033327 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3328 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3329
Alexandr Ilin65ec9582017-10-02 14:50:313330 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3331 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033332
3333 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103334 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033335 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3336 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3337}
3338
3339TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3340 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3341 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3342
3343 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313344 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033345
3346 ASSERT_TRUE(pool_->HasGroup("a"));
3347 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103348 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033349 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3350
3351 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313352 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033353
3354 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103355 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033356 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3357}
3358
[email protected]3c819f522010-12-02 02:03:123359TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3360 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3361 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3362
3363 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313364 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]3c819f522010-12-02 02:03:123365
3366 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523367
3368 connect_job_factory_->set_job_type(
3369 TestConnectJob::kMockAdditionalErrorStateJob);
3370 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313371 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]fd2e53e2011-01-14 20:40:523372
3373 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123374}
3375
[email protected]8159a1c2012-06-07 00:00:103376TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033377 CreatePool(4, 4);
3378 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3379
Alexandr Ilin65ec9582017-10-02 14:50:313380 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3381 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033382
3383 ASSERT_TRUE(pool_->HasGroup("a"));
3384 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103385 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033386 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3387
Alexandr Ilin65ec9582017-10-02 14:50:313388 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3389 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033390 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103391 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033392 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3393
3394 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523395 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203396 EXPECT_EQ(
3397 ERR_IO_PENDING,
3398 handle1.Init("a", params_, DEFAULT_PRIORITY,
3399 ClientSocketPool::RespectLimits::ENABLED,
3400 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013401 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033402
3403 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523404 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153405 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
3406 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203407 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033408 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013409 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3410 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033411 }
3412
[email protected]8159a1c2012-06-07 00:00:103413 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3414 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3415 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3416 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3417
[email protected]2c2bef152010-10-13 00:55:033418 handle1.Reset();
3419 handle2.Reset();
3420
[email protected]8159a1c2012-06-07 00:00:103421 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3422 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033423 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3424
Alexandr Ilin65ec9582017-10-02 14:50:313425 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3426 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033427 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103428 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033429 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3430}
3431
3432TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3433 CreatePool(4, 4);
3434 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3435
Alexandr Ilin65ec9582017-10-02 14:50:313436 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3437 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033438
3439 ASSERT_TRUE(pool_->HasGroup("a"));
3440 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103441 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033442 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3443
Alexandr Ilin65ec9582017-10-02 14:50:313444 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3445 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033446 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103447 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033448 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3449
Alexandr Ilin65ec9582017-10-02 14:50:313450 pool_->RequestSockets("a", &params_, 3, NetLogWithSource(),
3451 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033452 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103453 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033454 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3455
Alexandr Ilin65ec9582017-10-02 14:50:313456 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3457 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033458 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103459 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033460 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3461}
3462
3463TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3464 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3465 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3466
Alexandr Ilin65ec9582017-10-02 14:50:313467 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3468 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033469
3470 ASSERT_TRUE(pool_->HasGroup("a"));
3471 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103472 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033473 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3474
3475 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523476 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203477 EXPECT_EQ(
3478 ERR_IO_PENDING,
3479 handle1.Init("a", params_, DEFAULT_PRIORITY,
3480 ClientSocketPool::RespectLimits::ENABLED,
3481 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033482
3483 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103484 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033485 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3486
robpercival214763f2016-07-01 23:27:013487 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033488
[email protected]0dc88b32014-03-26 20:12:283489 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483490 // starts, it has a connect start time.
3491 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033492 handle1.Reset();
3493
3494 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3495}
3496
[email protected]034df0f32013-01-07 23:17:483497// Checks that fully connected preconnect jobs have no connect times, and are
3498// marked as reused.
3499TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3500 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3501 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Alexandr Ilin65ec9582017-10-02 14:50:313502 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3503 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]034df0f32013-01-07 23:17:483504
3505 ASSERT_TRUE(pool_->HasGroup("a"));
3506 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3507 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3508 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3509
3510 ClientSocketHandle handle;
3511 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203512 EXPECT_EQ(OK,
3513 handle.Init("a", params_, DEFAULT_PRIORITY,
3514 ClientSocketPool::RespectLimits::ENABLED,
3515 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483516
3517 // Make sure the idle socket was used.
3518 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3519
3520 TestLoadTimingInfoConnectedReused(handle);
3521 handle.Reset();
3522 TestLoadTimingInfoNotConnected(handle);
3523}
3524
[email protected]dcbe168a2010-12-02 03:14:463525// http://crbug.com/64940 regression test.
3526TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3527 const int kMaxTotalSockets = 3;
3528 const int kMaxSocketsPerGroup = 2;
3529 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3530 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3531
3532 // Note that group name ordering matters here. "a" comes before "b", so
3533 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3534
3535 // Set up one idle socket in "a".
3536 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523537 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203538 EXPECT_EQ(
3539 ERR_IO_PENDING,
3540 handle1.Init("a", params_, DEFAULT_PRIORITY,
3541 ClientSocketPool::RespectLimits::ENABLED,
3542 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463543
robpercival214763f2016-07-01 23:27:013544 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463545 handle1.Reset();
3546 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3547
3548 // Set up two active sockets in "b".
3549 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523550 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203551 EXPECT_EQ(
3552 ERR_IO_PENDING,
3553 handle1.Init("b", params_, DEFAULT_PRIORITY,
3554 ClientSocketPool::RespectLimits::ENABLED,
3555 callback1.callback(), pool_.get(), NetLogWithSource()));
3556 EXPECT_EQ(
3557 ERR_IO_PENDING,
3558 handle2.Init("b", params_, DEFAULT_PRIORITY,
3559 ClientSocketPool::RespectLimits::ENABLED,
3560 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463561
robpercival214763f2016-07-01 23:27:013562 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3563 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463564 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103565 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463566 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3567
3568 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3569 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3570 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3571 // sockets for "a", and "b" should still have 2 active sockets.
3572
Alexandr Ilin65ec9582017-10-02 14:50:313573 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3574 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]dcbe168a2010-12-02 03:14:463575 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103576 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463577 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3578 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3579 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103580 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463581 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3582 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3583
3584 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3585 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3586 // "a" should result in closing 1 for "b".
3587 handle1.Reset();
3588 handle2.Reset();
3589 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3590 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3591
Alexandr Ilin65ec9582017-10-02 14:50:313592 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3593 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]dcbe168a2010-12-02 03:14:463594 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103595 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463596 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3597 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3598 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103599 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463600 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3601 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3602}
3603
[email protected]b7b8be42011-07-12 12:46:413604TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073605 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3606 pool_->EnableConnectBackupJobs();
3607
3608 // Make the ConnectJob hang until it times out, shorten the timeout.
3609 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3610 connect_job_factory_->set_timeout_duration(
3611 base::TimeDelta::FromMilliseconds(500));
Alexandr Ilin65ec9582017-10-02 14:50:313612 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3613 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]a9fc8fc2011-05-10 02:41:073614 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103615 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073616 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073617
[email protected]b7b8be42011-07-12 12:46:413618 // Verify the backup timer doesn't create a backup job, by making
3619 // the backup job a pending job instead of a waiting job, so it
3620 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073621 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453622 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173623 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343624 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283625 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073626 EXPECT_FALSE(pool_->HasGroup("a"));
3627}
3628
[email protected]b7b8be42011-07-12 12:46:413629TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073630 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3631 pool_->EnableConnectBackupJobs();
3632
3633 // Make the ConnectJob hang forever.
3634 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Alexandr Ilin65ec9582017-10-02 14:50:313635 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3636 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]a9fc8fc2011-05-10 02:41:073637 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103638 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073639 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283640 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073641
3642 // Make the backup job be a pending job, so it completes normally.
3643 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3644 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523645 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153646 EXPECT_EQ(ERR_IO_PENDING,
3647 handle.Init("a", params_, DEFAULT_PRIORITY,
3648 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203649 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413650 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073651 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103652 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073653 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3654 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013655 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073656
3657 // The hung connect job should still be there, but everything else should be
3658 // complete.
3659 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103660 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073661 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3662 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3663}
3664
[email protected]0dc88b32014-03-26 20:12:283665// Tests that a preconnect that starts out with unread data can still be used.
3666// http://crbug.com/334467
3667TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3668 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3669 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3670
Alexandr Ilin65ec9582017-10-02 14:50:313671 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3672 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]0dc88b32014-03-26 20:12:283673
3674 ASSERT_TRUE(pool_->HasGroup("a"));
3675 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3676 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3677 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3678
3679 // Fail future jobs to be sure that handle receives the preconnected socket
3680 // rather than closing it and making a new one.
3681 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3682 ClientSocketHandle handle;
3683 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203684 EXPECT_EQ(OK,
3685 handle.Init("a", params_, DEFAULT_PRIORITY,
3686 ClientSocketPool::RespectLimits::ENABLED,
3687 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283688
3689 ASSERT_TRUE(pool_->HasGroup("a"));
3690 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3691 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3692 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3693
3694 // Drain the pending read.
3695 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3696
3697 TestLoadTimingInfoConnectedReused(handle);
3698 handle.Reset();
3699
3700 // The socket should be usable now that it's idle again.
3701 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3702}
3703
Alexandr Ilin65ec9582017-10-02 14:50:313704// Tests that a socket pool correctly sets a motivation for a preconnected
3705// socket.
3706TEST_F(ClientSocketPoolBaseTest, PreconnectSetsMotivation) {
3707 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3708 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3709
3710 for (auto motivation : {HttpRequestInfo::NORMAL_MOTIVATION,
3711 HttpRequestInfo::PRECONNECT_MOTIVATED,
3712 HttpRequestInfo::OMNIBOX_MOTIVATED}) {
3713 SCOPED_TRACE(::testing::Message() << "motivation: " << motivation);
3714 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(), motivation);
3715
3716 ClientSocketHandle handle;
3717 TestCompletionCallback callback;
3718 EXPECT_EQ(
3719 ERR_IO_PENDING,
3720 handle.Init("a", params_, DEFAULT_PRIORITY,
3721 ClientSocketPool::RespectLimits::ENABLED,
3722 callback.callback(), pool_.get(), NetLogWithSource()));
3723
3724 EXPECT_THAT(callback.WaitForResult(), IsOk());
3725 EXPECT_TRUE(handle.is_initialized());
3726 ASSERT_TRUE(handle.socket());
3727 EXPECT_EQ(motivation,
3728 static_cast<MockClientSocket*>(handle.socket())->motivation());
3729 handle.socket()->Disconnect();
3730 handle.Reset();
3731 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3732 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3733 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3734 }
3735}
3736
3737// Tests that a socket pool doesn't change motivation on existing sockets.
3738TEST_F(ClientSocketPoolBaseTest, PreconnectPreservesExistingMotivation) {
3739 CreatePool(3, 3);
3740 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3741
3742 // We should get one socket of each motivation.
3743 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3744 HttpRequestInfo::NORMAL_MOTIVATION);
3745 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3746 HttpRequestInfo::PRECONNECT_MOTIVATED);
3747 pool_->RequestSockets("a", &params_, 3, NetLogWithSource(),
3748 HttpRequestInfo::OMNIBOX_MOTIVATED);
3749
3750 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3751 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
3752 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3753
3754 std::vector<ClientSocketHandle> handles(3);
3755 std::vector<TestCompletionCallback> callbacks(3);
3756
3757 for (size_t i = 0; i < 3; ++i) {
3758 EXPECT_EQ(ERR_IO_PENDING,
3759 handles[i].Init("a", params_, DEFAULT_PRIORITY,
3760 ClientSocketPool::RespectLimits::ENABLED,
3761 callbacks[i].callback(), pool_.get(),
3762 NetLogWithSource()));
3763 }
3764
3765 for (size_t i = 0; i < 3; ++i) {
3766 EXPECT_THAT(callbacks[i].WaitForResult(), IsOk());
3767 EXPECT_TRUE(handles[i].is_initialized());
3768 EXPECT_TRUE(handles[i].socket());
3769 }
3770
3771 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3772 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3773 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3774 EXPECT_EQ(3, pool_->NumActiveSocketsInGroup("a"));
3775
3776 EXPECT_EQ(HttpRequestInfo::NORMAL_MOTIVATION,
3777 static_cast<MockClientSocket*>(handles[0].socket())->motivation());
3778 EXPECT_EQ(HttpRequestInfo::PRECONNECT_MOTIVATED,
3779 static_cast<MockClientSocket*>(handles[1].socket())->motivation());
3780 EXPECT_EQ(HttpRequestInfo::OMNIBOX_MOTIVATED,
3781 static_cast<MockClientSocket*>(handles[2].socket())->motivation());
3782}
3783
[email protected]043b68c82013-08-22 23:41:523784class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203785 public:
3786 MockLayeredPool(TestClientSocketPool* pool,
3787 const std::string& group_name)
3788 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203789 group_name_(group_name),
3790 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523791 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203792 }
3793
3794 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523795 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203796 }
3797
3798 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153799 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073800 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:153801 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203802 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203803 }
3804
3805 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153806 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073807 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:153808 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203809 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203810 }
3811
3812 bool ReleaseOneConnection() {
3813 if (!handle_.is_initialized() || !can_release_connection_) {
3814 return false;
3815 }
3816 handle_.socket()->Disconnect();
3817 handle_.Reset();
3818 return true;
3819 }
3820
3821 void set_can_release_connection(bool can_release_connection) {
3822 can_release_connection_ = can_release_connection;
3823 }
3824
3825 MOCK_METHOD0(CloseOneIdleConnection, bool());
3826
3827 private:
3828 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203829 ClientSocketHandle handle_;
3830 TestCompletionCallback callback_;
3831 const std::string group_name_;
3832 bool can_release_connection_;
3833};
3834
3835TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3836 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3837 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3838
3839 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013840 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203841 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3842 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523843 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203844}
3845
3846TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
[email protected]58e562f2013-04-22 17:32:203847 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3848 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3849
3850 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013851 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203852 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3853 .WillOnce(Invoke(&mock_layered_pool,
3854 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523855 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203856}
3857
3858// Tests the basic case of closing an idle socket in a higher layered pool when
3859// a new request is issued and the lower layer pool is stalled.
3860TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3861 CreatePool(1, 1);
3862 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3863
3864 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013865 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203866 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3867 .WillOnce(Invoke(&mock_layered_pool,
3868 &MockLayeredPool::ReleaseOneConnection));
3869 ClientSocketHandle handle;
3870 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153871 EXPECT_EQ(ERR_IO_PENDING,
3872 handle.Init("a", params_, DEFAULT_PRIORITY,
3873 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203874 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013875 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203876}
3877
3878// Same as above, but the idle socket is in the same group as the stalled
3879// socket, and closes the only other request in its group when closing requests
3880// in higher layered pools. This generally shouldn't happen, but it may be
3881// possible if a higher level pool issues a request and the request is
3882// subsequently cancelled. Even if it's not possible, best not to crash.
3883TEST_F(ClientSocketPoolBaseTest,
3884 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3885 CreatePool(2, 2);
3886 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3887
3888 // Need a socket in another group for the pool to be stalled (If a group
3889 // has the maximum number of connections already, it's not stalled).
3890 ClientSocketHandle handle1;
3891 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203892 EXPECT_EQ(
3893 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3894 ClientSocketPool::RespectLimits::ENABLED,
3895 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203896
3897 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013898 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203899 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3900 .WillOnce(Invoke(&mock_layered_pool,
3901 &MockLayeredPool::ReleaseOneConnection));
3902 ClientSocketHandle handle;
3903 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153904 EXPECT_EQ(ERR_IO_PENDING,
3905 handle.Init("group2", params_, DEFAULT_PRIORITY,
3906 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203907 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013908 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203909}
3910
3911// Tests the case when an idle socket can be closed when a new request is
3912// issued, and the new request belongs to a group that was previously stalled.
3913TEST_F(ClientSocketPoolBaseTest,
3914 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3915 CreatePool(2, 2);
3916 std::list<TestConnectJob::JobType> job_types;
3917 job_types.push_back(TestConnectJob::kMockJob);
3918 job_types.push_back(TestConnectJob::kMockJob);
3919 job_types.push_back(TestConnectJob::kMockJob);
3920 job_types.push_back(TestConnectJob::kMockJob);
3921 connect_job_factory_->set_job_types(&job_types);
3922
3923 ClientSocketHandle handle1;
3924 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203925 EXPECT_EQ(
3926 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3927 ClientSocketPool::RespectLimits::ENABLED,
3928 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203929
3930 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013931 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203932 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3933 .WillRepeatedly(Invoke(&mock_layered_pool,
3934 &MockLayeredPool::ReleaseOneConnection));
3935 mock_layered_pool.set_can_release_connection(false);
3936
3937 // The third request is made when the socket pool is in a stalled state.
3938 ClientSocketHandle handle3;
3939 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203940 EXPECT_EQ(
3941 ERR_IO_PENDING,
3942 handle3.Init("group3", params_, DEFAULT_PRIORITY,
3943 ClientSocketPool::RespectLimits::ENABLED,
3944 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203945
3946 base::RunLoop().RunUntilIdle();
3947 EXPECT_FALSE(callback3.have_result());
3948
3949 // The fourth request is made when the pool is no longer stalled. The third
3950 // request should be serviced first, since it was issued first and has the
3951 // same priority.
3952 mock_layered_pool.set_can_release_connection(true);
3953 ClientSocketHandle handle4;
3954 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203955 EXPECT_EQ(
3956 ERR_IO_PENDING,
3957 handle4.Init("group3", params_, DEFAULT_PRIORITY,
3958 ClientSocketPool::RespectLimits::ENABLED,
3959 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013960 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203961 EXPECT_FALSE(callback4.have_result());
3962
3963 // Closing a handle should free up another socket slot.
3964 handle1.Reset();
robpercival214763f2016-07-01 23:27:013965 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203966}
3967
3968// Tests the case when an idle socket can be closed when a new request is
3969// issued, and the new request belongs to a group that was previously stalled.
3970//
3971// The two differences from the above test are that the stalled requests are not
3972// in the same group as the layered pool's request, and the the fourth request
3973// has a higher priority than the third one, so gets a socket first.
3974TEST_F(ClientSocketPoolBaseTest,
3975 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3976 CreatePool(2, 2);
3977 std::list<TestConnectJob::JobType> job_types;
3978 job_types.push_back(TestConnectJob::kMockJob);
3979 job_types.push_back(TestConnectJob::kMockJob);
3980 job_types.push_back(TestConnectJob::kMockJob);
3981 job_types.push_back(TestConnectJob::kMockJob);
3982 connect_job_factory_->set_job_types(&job_types);
3983
3984 ClientSocketHandle handle1;
3985 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203986 EXPECT_EQ(
3987 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3988 ClientSocketPool::RespectLimits::ENABLED,
3989 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203990
3991 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013992 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203993 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3994 .WillRepeatedly(Invoke(&mock_layered_pool,
3995 &MockLayeredPool::ReleaseOneConnection));
3996 mock_layered_pool.set_can_release_connection(false);
3997
3998 // The third request is made when the socket pool is in a stalled state.
3999 ClientSocketHandle handle3;
4000 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204001 EXPECT_EQ(
4002 ERR_IO_PENDING,
4003 handle3.Init("group3", params_, MEDIUM,
4004 ClientSocketPool::RespectLimits::ENABLED,
4005 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204006
4007 base::RunLoop().RunUntilIdle();
4008 EXPECT_FALSE(callback3.have_result());
4009
4010 // The fourth request is made when the pool is no longer stalled. This
4011 // request has a higher priority than the third request, so is serviced first.
4012 mock_layered_pool.set_can_release_connection(true);
4013 ClientSocketHandle handle4;
4014 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204015 EXPECT_EQ(
4016 ERR_IO_PENDING,
4017 handle4.Init("group3", params_, HIGHEST,
4018 ClientSocketPool::RespectLimits::ENABLED,
4019 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014020 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204021 EXPECT_FALSE(callback3.have_result());
4022
4023 // Closing a handle should free up another socket slot.
4024 handle1.Reset();
robpercival214763f2016-07-01 23:27:014025 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204026}
4027
4028TEST_F(ClientSocketPoolBaseTest,
4029 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4030 CreatePool(1, 1);
4031 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4032
4033 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014034 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204035 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4036 .WillRepeatedly(Invoke(&mock_layered_pool1,
4037 &MockLayeredPool::ReleaseOneConnection));
4038 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014039 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4040 IsOk());
[email protected]58e562f2013-04-22 17:32:204041 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4042 .WillRepeatedly(Invoke(&mock_layered_pool2,
4043 &MockLayeredPool::ReleaseOneConnection));
4044 ClientSocketHandle handle;
4045 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154046 EXPECT_EQ(ERR_IO_PENDING,
4047 handle.Init("a", params_, DEFAULT_PRIORITY,
4048 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204049 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014050 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204051}
4052
[email protected]b021ece62013-06-11 11:06:334053// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154054// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4055// socket instead of a request with the same priority that was issued earlier,
4056// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334057TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334058 CreatePool(1, 1);
4059
4060 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154061 EXPECT_EQ(
4062 OK, StartRequestWithIgnoreLimits(
4063 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334064 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4065
4066 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4067
mmenked3641e12016-01-28 16:06:154068 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4069 "a", MAXIMUM_PRIORITY,
4070 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334071 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4072
mmenked3641e12016-01-28 16:06:154073 // Issue a request that ignores the limits, so a new ConnectJob is
4074 // created.
4075 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4076 "a", MAXIMUM_PRIORITY,
4077 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334078 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4079
robpercival214763f2016-07-01 23:27:014080 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334081 EXPECT_FALSE(request(1)->have_result());
4082}
4083
[email protected]c55fabd2013-11-04 23:26:564084// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154085// issued for a request with RespectLimits::DISABLED is not cancelled when a
4086// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564087TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564088 CreatePool(1, 1);
4089
4090 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154091 EXPECT_EQ(
4092 OK, StartRequestWithIgnoreLimits(
4093 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564094 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4095
4096 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4097
mmenked3641e12016-01-28 16:06:154098 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4099 "a", MAXIMUM_PRIORITY,
4100 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564101 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4102
mmenked3641e12016-01-28 16:06:154103 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4104 // created.
4105 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4106 "a", MAXIMUM_PRIORITY,
4107 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334108 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4109
mmenked3641e12016-01-28 16:06:154110 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334111 // should not be cancelled.
4112 request(1)->handle()->Reset();
4113 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4114
robpercival214763f2016-07-01 23:27:014115 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334116 EXPECT_FALSE(request(1)->have_result());
4117}
4118
[email protected]f6d1d6eb2009-06-24 20:16:094119} // namespace
4120
4121} // namespace net