blob: 61551d80b0691f75f9fa03829ad590ffb05ff256 [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 }
Paul Jensen0f49dec2017-12-12 23:39:58207 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45208
[email protected]f6d1d6eb2009-06-24 20:16:09209 private:
210 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28211 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20212 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01213 bool was_used_to_convey_data_;
Alexandr Ilin65ec9582017-10-02 14:50:31214 HttpRequestInfo::RequestMotivation motivation_;
[email protected]f6d1d6eb2009-06-24 20:16:09215
[email protected]ab838892009-06-30 18:49:05216 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09217};
218
[email protected]5fc08e32009-07-15 17:09:57219class TestConnectJob;
220
[email protected]f6d1d6eb2009-06-24 20:16:09221class MockClientSocketFactory : public ClientSocketFactory {
222 public:
[email protected]ab838892009-06-30 18:49:05223 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09224
danakj655b66c2016-04-16 00:51:38225 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04226 DatagramSocket::BindType bind_type,
227 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41228 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19229 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41230 NOTREACHED();
danakj655b66c2016-04-16 00:51:38231 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41232 }
233
danakj655b66c2016-04-16 00:51:38234 std::unique_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07235 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38236 std::unique_ptr<
237 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07238 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19239 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09240 allocation_count_++;
danakj655b66c2016-04-16 00:51:38241 return std::unique_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09242 }
243
danakj655b66c2016-04-16 00:51:38244 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
245 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27246 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21247 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13248 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09249 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38250 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09251 }
252
dchengb03027d2014-10-21 12:00:20253 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59254
[email protected]5fc08e32009-07-15 17:09:57255 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55256
[email protected]5fc08e32009-07-15 17:09:57257 void SignalJobs();
258
[email protected]03b7c8c2013-07-20 04:38:55259 void SignalJob(size_t job);
260
261 void SetJobLoadState(size_t job, LoadState load_state);
262
[email protected]f6d1d6eb2009-06-24 20:16:09263 int allocation_count() const { return allocation_count_; }
264
[email protected]f6d1d6eb2009-06-24 20:16:09265 private:
266 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57267 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09268};
269
[email protected]ab838892009-06-30 18:49:05270class TestConnectJob : public ConnectJob {
271 public:
272 enum JobType {
273 kMockJob,
274 kMockFailingJob,
275 kMockPendingJob,
276 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57277 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13278 kMockRecoverableJob,
279 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18280 kMockAdditionalErrorStateJob,
281 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28282 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05283 };
284
[email protected]994d4932010-07-12 17:55:13285 // The kMockPendingJob uses a slight delay before allowing the connect
286 // to complete.
287 static const int kPendingConnectDelay = 2;
288
[email protected]ab838892009-06-30 18:49:05289 TestConnectJob(JobType job_type,
290 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49291 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34292 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05293 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30294 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17295 NetLog* net_log)
tfarina428341112016-09-22 13:38:20296 : ConnectJob(
297 group_name,
298 timeout_duration,
299 request.priority(),
300 request.respect_limits(),
301 delegate,
davidbenb7048f092016-11-30 21:20:26302 NetLogWithSource::Make(net_log,
303 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58304 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05305 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18306 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39307 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15308 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05309
[email protected]974ebd62009-08-03 23:14:34310 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13311 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34312 }
313
[email protected]03b7c8c2013-07-20 04:38:55314 void set_load_state(LoadState load_state) { load_state_ = load_state; }
315
316 // From ConnectJob:
317
dchengb03027d2014-10-21 12:00:20318 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21319
dchengb03027d2014-10-21 12:00:20320 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18321 if (store_additional_error_state_) {
322 // Set all of the additional error state fields in some way.
323 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43324 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45325 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43326 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18327 }
328 }
329
[email protected]974ebd62009-08-03 23:14:34330 private:
[email protected]03b7c8c2013-07-20 04:38:55331 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05332
dchengb03027d2014-10-21 12:00:20333 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05334 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21335 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19336 NetLogSource());
danakj655b66c2016-04-16 00:51:38337 SetSocket(std::unique_ptr<StreamSocket>(
338 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05339 switch (job_type_) {
340 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13341 return DoConnect(true /* successful */, false /* sync */,
342 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05343 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13344 return DoConnect(false /* error */, false /* sync */,
345 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05346 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57347 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47348
349 // Depending on execution timings, posting a delayed task can result
350 // in the task getting executed the at the earliest possible
351 // opportunity or only after returning once from the message loop and
352 // then a second call into the message loop. In order to make behavior
353 // more deterministic, we change the default delay to 2ms. This should
354 // always require us to wait for the second call into the message loop.
355 //
356 // N.B. The correct fix for this and similar timing problems is to
357 // abstract time for the purpose of unittests. Unfortunately, we have
358 // a lot of third-party components that directly call the various
359 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45360 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05361 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13362 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45363 weak_factory_.GetWeakPtr(), true /* successful */,
364 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53365 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05366 return ERR_IO_PENDING;
367 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57368 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45369 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05370 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13371 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45372 weak_factory_.GetWeakPtr(), false /* error */,
373 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53374 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05375 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57376 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55377 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57378 client_socket_factory_->WaitForSignal(this);
379 waiting_success_ = true;
380 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13381 case kMockRecoverableJob:
382 return DoConnect(false /* error */, false /* sync */,
383 true /* recoverable */);
384 case kMockPendingRecoverableJob:
385 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45386 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13387 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13388 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45389 weak_factory_.GetWeakPtr(), false /* error */,
390 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53391 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13392 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18393 case kMockAdditionalErrorStateJob:
394 store_additional_error_state_ = true;
395 return DoConnect(false /* error */, false /* sync */,
396 false /* recoverable */);
397 case kMockPendingAdditionalErrorStateJob:
398 set_load_state(LOAD_STATE_CONNECTING);
399 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45400 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18401 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13402 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45403 weak_factory_.GetWeakPtr(), false /* error */,
404 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53405 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18406 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28407 case kMockUnreadDataJob: {
408 int ret = DoConnect(true /* successful */, false /* sync */,
409 false /* recoverable */);
410 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
411 return ret;
412 }
[email protected]ab838892009-06-30 18:49:05413 default:
414 NOTREACHED();
danakj655b66c2016-04-16 00:51:38415 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05416 return ERR_FAILED;
417 }
418 }
419
[email protected]e772db3f2010-07-12 18:11:13420 int DoConnect(bool succeed, bool was_async, bool recoverable) {
421 int result = OK;
[email protected]ab838892009-06-30 18:49:05422 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55423 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13424 } else if (recoverable) {
425 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40426 } else {
[email protected]e772db3f2010-07-12 18:11:13427 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38428 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05429 }
[email protected]2ab05b52009-07-01 23:57:58430
431 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30432 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05433 return result;
434 }
435
[email protected]5fc08e32009-07-15 17:09:57436 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05437 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57438 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21439 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18440 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05441
[email protected]d5492c52013-11-10 20:44:39442 base::WeakPtrFactory<TestConnectJob> weak_factory_;
443
[email protected]ab838892009-06-30 18:49:05444 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
445};
446
[email protected]d80a4322009-08-14 07:07:49447class TestConnectJobFactory
448 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05449 public:
[email protected]034df0f32013-01-07 23:17:48450 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
451 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05452 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48453 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48454 client_socket_factory_(client_socket_factory),
455 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33456 }
[email protected]ab838892009-06-30 18:49:05457
Chris Watkins7a41d3552017-12-01 02:13:27458 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05459
460 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
461
[email protected]51fdc7c2012-04-10 19:19:48462 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
463 job_types_ = job_types;
464 CHECK(!job_types_->empty());
465 }
466
[email protected]974ebd62009-08-03 23:14:34467 void set_timeout_duration(base::TimeDelta timeout_duration) {
468 timeout_duration_ = timeout_duration;
469 }
470
[email protected]3f55aa12011-12-07 02:03:33471 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55472
danakj655b66c2016-04-16 00:51:38473 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05474 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49475 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13476 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48477 EXPECT_TRUE(!job_types_ || !job_types_->empty());
478 TestConnectJob::JobType job_type = job_type_;
479 if (job_types_ && !job_types_->empty()) {
480 job_type = job_types_->front();
481 job_types_->pop_front();
482 }
danakj655b66c2016-04-16 00:51:38483 return std::unique_ptr<ConnectJob>(
484 new TestConnectJob(job_type, group_name, request, timeout_duration_,
485 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05486 }
487
dchengb03027d2014-10-21 12:00:20488 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26489 return timeout_duration_;
490 }
491
[email protected]ab838892009-06-30 18:49:05492 private:
493 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48494 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34495 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57496 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48497 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05498
499 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
500};
501
502class TestClientSocketPool : public ClientSocketPool {
503 public:
[email protected]12322e7e2013-08-15 17:49:26504 typedef TestSocketParams SocketParams;
505
[email protected]ab838892009-06-30 18:49:05506 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53507 int max_sockets,
[email protected]ab838892009-06-30 18:49:05508 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16509 base::TimeDelta unused_idle_socket_timeout,
510 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49511 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41512 : base_(NULL,
513 max_sockets,
514 max_sockets_per_group,
515 unused_idle_socket_timeout,
516 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38517 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05518
Chris Watkins7a41d3552017-12-01 02:13:27519 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13520
dchengb03027d2014-10-21 12:00:20521 int RequestSocket(const std::string& group_name,
522 const void* params,
ttuttle859dc7a2015-04-23 19:42:29523 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15524 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20525 ClientSocketHandle* handle,
526 const CompletionCallback& callback,
tfarina428341112016-09-22 13:38:20527 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21528 const scoped_refptr<TestSocketParams>* casted_socket_params =
529 static_cast<const scoped_refptr<TestSocketParams>*>(params);
530 return base_.RequestSocket(group_name, *casted_socket_params, priority,
mmenked3641e12016-01-28 16:06:15531 respect_limits, handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05532 }
533
dchengb03027d2014-10-21 12:00:20534 void RequestSockets(const std::string& group_name,
535 const void* params,
536 int num_sockets,
Alexandr Ilin65ec9582017-10-02 14:50:31537 const NetLogWithSource& net_log,
538 HttpRequestInfo::RequestMotivation motivation) override {
[email protected]2c2bef152010-10-13 00:55:03539 const scoped_refptr<TestSocketParams>* casted_params =
540 static_cast<const scoped_refptr<TestSocketParams>*>(params);
541
Alexandr Ilin65ec9582017-10-02 14:50:31542 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log,
543 motivation);
[email protected]2c2bef152010-10-13 00:55:03544 }
545
rdsmith29dbad12017-02-17 02:22:18546 void SetPriority(const std::string& group_name,
547 ClientSocketHandle* handle,
548 RequestPriority priority) override {
549 base_.SetPriority(group_name, handle, priority);
550 }
551
dchengb03027d2014-10-21 12:00:20552 void CancelRequest(const std::string& group_name,
553 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49554 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05555 }
556
dchengb03027d2014-10-21 12:00:20557 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38558 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20559 int id) override {
dchengc7eeda422015-12-26 03:56:48560 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24561 }
562
dchengb03027d2014-10-21 12:00:20563 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05564
dchengb03027d2014-10-21 12:00:20565 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48566
dchengb03027d2014-10-21 12:00:20567 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05568
xunjieli92feb332017-03-03 17:19:23569 void CloseIdleSocketsInGroup(const std::string& group_name) override {
570 base_.CloseIdleSocketsInGroup(group_name);
571 }
572
dchengb03027d2014-10-21 12:00:20573 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05574
dchengb03027d2014-10-21 12:00:20575 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49576 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05577 }
578
dchengb03027d2014-10-21 12:00:20579 LoadState GetLoadState(const std::string& group_name,
580 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49581 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05582 }
583
dchengb03027d2014-10-21 12:00:20584 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52585 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48586 }
587
dchengb03027d2014-10-21 12:00:20588 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52589 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48590 }
591
danakj655b66c2016-04-16 00:51:38592 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59593 const std::string& name,
594 const std::string& type,
mostynbba063d6032014-10-09 11:01:13595 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27596 return base_.GetInfoAsValue(name, type);
597 }
598
dchengb03027d2014-10-21 12:00:20599 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26600 return base_.ConnectionTimeout();
601 }
602
[email protected]d80a4322009-08-14 07:07:49603 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20604
[email protected]8159a1c2012-06-07 00:00:10605 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
606 return base_.NumUnassignedConnectJobsInGroup(group_name);
607 }
608
[email protected]974ebd62009-08-03 23:14:34609 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49610 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34611 }
612
[email protected]2c2bef152010-10-13 00:55:03613 int NumActiveSocketsInGroup(const std::string& group_name) const {
614 return base_.NumActiveSocketsInGroup(group_name);
615 }
616
[email protected]2abfe90a2010-08-25 17:49:51617 bool HasGroup(const std::string& group_name) const {
618 return base_.HasGroup(group_name);
619 }
620
[email protected]9bf28db2009-08-29 01:35:16621 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
622
[email protected]06d94042010-08-25 01:45:22623 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54624
[email protected]043b68c82013-08-22 23:41:52625 bool CloseOneIdleConnectionInHigherLayeredPool() {
626 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48627 }
628
[email protected]ab838892009-06-30 18:49:05629 private:
[email protected]d80a4322009-08-14 07:07:49630 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05631
632 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
633};
634
[email protected]a937a06d2009-08-19 21:19:24635} // namespace
636
[email protected]a937a06d2009-08-19 21:19:24637namespace {
638
[email protected]5fc08e32009-07-15 17:09:57639void MockClientSocketFactory::SignalJobs() {
640 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
641 it != waiting_jobs_.end(); ++it) {
642 (*it)->Signal();
643 }
644 waiting_jobs_.clear();
645}
646
[email protected]03b7c8c2013-07-20 04:38:55647void MockClientSocketFactory::SignalJob(size_t job) {
648 ASSERT_LT(job, waiting_jobs_.size());
649 waiting_jobs_[job]->Signal();
650 waiting_jobs_.erase(waiting_jobs_.begin() + job);
651}
652
653void MockClientSocketFactory::SetJobLoadState(size_t job,
654 LoadState load_state) {
655 ASSERT_LT(job, waiting_jobs_.size());
656 waiting_jobs_[job]->set_load_state(load_state);
657}
658
[email protected]974ebd62009-08-03 23:14:34659class TestConnectJobDelegate : public ConnectJob::Delegate {
660 public:
661 TestConnectJobDelegate()
662 : have_result_(false), waiting_for_result_(false), result_(OK) {}
Chris Watkins7a41d3552017-12-01 02:13:27663 ~TestConnectJobDelegate() override = default;
[email protected]974ebd62009-08-03 23:14:34664
dchengb03027d2014-10-21 12:00:20665 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34666 result_ = result;
danakj655b66c2016-04-16 00:51:38667 std::unique_ptr<ConnectJob> owned_job(job);
668 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07669 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44670 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34671 have_result_ = true;
672 if (waiting_for_result_)
Gabriel Charette53a9ef812017-07-26 12:36:23673 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]974ebd62009-08-03 23:14:34674 }
675
676 int WaitForResult() {
677 DCHECK(!waiting_for_result_);
678 while (!have_result_) {
679 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28680 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34681 waiting_for_result_ = false;
682 }
683 have_result_ = false; // auto-reset for next callback
684 return result_;
685 }
686
687 private:
688 bool have_result_;
689 bool waiting_for_result_;
690 int result_;
691};
692
[email protected]2431756e2010-09-29 20:26:13693class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09694 protected:
mmenked3641e12016-01-28 16:06:15695 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54696 connect_backup_jobs_enabled_ =
697 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
698 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
699 }
[email protected]2431756e2010-09-29 20:26:13700
dcheng67be2b1f2014-10-27 21:47:29701 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54702 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
703 connect_backup_jobs_enabled_);
704 }
[email protected]c9d6a1d2009-07-14 16:15:20705
[email protected]211d21722009-07-22 15:48:53706 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16707 CreatePoolWithIdleTimeouts(
708 max_sockets,
709 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30710 ClientSocketPool::unused_idle_socket_timeout(),
711 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16712 }
713
714 void CreatePoolWithIdleTimeouts(
715 int max_sockets, int max_sockets_per_group,
716 base::TimeDelta unused_idle_socket_timeout,
717 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20718 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48719 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
720 &net_log_);
[email protected]2431756e2010-09-29 20:26:13721 pool_.reset(new TestClientSocketPool(max_sockets,
722 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13723 unused_idle_socket_timeout,
724 used_idle_socket_timeout,
725 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20726 }
[email protected]f6d1d6eb2009-06-24 20:16:09727
mmenked3641e12016-01-28 16:06:15728 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33729 const std::string& group_name,
730 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15731 ClientSocketPool::RespectLimits respect_limits) {
732 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
733 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33734 }
735
736 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15737 return StartRequestWithIgnoreLimits(
738 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09739 }
740
[email protected]2431756e2010-09-29 20:26:13741 int GetOrderOfRequest(size_t index) const {
742 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09743 }
744
[email protected]2431756e2010-09-29 20:26:13745 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
746 return test_base_.ReleaseOneConnection(keep_alive);
747 }
748
749 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
750 test_base_.ReleaseAllConnections(keep_alive);
751 }
752
753 TestSocketRequest* request(int i) { return test_base_.request(i); }
754 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38755 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42756 return test_base_.requests();
757 }
rdsmith29dbad12017-02-17 02:22:18758 // Only counts the requests that get sockets asynchronously;
759 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13760 size_t completion_count() const { return test_base_.completion_count(); }
761
vishal.b62985ca92015-04-17 08:45:51762 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54763 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09764 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04765 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21766 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38767 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13768 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09769};
770
[email protected]974ebd62009-08-03 23:14:34771// Even though a timeout is specified, it doesn't time out on a synchronous
772// completion.
773TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
774 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06775 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49776 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07777 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15778 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20779 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
780 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38781 std::unique_ptr<TestConnectJob> job(
782 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
783 base::TimeDelta::FromMicroseconds(1), &delegate,
784 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01785 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34786}
787
788TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
789 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06790 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51791 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53792
[email protected]d80a4322009-08-14 07:07:49793 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07794 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15795 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20796 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
797 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34798 // Deleted by TestConnectJobDelegate.
799 TestConnectJob* job =
800 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12801 "a",
[email protected]974ebd62009-08-03 23:14:34802 request,
803 base::TimeDelta::FromMicroseconds(1),
804 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30805 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17806 &log);
robpercival214763f2016-07-01 23:27:01807 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00808 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01809 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30810
mmenke43758e62015-05-04 21:09:46811 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40812 log.GetEntries(&entries);
813
814 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00815 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
816 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46817 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00818 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
819 EXPECT_TRUE(LogContainsEvent(entries, 2,
820 NetLogEventType::CONNECT_JOB_SET_SOCKET,
821 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46822 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00823 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
824 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46825 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00826 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
827 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
828 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34829}
830
[email protected]5fc08e32009-07-15 17:09:57831TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53832 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20833
[email protected]6ecf2b92011-12-15 01:14:52834 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06835 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51836 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48837 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53838
mmenked3641e12016-01-28 16:06:15839 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
840 ClientSocketPool::RespectLimits::ENABLED,
841 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09842 EXPECT_TRUE(handle.is_initialized());
843 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48844 TestLoadTimingInfoConnectedNotReused(handle);
845
[email protected]f6d1d6eb2009-06-24 20:16:09846 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48847 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30848
mmenke43758e62015-05-04 21:09:46849 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40850 log.GetEntries(&entries);
851
852 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00853 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53854 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00855 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
856 NetLogEventPhase::NONE));
857 EXPECT_TRUE(LogContainsEvent(entries, 2,
858 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
859 NetLogEventPhase::NONE));
860 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09861}
862
[email protected]ab838892009-06-30 18:49:05863TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53864 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20865
[email protected]ab838892009-06-30 18:49:05866 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51867 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53868
[email protected]2431756e2010-09-29 20:26:13869 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52870 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18871 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13872 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43873 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45874 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13875 handle.set_ssl_error_response_info(info);
876 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:15877 handle.Init("a", params_, DEFAULT_PRIORITY,
878 ClientSocketPool::RespectLimits::ENABLED,
879 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13880 EXPECT_FALSE(handle.socket());
881 EXPECT_FALSE(handle.is_ssl_error());
882 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48883 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30884
mmenke43758e62015-05-04 21:09:46885 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40886 log.GetEntries(&entries);
887
888 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00889 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17890 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00891 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
892 NetLogEventPhase::NONE));
893 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09894}
895
[email protected]211d21722009-07-22 15:48:53896TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
[email protected]211d21722009-07-22 15:48:53897 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
898
[email protected]9e743cd2010-03-16 07:03:53899 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30900
robpercival214763f2016-07-01 23:27:01901 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
902 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
903 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
904 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53905
[email protected]2431756e2010-09-29 20:26:13906 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53907 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13908 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53909
robpercival214763f2016-07-01 23:27:01910 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
911 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
912 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53913
[email protected]2431756e2010-09-29 20:26:13914 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53915
[email protected]2431756e2010-09-29 20:26:13916 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53917 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13918 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53919
920 EXPECT_EQ(1, GetOrderOfRequest(1));
921 EXPECT_EQ(2, GetOrderOfRequest(2));
922 EXPECT_EQ(3, GetOrderOfRequest(3));
923 EXPECT_EQ(4, GetOrderOfRequest(4));
924 EXPECT_EQ(5, GetOrderOfRequest(5));
925 EXPECT_EQ(6, GetOrderOfRequest(6));
926 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17927
928 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13929 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53930}
931
932TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
[email protected]211d21722009-07-22 15:48:53933 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
934
[email protected]9e743cd2010-03-16 07:03:53935 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30936
[email protected]211d21722009-07-22 15:48:53937 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01938 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
939 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
940 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
941 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53942
[email protected]2431756e2010-09-29 20:26:13943 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53944 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13945 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53946
947 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01948 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53949
[email protected]2431756e2010-09-29 20:26:13950 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53951
[email protected]2431756e2010-09-29 20:26:13952 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53953 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13954 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53955
956 EXPECT_EQ(1, GetOrderOfRequest(1));
957 EXPECT_EQ(2, GetOrderOfRequest(2));
958 EXPECT_EQ(3, GetOrderOfRequest(3));
959 EXPECT_EQ(4, GetOrderOfRequest(4));
960 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17961
962 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13963 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53964}
965
966TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
[email protected]211d21722009-07-22 15:48:53967 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
968
robpercival214763f2016-07-01 23:27:01969 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
970 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
971 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
972 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53973
[email protected]2431756e2010-09-29 20:26:13974 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53975 client_socket_factory_.allocation_count());
976
robpercival214763f2016-07-01 23:27:01977 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
978 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
979 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53980
[email protected]2431756e2010-09-29 20:26:13981 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53982
[email protected]2431756e2010-09-29 20:26:13983 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53984
985 // First 4 requests don't have to wait, and finish in order.
986 EXPECT_EQ(1, GetOrderOfRequest(1));
987 EXPECT_EQ(2, GetOrderOfRequest(2));
988 EXPECT_EQ(3, GetOrderOfRequest(3));
989 EXPECT_EQ(4, GetOrderOfRequest(4));
990
[email protected]ac790b42009-12-02 04:31:31991 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
992 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53993 EXPECT_EQ(7, GetOrderOfRequest(5));
994 EXPECT_EQ(6, GetOrderOfRequest(6));
995 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17996
997 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13998 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53999}
1000
rdsmith29dbad12017-02-17 02:22:181001// Test reprioritizing a request before completion doesn't interfere with
1002// its completion.
1003TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1004 CreatePool(kDefaultMaxSockets, 1);
1005
1006 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1007 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1008 EXPECT_TRUE(request(0)->handle()->socket());
1009 EXPECT_FALSE(request(1)->handle()->socket());
1010
1011 request(1)->handle()->SetPriority(MEDIUM);
1012
1013 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1014
1015 EXPECT_TRUE(request(1)->handle()->socket());
1016}
1017
1018// Reprioritize a request up past another one and make sure that changes the
1019// completion order.
1020TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1021 CreatePool(kDefaultMaxSockets, 1);
1022
1023 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1024 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1025 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1026 EXPECT_TRUE(request(0)->handle()->socket());
1027 EXPECT_FALSE(request(1)->handle()->socket());
1028 EXPECT_FALSE(request(2)->handle()->socket());
1029
1030 request(2)->handle()->SetPriority(HIGHEST);
1031
1032 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1033
1034 EXPECT_EQ(1, GetOrderOfRequest(1));
1035 EXPECT_EQ(3, GetOrderOfRequest(2));
1036 EXPECT_EQ(2, GetOrderOfRequest(3));
1037}
1038
1039// Reprioritize a request without changing relative priorities and check
1040// that the order doesn't change.
1041TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1042 CreatePool(kDefaultMaxSockets, 1);
1043
1044 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1045 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1046 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1047 EXPECT_TRUE(request(0)->handle()->socket());
1048 EXPECT_FALSE(request(1)->handle()->socket());
1049 EXPECT_FALSE(request(2)->handle()->socket());
1050
1051 request(2)->handle()->SetPriority(MEDIUM);
1052
1053 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1054
1055 EXPECT_EQ(1, GetOrderOfRequest(1));
1056 EXPECT_EQ(2, GetOrderOfRequest(2));
1057 EXPECT_EQ(3, GetOrderOfRequest(3));
1058}
1059
1060// Reprioritize a request past down another one and make sure that changes the
1061// completion order.
1062TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1063 CreatePool(kDefaultMaxSockets, 1);
1064
1065 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1066 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1067 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1068 EXPECT_TRUE(request(0)->handle()->socket());
1069 EXPECT_FALSE(request(1)->handle()->socket());
1070 EXPECT_FALSE(request(2)->handle()->socket());
1071
1072 request(1)->handle()->SetPriority(LOW);
1073
1074 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1075
1076 EXPECT_EQ(1, GetOrderOfRequest(1));
1077 EXPECT_EQ(3, GetOrderOfRequest(2));
1078 EXPECT_EQ(2, GetOrderOfRequest(3));
1079}
1080
1081// Reprioritize a request to the same level as another and confirm it is
1082// put after the old request.
1083TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1084 CreatePool(kDefaultMaxSockets, 1);
1085
1086 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1087 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1088 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1089 EXPECT_TRUE(request(0)->handle()->socket());
1090 EXPECT_FALSE(request(1)->handle()->socket());
1091 EXPECT_FALSE(request(2)->handle()->socket());
1092
1093 request(1)->handle()->SetPriority(MEDIUM);
1094
1095 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1096
1097 EXPECT_EQ(1, GetOrderOfRequest(1));
1098 EXPECT_EQ(3, GetOrderOfRequest(2));
1099 EXPECT_EQ(2, GetOrderOfRequest(3));
1100}
1101
[email protected]211d21722009-07-22 15:48:531102TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
[email protected]211d21722009-07-22 15:48:531103 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1104
robpercival214763f2016-07-01 23:27:011105 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1106 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1107 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1108 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531109
[email protected]2431756e2010-09-29 20:26:131110 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531111 client_socket_factory_.allocation_count());
1112
robpercival214763f2016-07-01 23:27:011113 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1114 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1115 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531116
[email protected]2431756e2010-09-29 20:26:131117 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531118
[email protected]2431756e2010-09-29 20:26:131119 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531120 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131121 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531122
1123 // First 4 requests don't have to wait, and finish in order.
1124 EXPECT_EQ(1, GetOrderOfRequest(1));
1125 EXPECT_EQ(2, GetOrderOfRequest(2));
1126 EXPECT_EQ(3, GetOrderOfRequest(3));
1127 EXPECT_EQ(4, GetOrderOfRequest(4));
1128
1129 // Request ("b", 7) has the highest priority, but we can't make new socket for
1130 // group "b", because it has reached the per-group limit. Then we make
1131 // socket for ("c", 6), because it has higher priority than ("a", 4),
1132 // and we still can't make a socket for group "b".
1133 EXPECT_EQ(5, GetOrderOfRequest(5));
1134 EXPECT_EQ(6, GetOrderOfRequest(6));
1135 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171136
1137 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131138 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531139}
1140
1141// Make sure that we count connecting sockets against the total limit.
1142TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
[email protected]211d21722009-07-22 15:48:531143 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1144
robpercival214763f2016-07-01 23:27:011145 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1146 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1147 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531148
1149 // Create one asynchronous request.
1150 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011151 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531152
[email protected]6b175382009-10-13 06:47:471153 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1154 // actually become pending until 2ms after they have been created. In order
1155 // to flush all tasks, we need to wait so that we know there are no
1156 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001157 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281158 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471159
[email protected]211d21722009-07-22 15:48:531160 // The next synchronous request should wait for its turn.
1161 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011162 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531163
[email protected]2431756e2010-09-29 20:26:131164 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531165
[email protected]2431756e2010-09-29 20:26:131166 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531167 client_socket_factory_.allocation_count());
1168
1169 EXPECT_EQ(1, GetOrderOfRequest(1));
1170 EXPECT_EQ(2, GetOrderOfRequest(2));
1171 EXPECT_EQ(3, GetOrderOfRequest(3));
1172 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171173 EXPECT_EQ(5, GetOrderOfRequest(5));
1174
1175 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131176 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531177}
1178
[email protected]6427fe22010-04-16 22:27:411179TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
[email protected]6427fe22010-04-16 22:27:411180 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1181 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1182
robpercival214763f2016-07-01 23:27:011183 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1184 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1185 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1186 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411187
1188 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1189
1190 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1191
robpercival214763f2016-07-01 23:27:011192 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1193 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411194
1195 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1196
[email protected]2431756e2010-09-29 20:26:131197 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411198 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131199 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411200 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131201 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1202 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411203 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]6427fe22010-04-16 22:27:411204}
1205
[email protected]d7027bb2010-05-10 18:58:541206TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1207 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1208 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1209
1210 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521211 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131212 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151213 handle.Init("a", params_, DEFAULT_PRIORITY,
1214 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201215 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541216
1217 ClientSocketHandle handles[4];
1218 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521219 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201220 EXPECT_EQ(
1221 ERR_IO_PENDING,
1222 handles[i].Init("b", params_, DEFAULT_PRIORITY,
1223 ClientSocketPool::RespectLimits::ENABLED,
1224 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541225 }
1226
1227 // One will be stalled, cancel all the handles now.
1228 // This should hit the OnAvailableSocketSlot() code where we previously had
1229 // stalled groups, but no longer have any.
1230 for (size_t i = 0; i < arraysize(handles); ++i)
1231 handles[i].Reset();
1232}
1233
[email protected]eb5a99382010-07-11 03:18:261234TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541235 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1236 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1237
[email protected]eb5a99382010-07-11 03:18:261238 {
1239 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521240 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261241 for (int i = 0; i < kDefaultMaxSockets; ++i) {
tfarina428341112016-09-22 13:38:201242 EXPECT_EQ(OK,
1243 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1244 ClientSocketPool::RespectLimits::ENABLED,
1245 callbacks[i].callback(), pool_.get(),
1246 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261247 }
1248
1249 // Force a stalled group.
1250 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521251 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201252 EXPECT_EQ(ERR_IO_PENDING,
1253 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1254 ClientSocketPool::RespectLimits::ENABLED,
1255 callback.callback(), pool_.get(),
1256 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261257
1258 // Cancel the stalled request.
1259 stalled_handle.Reset();
1260
1261 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1262 EXPECT_EQ(0, pool_->IdleSocketCount());
1263
1264 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541265 }
1266
[email protected]43a21b82010-06-10 21:30:541267 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1268 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261269}
[email protected]43a21b82010-06-10 21:30:541270
[email protected]eb5a99382010-07-11 03:18:261271TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1272 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1273 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1274
1275 {
1276 ClientSocketHandle handles[kDefaultMaxSockets];
1277 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521278 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201279 EXPECT_EQ(ERR_IO_PENDING,
1280 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1281 ClientSocketPool::RespectLimits::ENABLED,
1282 callback.callback(), pool_.get(),
1283 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261284 }
1285
1286 // Force a stalled group.
1287 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1288 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521289 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201290 EXPECT_EQ(ERR_IO_PENDING,
1291 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1292 ClientSocketPool::RespectLimits::ENABLED,
1293 callback.callback(), pool_.get(),
1294 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261295
1296 // Since it is stalled, it should have no connect jobs.
1297 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101298 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261299
1300 // Cancel the stalled request.
1301 handles[0].Reset();
1302
[email protected]eb5a99382010-07-11 03:18:261303 // Now we should have a connect job.
1304 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101305 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261306
1307 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011308 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261309
1310 EXPECT_EQ(kDefaultMaxSockets + 1,
1311 client_socket_factory_.allocation_count());
1312 EXPECT_EQ(0, pool_->IdleSocketCount());
1313 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101314 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261315
1316 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541317 }
1318
[email protected]eb5a99382010-07-11 03:18:261319 EXPECT_EQ(1, pool_->IdleSocketCount());
1320}
[email protected]43a21b82010-06-10 21:30:541321
[email protected]eb5a99382010-07-11 03:18:261322TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1323 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1324 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541325
[email protected]eb5a99382010-07-11 03:18:261326 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521327 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261328 {
[email protected]51fdc7c2012-04-10 19:19:481329 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261330 ClientSocketHandle handles[kDefaultMaxSockets];
1331 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521332 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201333 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
1334 params_, DEFAULT_PRIORITY,
1335 ClientSocketPool::RespectLimits::ENABLED,
1336 callback.callback(), pool_.get(),
1337 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261338 }
1339
1340 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1341 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481342 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261343
1344 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201345 EXPECT_EQ(ERR_IO_PENDING,
1346 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1347 ClientSocketPool::RespectLimits::ENABLED,
1348 callback.callback(), pool_.get(),
1349 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481350 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261351
1352 // Dropping out of scope will close all handles and return them to idle.
1353 }
[email protected]43a21b82010-06-10 21:30:541354
1355 // But if we wait for it, the released idle sockets will be closed in
1356 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011357 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261358
1359 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1360 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541361}
1362
1363// Regression test for http://crbug.com/40952.
1364TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
[email protected]43a21b82010-06-10 21:30:541365 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221366 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541367 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1368
1369 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1370 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521371 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201372 EXPECT_EQ(
1373 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1374 ClientSocketPool::RespectLimits::ENABLED,
1375 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541376 }
1377
1378 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281379 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541380
1381 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1382 // reuse a socket.
1383 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1384 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521385 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541386
1387 // "0" is special here, since it should be the first entry in the sorted map,
1388 // which is the one which we would close an idle socket for. We shouldn't
1389 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201390 EXPECT_EQ(OK,
1391 handle.Init("0", params_, DEFAULT_PRIORITY,
1392 ClientSocketPool::RespectLimits::ENABLED,
1393 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541394
[email protected]43a21b82010-06-10 21:30:541395 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1396 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1397}
1398
[email protected]ab838892009-06-30 18:49:051399TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531400 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091401
robpercival214763f2016-07-01 23:27:011402 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1403 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1404 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1405 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1406 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1407 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1408 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1409 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091410
[email protected]2431756e2010-09-29 20:26:131411 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201412 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1413 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131414 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1415 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091416
[email protected]c9d6a1d2009-07-14 16:15:201417 EXPECT_EQ(1, GetOrderOfRequest(1));
1418 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031419 EXPECT_EQ(8, GetOrderOfRequest(3));
1420 EXPECT_EQ(6, GetOrderOfRequest(4));
1421 EXPECT_EQ(4, GetOrderOfRequest(5));
1422 EXPECT_EQ(3, GetOrderOfRequest(6));
1423 EXPECT_EQ(5, GetOrderOfRequest(7));
1424 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171425
1426 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131427 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091428}
1429
[email protected]ab838892009-06-30 18:49:051430TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531431 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091432
robpercival214763f2016-07-01 23:27:011433 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1434 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1435 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1436 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1437 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1438 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1439 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091440
[email protected]2431756e2010-09-29 20:26:131441 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091442
[email protected]2431756e2010-09-29 20:26:131443 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011444 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201445
[email protected]2431756e2010-09-29 20:26:131446 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201447 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131448 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1449 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091450}
1451
1452// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051453// The pending connect job will be cancelled and should not call back into
1454// ClientSocketPoolBase.
1455TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531456 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201457
[email protected]ab838892009-06-30 18:49:051458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131459 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521460 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151461 EXPECT_EQ(ERR_IO_PENDING,
1462 handle.Init("a", params_, DEFAULT_PRIORITY,
1463 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201464 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131465 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091466}
1467
[email protected]ab838892009-06-30 18:49:051468TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531469 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201470
[email protected]ab838892009-06-30 18:49:051471 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061472 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521473 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091474
mmenked3641e12016-01-28 16:06:151475 EXPECT_EQ(ERR_IO_PENDING,
1476 handle.Init("a", params_, DEFAULT_PRIORITY,
1477 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201478 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091479
1480 handle.Reset();
1481
[email protected]6ecf2b92011-12-15 01:14:521482 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131483 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151484 handle.Init("a", params_, DEFAULT_PRIORITY,
1485 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201486 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091487
robpercival214763f2016-07-01 23:27:011488 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091489 EXPECT_FALSE(callback.have_result());
1490
1491 handle.Reset();
1492}
1493
[email protected]ab838892009-06-30 18:49:051494TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531495 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091496
robpercival214763f2016-07-01 23:27:011497 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1498 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1499 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1500 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1501 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1502 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1503 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091504
1505 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201506 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131507 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1508 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091509
[email protected]2431756e2010-09-29 20:26:131510 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091511
[email protected]c9d6a1d2009-07-14 16:15:201512 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1513 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131514 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1515 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091516
[email protected]c9d6a1d2009-07-14 16:15:201517 EXPECT_EQ(1, GetOrderOfRequest(1));
1518 EXPECT_EQ(2, GetOrderOfRequest(2));
1519 EXPECT_EQ(5, GetOrderOfRequest(3));
1520 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131521 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1522 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201523 EXPECT_EQ(4, GetOrderOfRequest(6));
1524 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171525
1526 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131527 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091528}
1529
mmenke33d24423d2015-05-19 19:41:091530// Function to be used as a callback on socket request completion. It first
1531// disconnects the successfully connected socket from the first request, and
1532// then reuses the ClientSocketHandle to request another socket.
1533//
1534// |nested_callback| is called with the result of the second socket request.
1535void RequestSocketOnComplete(ClientSocketHandle* handle,
1536 TestClientSocketPool* pool,
1537 TestConnectJobFactory* test_connect_job_factory,
1538 TestConnectJob::JobType next_job_type,
1539 const CompletionCallback& nested_callback,
1540 int first_request_result) {
robpercival214763f2016-07-01 23:27:011541 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091542
1543 test_connect_job_factory->set_job_type(next_job_type);
1544
1545 // Don't allow reuse of the socket. Disconnect it and then release it.
1546 if (handle->socket())
1547 handle->socket()->Disconnect();
1548 handle->Reset();
1549
mmenked3641e12016-01-28 16:06:151550 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091551 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151552 int rv = handle->Init("a", params, LOWEST,
1553 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201554 nested_callback, pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091555 if (rv != ERR_IO_PENDING) {
1556 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1557 nested_callback.Run(rv);
1558 } else {
1559 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521560 }
mmenke33d24423d2015-05-19 19:41:091561}
[email protected]f6d1d6eb2009-06-24 20:16:091562
mmenke33d24423d2015-05-19 19:41:091563// Tests the case where a second socket is requested in a completion callback,
1564// and the second socket connects asynchronously. Reuses the same
1565// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581566TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531567 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201568
[email protected]0b7648c2009-07-06 20:14:011569 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061570 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091571 TestCompletionCallback second_result_callback;
1572 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151573 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091574 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1575 connect_job_factory_, TestConnectJob::kMockPendingJob,
1576 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201577 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011578 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091579
robpercival214763f2016-07-01 23:27:011580 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581581}
[email protected]f6d1d6eb2009-06-24 20:16:091582
mmenke33d24423d2015-05-19 19:41:091583// Tests the case where a second socket is requested in a completion callback,
1584// and the second socket connects synchronously. Reuses the same
1585// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581586TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531587 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201588
[email protected]0b7648c2009-07-06 20:14:011589 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061590 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091591 TestCompletionCallback second_result_callback;
1592 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151593 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091594 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1595 connect_job_factory_, TestConnectJob::kMockPendingJob,
1596 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201597 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011598 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581599
robpercival214763f2016-07-01 23:27:011600 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091601}
1602
1603// Make sure that pending requests get serviced after active requests get
1604// cancelled.
[email protected]ab838892009-06-30 18:49:051605TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531606 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201607
[email protected]0b7648c2009-07-06 20:14:011608 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091609
robpercival214763f2016-07-01 23:27:011610 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));
1616 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091617
[email protected]c9d6a1d2009-07-14 16:15:201618 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1619 // Let's cancel them.
1620 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131621 ASSERT_FALSE(request(i)->handle()->is_initialized());
1622 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091623 }
1624
[email protected]f6d1d6eb2009-06-24 20:16:091625 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131626 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011627 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131628 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091629 }
1630
[email protected]2431756e2010-09-29 20:26:131631 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1632 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091633}
1634
1635// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051636TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531637 const size_t kMaxSockets = 5;
1638 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201639
[email protected]0b7648c2009-07-06 20:14:011640 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091641
[email protected]211d21722009-07-22 15:48:531642 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1643 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091644
1645 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531646 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011647 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091648
[email protected]211d21722009-07-22 15:48:531649 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011650 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091651}
1652
mmenke9d72fe42017-05-18 22:36:071653// Make sure that pending requests that complete synchronously get serviced
1654// after active requests fail. See https://crbug.com/723748
1655TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1656 const size_t kNumberOfRequests = 10;
1657 const size_t kMaxSockets = 1;
1658 CreatePool(kMaxSockets, kMaxSockets);
1659
1660 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1661
1662 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1663
1664 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1665
1666 // Queue up all the other requests
1667 for (size_t i = 1; i < kNumberOfRequests; ++i)
1668 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1669
1670 // Make sure all requests fail, instead of hanging.
1671 for (size_t i = 0; i < kNumberOfRequests; ++i)
1672 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1673}
1674
[email protected]5fc08e32009-07-15 17:09:571675TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531676 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571677
1678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1679
[email protected]2431756e2010-09-29 20:26:131680 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521681 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151682 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1683 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201684 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011685 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571686
1687 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131688 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571689
mmenked3641e12016-01-28 16:06:151690 rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1691 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201692 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011693 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1694 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571695
[email protected]2431756e2010-09-29 20:26:131696 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481697 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571698 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1699}
1700
xunjieli26619e72016-11-23 19:39:551701TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1703 ClientSocketHandle handle;
1704 TestCompletionCallback callback;
1705 BoundTestNetLog log;
1706 int rv = handle.Init("a", params_, LOWEST,
1707 ClientSocketPool::RespectLimits::ENABLED,
1708 callback.callback(), pool_.get(), log.bound());
1709 EXPECT_THAT(rv, IsOk());
1710 handle.Reset();
1711 EXPECT_EQ(1, pool_->IdleSocketCount());
1712 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551713}
1714
xunjieli92feb332017-03-03 17:19:231715TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231716 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1717 TestCompletionCallback callback;
1718 BoundTestNetLog log;
1719 ClientSocketHandle handle1;
1720 int rv = handle1.Init("a", params_, LOWEST,
1721 ClientSocketPool::RespectLimits::ENABLED,
1722 callback.callback(), pool_.get(), log.bound());
1723 EXPECT_THAT(rv, IsOk());
1724 ClientSocketHandle handle2;
1725 rv = handle2.Init("a", params_, LOWEST,
1726 ClientSocketPool::RespectLimits::ENABLED,
1727 callback.callback(), pool_.get(), log.bound());
1728 ClientSocketHandle handle3;
1729 rv = handle3.Init("b", params_, LOWEST,
1730 ClientSocketPool::RespectLimits::ENABLED,
1731 callback.callback(), pool_.get(), log.bound());
1732 EXPECT_THAT(rv, IsOk());
1733 handle1.Reset();
1734 handle2.Reset();
1735 handle3.Reset();
1736 EXPECT_EQ(3, pool_->IdleSocketCount());
1737 pool_->CloseIdleSocketsInGroup("a");
1738 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231739}
1740
xunjieli26619e72016-11-23 19:39:551741TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551742 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1743 ClientSocketHandle handle;
1744 TestCompletionCallback callback;
1745 BoundTestNetLog log;
1746 int rv = handle.Init("a", params_, LOWEST,
1747 ClientSocketPool::RespectLimits::ENABLED,
1748 callback.callback(), pool_.get(), log.bound());
1749 EXPECT_THAT(rv, IsOk());
1750 StreamSocket* socket = handle.socket();
1751 handle.Reset();
1752 EXPECT_EQ(1, pool_->IdleSocketCount());
1753
1754 // Disconnect socket now to make the socket unusable.
1755 socket->Disconnect();
1756 ClientSocketHandle handle2;
1757 rv = handle2.Init("a", params_, LOWEST,
1758 ClientSocketPool::RespectLimits::ENABLED,
1759 callback.callback(), pool_.get(), log.bound());
1760 EXPECT_THAT(rv, IsOk());
1761 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551762}
1763
[email protected]2b7523d2009-07-29 20:29:231764// Regression test for http://crbug.com/17985.
1765TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
[email protected]2b7523d2009-07-29 20:29:231766 const int kMaxSockets = 3;
1767 const int kMaxSocketsPerGroup = 2;
1768 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1769
[email protected]ac790b42009-12-02 04:31:311770 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231771
robpercival214763f2016-07-01 23:27:011772 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1773 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231774
1775 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011776 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231777
1778 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011779 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231780
1781 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011782 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1783 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231784
[email protected]eb5a99382010-07-11 03:18:261785 // Release the first two sockets from "a". Because this is a keepalive,
1786 // the first release will unblock the pending request for "a". The
1787 // second release will unblock a request for "c", becaue it is the next
1788 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131789 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2431756e2010-09-29 20:26:131790 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231791
1792 // Closing idle sockets should not get us into trouble, but in the bug
1793 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411794 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541795 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261796
[email protected]2da659e2013-05-23 20:51:341797 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281798 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231799}
1800
[email protected]4d3b05d2010-01-27 21:27:291801TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531802 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571803
1804 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131805 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521806 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511807 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:151808 int rv = handle.Init("a", params_, LOWEST,
1809 ClientSocketPool::RespectLimits::ENABLED,
1810 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011811 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131812 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481813 TestLoadTimingInfoNotConnected(handle);
1814
robpercival214763f2016-07-01 23:27:011815 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131816 EXPECT_TRUE(handle.is_initialized());
1817 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481818 TestLoadTimingInfoConnectedNotReused(handle);
1819
[email protected]2431756e2010-09-29 20:26:131820 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481821 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301822
mmenke43758e62015-05-04 21:09:461823 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401824 log.GetEntries(&entries);
1825
1826 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001827 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171828 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001829 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1830 NetLogEventPhase::NONE));
1831 EXPECT_TRUE(LogContainsEvent(entries, 2,
1832 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1833 NetLogEventPhase::NONE));
1834 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571835}
1836
[email protected]4d3b05d2010-01-27 21:27:291837TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571838 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531839 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571840
1841 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131842 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521843 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511844 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181845 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131846 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431847 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451848 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131849 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151850 EXPECT_EQ(ERR_IO_PENDING,
1851 handle.Init("a", params_, DEFAULT_PRIORITY,
1852 ClientSocketPool::RespectLimits::ENABLED,
1853 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131854 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011855 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131856 EXPECT_FALSE(handle.is_ssl_error());
1857 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301858
mmenke43758e62015-05-04 21:09:461859 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401860 log.GetEntries(&entries);
1861
1862 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001863 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171864 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001865 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1866 NetLogEventPhase::NONE));
1867 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571868}
1869
mmenke6be122f2015-03-09 22:22:471870// Check that an async ConnectJob failure does not result in creation of a new
1871// ConnectJob when there's another pending request also waiting on its own
1872// ConnectJob. See http://crbug.com/463960.
1873TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1874 CreatePool(2, 2);
1875 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1876
robpercival214763f2016-07-01 23:27:011877 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1878 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471879
robpercival214763f2016-07-01 23:27:011880 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1881 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471882
1883 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1884}
1885
[email protected]4d3b05d2010-01-27 21:27:291886TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101887 // TODO(eroman): Add back the log expectations! Removed them because the
1888 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531889 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571890
1891 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131892 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521893 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131894 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521895 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571896
[email protected]2431756e2010-09-29 20:26:131897 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151898 handle.Init("a", params_, DEFAULT_PRIORITY,
1899 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201900 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511901 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201902 EXPECT_EQ(
1903 ERR_IO_PENDING,
1904 handle2.Init("a", params_, DEFAULT_PRIORITY,
1905 ClientSocketPool::RespectLimits::ENABLED,
1906 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571907
[email protected]2431756e2010-09-29 20:26:131908 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571909
[email protected]fd7b7c92009-08-20 19:38:301910
1911 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301912
robpercival214763f2016-07-01 23:27:011913 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131914 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301915
1916 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531917 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571918}
1919
[email protected]4d3b05d2010-01-27 21:27:291920TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341921 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1922
[email protected]17a0c6c2009-08-04 00:07:041923 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1924
robpercival214763f2016-07-01 23:27:011925 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1926 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1927 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1928 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341929
1930 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131931 (*requests())[2]->handle()->Reset();
1932 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341933 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1934
[email protected]2431756e2010-09-29 20:26:131935 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341936 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1937
[email protected]2431756e2010-09-29 20:26:131938 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261939 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341940}
1941
[email protected]5fc08e32009-07-15 17:09:571942// When requests and ConnectJobs are not coupled, the request will get serviced
1943// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291944TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531945 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571946
1947 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321948 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571949
[email protected]2431756e2010-09-29 20:26:131950 std::vector<TestSocketRequest*> request_order;
1951 size_t completion_count; // unused
1952 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:201953 int rv = req1.handle()->Init(
1954 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
1955 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011956 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1957 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571958
1959 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1960 // without a job.
1961 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1962
[email protected]2431756e2010-09-29 20:26:131963 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151964 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1965 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201966 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011967 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131968 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151969 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1970 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201971 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011972 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571973
1974 // Both Requests 2 and 3 are pending. We release socket 1 which should
1975 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331976 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341977 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281978 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331979 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011980 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331981 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571982
1983 // Signal job 2, which should service request 3.
1984
1985 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011986 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571987
[email protected]2431756e2010-09-29 20:26:131988 ASSERT_EQ(3U, request_order.size());
1989 EXPECT_EQ(&req1, request_order[0]);
1990 EXPECT_EQ(&req2, request_order[1]);
1991 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571992 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1993}
1994
1995// The requests are not coupled to the jobs. So, the requests should finish in
1996// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291997TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531998 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571999 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322000 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572001
[email protected]2431756e2010-09-29 20:26:132002 std::vector<TestSocketRequest*> request_order;
2003 size_t completion_count; // unused
2004 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:202005 int rv = req1.handle()->Init(
2006 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
2007 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012008 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572009
[email protected]2431756e2010-09-29 20:26:132010 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152011 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
2012 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202013 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012014 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572015
2016 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322017 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572018
[email protected]2431756e2010-09-29 20:26:132019 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152020 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
2021 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202022 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012023 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572024
robpercival214763f2016-07-01 23:27:012025 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2026 EXPECT_THAT(req2.WaitForResult(), IsOk());
2027 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572028
[email protected]2431756e2010-09-29 20:26:132029 ASSERT_EQ(3U, request_order.size());
2030 EXPECT_EQ(&req1, request_order[0]);
2031 EXPECT_EQ(&req2, request_order[1]);
2032 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572033}
2034
[email protected]03b7c8c2013-07-20 04:38:552035// Test GetLoadState in the case there's only one socket request.
2036TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532037 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552038 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572039
[email protected]2431756e2010-09-29 20:26:132040 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522041 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152042 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2043 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202044 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012045 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552046 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572047
[email protected]03b7c8c2013-07-20 04:38:552048 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2049 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2050
2051 // No point in completing the connection, since ClientSocketHandles only
2052 // expect the LoadState to be checked while connecting.
2053}
2054
2055// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002056// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552057TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2058 CreatePool(2, 2);
2059 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2060
2061 ClientSocketHandle handle;
2062 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152063 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2064 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202065 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012066 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002067 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2068
2069 ClientSocketHandle handle2;
2070 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152071 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2072 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202073 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012074 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002075 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2076
2077 // Check that both handles report the state of the first job.
2078 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2079 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2080
2081 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2082
2083 // Check that both handles change to LOAD_STATE_CONNECTING.
2084 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2085 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2086}
2087
2088// Test that the second connection request does not affect the pool's load
2089// status.
2090TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2091 CreatePool(2, 2);
2092 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2093
2094 ClientSocketHandle handle;
2095 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152096 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2097 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202098 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012099 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572100
[email protected]2431756e2010-09-29 20:26:132101 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522102 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152103 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2104 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202105 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012106 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002107 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552108
[email protected]03b7c8c2013-07-20 04:38:552109 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2110 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2111
haavardm835c1d62015-04-22 08:18:002112 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552113 // second handle switches to the state of the remaining ConnectJob.
2114 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012115 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002116 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552117}
2118
2119// Test GetLoadState in the case the per-group limit is reached.
2120TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2121 CreatePool(2, 1);
2122 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2123
2124 ClientSocketHandle handle;
2125 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152126 int rv = handle.Init("a", params_, MEDIUM,
2127 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202128 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012129 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552130 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2131
2132 // Request another socket from the same pool, buth with a higher priority.
2133 // The first request should now be stalled at the socket group limit.
2134 ClientSocketHandle handle2;
2135 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152136 rv = handle2.Init("a", params_, HIGHEST,
2137 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202138 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012139 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552140 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2141 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2142
2143 // The first handle should remain stalled as the other socket goes through
2144 // the connect process.
2145
2146 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2147 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2148 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2149
2150 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012151 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552152 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2153
2154 // Closing the second socket should cause the stalled handle to finally get a
2155 // ConnectJob.
2156 handle2.socket()->Disconnect();
2157 handle2.Reset();
2158 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2159}
2160
2161// Test GetLoadState in the case the per-pool limit is reached.
2162TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2163 CreatePool(2, 2);
2164 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2165
2166 ClientSocketHandle handle;
2167 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152168 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2169 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202170 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012171 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552172
2173 // Request for socket from another pool.
2174 ClientSocketHandle handle2;
2175 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152176 rv = handle2.Init("b", params_, DEFAULT_PRIORITY,
2177 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202178 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552180
2181 // Request another socket from the first pool. Request should stall at the
2182 // socket pool limit.
2183 ClientSocketHandle handle3;
2184 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152185 rv = handle3.Init("a", params_, DEFAULT_PRIORITY,
2186 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202187 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012188 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552189
2190 // The third handle should remain stalled as the other sockets in its group
2191 // goes through the connect process.
2192
2193 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2194 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2195
2196 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2197 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2198 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2199
2200 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012201 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552202 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2203
2204 // Closing a socket should allow the stalled handle to finally get a new
2205 // ConnectJob.
2206 handle.socket()->Disconnect();
2207 handle.Reset();
2208 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572209}
2210
[email protected]e772db3f2010-07-12 18:11:132211TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2212 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2213 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2214
[email protected]2431756e2010-09-29 20:26:132215 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522216 TestCompletionCallback callback;
2217 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
mmenked3641e12016-01-28 16:06:152218 handle.Init("a", params_, DEFAULT_PRIORITY,
2219 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202220 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132221 EXPECT_TRUE(handle.is_initialized());
2222 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132223}
2224
2225TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2226 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2227
2228 connect_job_factory_->set_job_type(
2229 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132230 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522231 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132232 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152233 handle.Init("a", params_, DEFAULT_PRIORITY,
2234 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202235 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132236 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012237 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132238 EXPECT_TRUE(handle.is_initialized());
2239 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132240}
2241
[email protected]e60e47a2010-07-14 03:37:182242TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2243 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2244 connect_job_factory_->set_job_type(
2245 TestConnectJob::kMockAdditionalErrorStateJob);
2246
[email protected]2431756e2010-09-29 20:26:132247 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522248 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132249 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:152250 handle.Init("a", params_, DEFAULT_PRIORITY,
2251 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202252 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132253 EXPECT_FALSE(handle.is_initialized());
2254 EXPECT_FALSE(handle.socket());
2255 EXPECT_TRUE(handle.is_ssl_error());
2256 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182257}
2258
2259TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2260 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2261
2262 connect_job_factory_->set_job_type(
2263 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132264 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522265 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132266 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152267 handle.Init("a", params_, DEFAULT_PRIORITY,
2268 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202269 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132270 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012271 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132272 EXPECT_FALSE(handle.is_initialized());
2273 EXPECT_FALSE(handle.socket());
2274 EXPECT_TRUE(handle.is_ssl_error());
2275 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182276}
2277
martijn003cd612016-05-19 22:24:382278// Make sure we can reuse sockets.
2279TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412280 CreatePoolWithIdleTimeouts(
2281 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032282 base::TimeDelta(), // Time out unused sockets immediately.
2283 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2284
2285 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2286
2287 ClientSocketHandle handle;
2288 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152289 int rv = handle.Init("a", params_, LOWEST,
2290 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202291 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012292 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032293 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012294 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032295
2296 // Use and release the socket.
2297 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482298 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032299 handle.Reset();
2300
2301 // Should now have one idle socket.
2302 ASSERT_EQ(1, pool_->IdleSocketCount());
2303
2304 // Request a new socket. This should reuse the old socket and complete
2305 // synchronously.
vishal.b62985ca92015-04-17 08:45:512306 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:152307 rv = handle.Init("a", params_, LOWEST,
2308 ClientSocketPool::RespectLimits::ENABLED,
2309 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012310 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032311 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482312 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032313
2314 ASSERT_TRUE(pool_->HasGroup("a"));
2315 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2316 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]e7b1c6d2c2012-05-05 00:54:032317
mmenke43758e62015-05-04 21:09:462318 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032319 log.GetEntries(&entries);
2320 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002321 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032322}
2323
blundellb8163592f2015-12-16 14:22:422324#if defined(OS_IOS)
2325// TODO(droger): Enable this test (crbug.com/512595).
martijn003cd612016-05-19 22:24:382326#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2327 DISABLED_CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422328#else
martijn003cd612016-05-19 22:24:382329#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2330 CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422331#endif
martijn003cd612016-05-19 22:24:382332// Make sure we cleanup old unused sockets.
2333TEST_F(ClientSocketPoolBaseTest, MAYBE_CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032334 CreatePoolWithIdleTimeouts(
2335 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2336 base::TimeDelta(), // Time out unused sockets immediately
2337 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412338
2339 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2340
2341 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2342
2343 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522344 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152345 int rv = handle.Init("a", params_, LOWEST,
2346 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202347 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012348 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412349 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2350
2351 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522352 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152353 rv = handle2.Init("a", params_, LOWEST,
2354 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202355 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012356 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412357 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2358
2359 // Cancel one of the requests. Wait for the other, which will get the first
2360 // job. Release the socket. Run the loop again to make sure the second
2361 // socket is sitting idle and the first one is released (since ReleaseSocket()
2362 // just posts a DoReleaseSocket() task).
2363
2364 handle.Reset();
robpercival214763f2016-07-01 23:27:012365 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412366 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552367 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412368 handle2.Reset();
2369
[email protected]e7b1c6d2c2012-05-05 00:54:032370 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2371 // actually become pending until 2ms after they have been created. In order
2372 // to flush all tasks, we need to wait so that we know there are no
2373 // soon-to-be-pending tasks waiting.
2374 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282375 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412376
[email protected]e7b1c6d2c2012-05-05 00:54:032377 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412378 ASSERT_EQ(2, pool_->IdleSocketCount());
2379
2380 // Request a new socket. This should cleanup the unused and timed out ones.
2381 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512382 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522383 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152384 rv = handle.Init("a", params_, LOWEST,
2385 ClientSocketPool::RespectLimits::ENABLED,
2386 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012387 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2388 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412389 EXPECT_FALSE(handle.is_reused());
2390
[email protected]e7b1c6d2c2012-05-05 00:54:032391 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412392 ASSERT_TRUE(pool_->HasGroup("a"));
2393 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2394 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2395
mmenke43758e62015-05-04 21:09:462396 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412397 log.GetEntries(&entries);
2398 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002399 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412400}
2401
[email protected]2041cf342010-02-19 03:15:592402// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162403// because of multiple releasing disconnected sockets.
2404TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2405 CreatePoolWithIdleTimeouts(
2406 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2407 base::TimeDelta(), // Time out unused sockets immediately.
2408 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2409
2410 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2411
2412 // Startup 4 connect jobs. Two of them will be pending.
2413
[email protected]2431756e2010-09-29 20:26:132414 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522415 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152416 int rv = handle.Init("a", params_, LOWEST,
2417 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202418 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012419 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162420
[email protected]2431756e2010-09-29 20:26:132421 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522422 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152423 rv = handle2.Init("a", params_, LOWEST,
2424 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202425 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012426 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162427
[email protected]2431756e2010-09-29 20:26:132428 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522429 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152430 rv = handle3.Init("a", params_, LOWEST,
2431 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202432 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012433 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162434
[email protected]2431756e2010-09-29 20:26:132435 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522436 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:152437 rv = handle4.Init("a", params_, LOWEST,
2438 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202439 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012440 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162441
2442 // Release two disconnected sockets.
2443
[email protected]2431756e2010-09-29 20:26:132444 handle.socket()->Disconnect();
2445 handle.Reset();
2446 handle2.socket()->Disconnect();
2447 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162448
robpercival214763f2016-07-01 23:27:012449 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132450 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012451 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132452 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162453}
2454
[email protected]d7027bb2010-05-10 18:58:542455// Regression test for http://crbug.com/42267.
2456// When DoReleaseSocket() is processed for one socket, it is blocked because the
2457// other stalled groups all have releasing sockets, so no progress can be made.
2458TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2459 CreatePoolWithIdleTimeouts(
2460 4 /* socket limit */, 4 /* socket limit per group */,
2461 base::TimeDelta(), // Time out unused sockets immediately.
2462 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2463
2464 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2465
2466 // Max out the socket limit with 2 per group.
2467
[email protected]2431756e2010-09-29 20:26:132468 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522469 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132470 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522471 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542472
2473 for (int i = 0; i < 2; ++i) {
mmenked3641e12016-01-28 16:06:152474 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST,
2475 ClientSocketPool::RespectLimits::ENABLED,
2476 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202477 NetLogWithSource()));
mmenked3641e12016-01-28 16:06:152478 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST,
2479 ClientSocketPool::RespectLimits::ENABLED,
2480 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202481 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542482 }
[email protected]b89f7e42010-05-20 20:37:002483
[email protected]d7027bb2010-05-10 18:58:542484 // Make 4 pending requests, 2 per group.
2485
2486 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202487 EXPECT_EQ(ERR_IO_PENDING,
2488 handle_a[i].Init("a", params_, LOWEST,
2489 ClientSocketPool::RespectLimits::ENABLED,
2490 callback_a[i].callback(), pool_.get(),
2491 NetLogWithSource()));
2492 EXPECT_EQ(ERR_IO_PENDING,
2493 handle_b[i].Init("b", params_, LOWEST,
2494 ClientSocketPool::RespectLimits::ENABLED,
2495 callback_b[i].callback(), pool_.get(),
2496 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542497 }
2498
2499 // Release b's socket first. The order is important, because in
2500 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2501 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2502 // first, which has a releasing socket, so it refuses to start up another
2503 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132504 handle_b[0].socket()->Disconnect();
2505 handle_b[0].Reset();
2506 handle_a[0].socket()->Disconnect();
2507 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542508
2509 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282510 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542511
[email protected]2431756e2010-09-29 20:26:132512 handle_b[1].socket()->Disconnect();
2513 handle_b[1].Reset();
2514 handle_a[1].socket()->Disconnect();
2515 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542516
2517 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012518 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2519 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542520 }
2521}
2522
[email protected]fd4fe0b2010-02-08 23:02:152523TEST_F(ClientSocketPoolBaseTest,
2524 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
[email protected]fd4fe0b2010-02-08 23:02:152525 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2526
2527 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2528
robpercival214763f2016-07-01 23:27:012529 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));
2532 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152533
robpercival214763f2016-07-01 23:27:012534 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2535 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132536 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152537
2538 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132539 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012540 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152541
[email protected]2431756e2010-09-29 20:26:132542 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012543 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132544 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152545
2546 EXPECT_EQ(1, GetOrderOfRequest(1));
2547 EXPECT_EQ(2, GetOrderOfRequest(2));
2548 EXPECT_EQ(3, GetOrderOfRequest(3));
2549 EXPECT_EQ(4, GetOrderOfRequest(4));
2550
2551 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132552 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152553}
2554
[email protected]6ecf2b92011-12-15 01:14:522555class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042556 public:
[email protected]2431756e2010-09-29 20:26:132557 TestReleasingSocketRequest(TestClientSocketPool* pool,
2558 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182559 bool reset_releasing_handle)
2560 : pool_(pool),
2561 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522562 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322563 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2564 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522565 }
2566
Chris Watkins7a41d3552017-12-01 02:13:272567 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042568
2569 ClientSocketHandle* handle() { return &handle_; }
2570
[email protected]6ecf2b92011-12-15 01:14:522571 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042572
2573 private:
[email protected]6ecf2b92011-12-15 01:14:522574 void OnComplete(int result) {
2575 SetResult(result);
2576 if (reset_releasing_handle_)
2577 handle_.Reset();
2578
mmenked3641e12016-01-28 16:06:152579 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522580 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072581 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:152582 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202583 callback2_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522584 }
2585
[email protected]2431756e2010-09-29 20:26:132586 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182587 int expected_result_;
2588 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042589 ClientSocketHandle handle_;
2590 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522591 CompletionCallback callback_;
2592 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042593};
2594
[email protected]e60e47a2010-07-14 03:37:182595
2596TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2597 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2598
robpercival214763f2016-07-01 23:27:012599 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2600 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2601 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182602
[email protected]2431756e2010-09-29 20:26:132603 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182604 client_socket_factory_.allocation_count());
2605
2606 connect_job_factory_->set_job_type(
2607 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2608 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202609 EXPECT_EQ(
2610 ERR_IO_PENDING,
2611 req.handle()->Init("a", params_, DEFAULT_PRIORITY,
2612 ClientSocketPool::RespectLimits::ENABLED,
2613 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182614 // The next job should complete synchronously
2615 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2616
robpercival214763f2016-07-01 23:27:012617 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182618 EXPECT_FALSE(req.handle()->is_initialized());
2619 EXPECT_FALSE(req.handle()->socket());
2620 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432621 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182622}
2623
[email protected]b6501d3d2010-06-03 23:53:342624// http://crbug.com/44724 regression test.
2625// We start releasing the pool when we flush on network change. When that
2626// happens, the only active references are in the ClientSocketHandles. When a
2627// ConnectJob completes and calls back into the last ClientSocketHandle, that
2628// callback can release the last reference and delete the pool. After the
2629// callback finishes, we go back to the stack frame within the now-deleted pool.
2630// Executing any code that refers to members of the now-deleted pool can cause
2631// crashes.
2632TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2633 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2634 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2635
2636 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522637 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152638 EXPECT_EQ(ERR_IO_PENDING,
2639 handle.Init("a", params_, DEFAULT_PRIORITY,
2640 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202641 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342642
[email protected]7af985a2012-12-14 22:40:422643 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342644
2645 // We'll call back into this now.
2646 callback.WaitForResult();
2647}
2648
[email protected]a7e38572010-06-07 18:22:242649TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2650 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2651 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2652
2653 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522654 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152655 EXPECT_EQ(ERR_IO_PENDING,
2656 handle.Init("a", params_, DEFAULT_PRIORITY,
2657 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202658 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012659 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242660 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2661
[email protected]7af985a2012-12-14 22:40:422662 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242663
2664 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282665 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242666
mmenked3641e12016-01-28 16:06:152667 EXPECT_EQ(ERR_IO_PENDING,
2668 handle.Init("a", params_, DEFAULT_PRIORITY,
2669 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202670 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012671 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242672 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2673}
2674
[email protected]6ecf2b92011-12-15 01:14:522675class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142676 public:
2677 ConnectWithinCallback(
2678 const std::string& group_name,
2679 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132680 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522681 : group_name_(group_name),
2682 params_(params),
2683 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322684 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2685 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142686 }
2687
Chris Watkins7a41d3552017-12-01 02:13:272688 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142689
2690 int WaitForNestedResult() {
2691 return nested_callback_.WaitForResult();
2692 }
2693
[email protected]6ecf2b92011-12-15 01:14:522694 const CompletionCallback& callback() const { return callback_; }
2695
[email protected]06f92462010-08-31 19:24:142696 private:
[email protected]6ecf2b92011-12-15 01:14:522697 void OnComplete(int result) {
2698 SetResult(result);
tfarina428341112016-09-22 13:38:202699 EXPECT_EQ(
2700 ERR_IO_PENDING,
2701 handle_.Init(group_name_, params_, DEFAULT_PRIORITY,
2702 ClientSocketPool::RespectLimits::ENABLED,
2703 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522704 }
2705
[email protected]06f92462010-08-31 19:24:142706 const std::string group_name_;
2707 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132708 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142709 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522710 CompletionCallback callback_;
2711 TestCompletionCallback nested_callback_;
2712
2713 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142714};
2715
2716TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2717 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2718
2719 // First job will be waiting until it gets aborted.
2720 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2721
2722 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132723 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152724 EXPECT_EQ(ERR_IO_PENDING,
2725 handle.Init("a", params_, DEFAULT_PRIORITY,
2726 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202727 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142728
2729 // Second job will be started during the first callback, and will
2730 // asynchronously complete with OK.
2731 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422732 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012733 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2734 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142735}
2736
[email protected]25eea382010-07-10 23:55:262737// Cancel a pending socket request while we're at max sockets,
2738// and verify that the backup socket firing doesn't cause a crash.
2739TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2740 // Max 4 sockets globally, max 4 sockets per group.
2741 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222742 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262743
[email protected]4baaf9d2010-08-31 15:15:442744 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2745 // timer.
[email protected]25eea382010-07-10 23:55:262746 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2747 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522748 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152749 EXPECT_EQ(ERR_IO_PENDING,
2750 handle.Init("bar", params_, DEFAULT_PRIORITY,
2751 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202752 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262753
2754 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2755 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2756 ClientSocketHandle handles[kDefaultMaxSockets];
2757 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522758 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:202759 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY,
2760 ClientSocketPool::RespectLimits::ENABLED,
2761 callback.callback(), pool_.get(),
2762 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262763 }
2764
fdoray5eeb7642016-06-22 16:11:282765 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262766
2767 // Cancel the pending request.
2768 handle.Reset();
2769
2770 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002771 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2772 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262773
fdoray5eeb7642016-06-22 16:11:282774 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262775 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2776}
2777
[email protected]3f00be82010-09-27 19:50:022778TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442779 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2780 pool_->EnableConnectBackupJobs();
2781
2782 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2783 // timer.
2784 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2785 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522786 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152787 EXPECT_EQ(ERR_IO_PENDING,
2788 handle.Init("bar", params_, DEFAULT_PRIORITY,
2789 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202790 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442791 ASSERT_TRUE(pool_->HasGroup("bar"));
2792 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102793 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442794
2795 // Cancel the socket request. This should cancel the backup timer. Wait for
2796 // the backup time to see if it indeed got canceled.
2797 handle.Reset();
2798 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002799 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2800 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282801 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442802 ASSERT_TRUE(pool_->HasGroup("bar"));
2803 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2804}
2805
[email protected]3f00be82010-09-27 19:50:022806TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2807 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2808 pool_->EnableConnectBackupJobs();
2809
2810 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2811 // timer.
2812 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2813 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522814 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152815 EXPECT_EQ(ERR_IO_PENDING,
2816 handle.Init("bar", params_, DEFAULT_PRIORITY,
2817 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202818 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022819 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2820 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522821 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202822 EXPECT_EQ(
2823 ERR_IO_PENDING,
2824 handle2.Init("bar", params_, DEFAULT_PRIORITY,
2825 ClientSocketPool::RespectLimits::ENABLED,
2826 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022827 ASSERT_TRUE(pool_->HasGroup("bar"));
2828 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2829
2830 // Cancel request 1 and then complete request 2. With the requests finished,
2831 // the backup timer should be cancelled.
2832 handle.Reset();
robpercival214763f2016-07-01 23:27:012833 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022834 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002835 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2836 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282837 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022838}
2839
[email protected]eb5a99382010-07-11 03:18:262840// Test delayed socket binding for the case where we have two connects,
2841// and while one is waiting on a connect, the other frees up.
2842// The socket waiting on a connect should switch immediately to the freed
2843// up socket.
2844TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2846 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2847
2848 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522849 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132850 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152851 handle1.Init("a", params_, DEFAULT_PRIORITY,
2852 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202853 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012854 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262855
2856 // No idle sockets, no pending jobs.
2857 EXPECT_EQ(0, pool_->IdleSocketCount());
2858 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2859
2860 // Create a second socket to the same host, but this one will wait.
2861 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2862 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132863 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152864 handle2.Init("a", params_, DEFAULT_PRIORITY,
2865 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202866 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262867 // No idle sockets, and one connecting job.
2868 EXPECT_EQ(0, pool_->IdleSocketCount());
2869 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2870
2871 // Return the first handle to the pool. This will initiate the delayed
2872 // binding.
2873 handle1.Reset();
2874
fdoray5eeb7642016-06-22 16:11:282875 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262876
2877 // Still no idle sockets, still one pending connect job.
2878 EXPECT_EQ(0, pool_->IdleSocketCount());
2879 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2880
2881 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012882 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262883
2884 // And we can see there is still one job waiting.
2885 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2886
2887 // Finally, signal the waiting Connect.
2888 client_socket_factory_.SignalJobs();
2889 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2890
fdoray5eeb7642016-06-22 16:11:282891 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262892}
2893
2894// Test delayed socket binding when a group is at capacity and one
2895// of the group's sockets frees up.
2896TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2897 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2898 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2899
2900 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522901 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132902 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152903 handle1.Init("a", params_, DEFAULT_PRIORITY,
2904 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202905 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012906 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262907
2908 // No idle sockets, no pending jobs.
2909 EXPECT_EQ(0, pool_->IdleSocketCount());
2910 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2911
2912 // Create a second socket to the same host, but this one will wait.
2913 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2914 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132915 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152916 handle2.Init("a", params_, DEFAULT_PRIORITY,
2917 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202918 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262919 // No idle sockets, and one connecting job.
2920 EXPECT_EQ(0, pool_->IdleSocketCount());
2921 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2922
2923 // Return the first handle to the pool. This will initiate the delayed
2924 // binding.
2925 handle1.Reset();
2926
fdoray5eeb7642016-06-22 16:11:282927 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262928
2929 // Still no idle sockets, still one pending connect job.
2930 EXPECT_EQ(0, pool_->IdleSocketCount());
2931 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2932
2933 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012934 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262935
2936 // And we can see there is still one job waiting.
2937 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2938
2939 // Finally, signal the waiting Connect.
2940 client_socket_factory_.SignalJobs();
2941 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2942
fdoray5eeb7642016-06-22 16:11:282943 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262944}
2945
2946// Test out the case where we have one socket connected, one
2947// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512948// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262949// should complete, by taking the first socket's idle socket.
2950TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2951 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2952 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2953
2954 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522955 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132956 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152957 handle1.Init("a", params_, DEFAULT_PRIORITY,
2958 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202959 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012960 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262961
2962 // No idle sockets, no pending jobs.
2963 EXPECT_EQ(0, pool_->IdleSocketCount());
2964 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2965
2966 // Create a second socket to the same host, but this one will wait.
2967 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2968 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132969 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152970 handle2.Init("a", params_, DEFAULT_PRIORITY,
2971 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202972 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262973 // No idle sockets, and one connecting job.
2974 EXPECT_EQ(0, pool_->IdleSocketCount());
2975 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2976
2977 // Return the first handle to the pool. This will initiate the delayed
2978 // binding.
2979 handle1.Reset();
2980
fdoray5eeb7642016-06-22 16:11:282981 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262982
2983 // Still no idle sockets, still one pending connect job.
2984 EXPECT_EQ(0, pool_->IdleSocketCount());
2985 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2986
2987 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012988 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262989
2990 // And we can see there is still one job waiting.
2991 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2992
2993 // Finally, signal the waiting Connect.
2994 client_socket_factory_.SignalJobs();
2995 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2996
fdoray5eeb7642016-06-22 16:11:282997 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262998}
2999
[email protected]2abfe90a2010-08-25 17:49:513000// Cover the case where on an available socket slot, we have one pending
3001// request that completes synchronously, thereby making the Group empty.
3002TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3003 const int kUnlimitedSockets = 100;
3004 const int kOneSocketPerGroup = 1;
3005 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3006
3007 // Make the first request asynchronous fail.
3008 // This will free up a socket slot later.
3009 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3010
3011 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523012 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203013 EXPECT_EQ(
3014 ERR_IO_PENDING,
3015 handle1.Init("a", params_, DEFAULT_PRIORITY,
3016 ClientSocketPool::RespectLimits::ENABLED,
3017 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513018 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3019
3020 // Make the second request synchronously fail. This should make the Group
3021 // empty.
3022 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3023 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523024 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513025 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3026 // when created.
tfarina428341112016-09-22 13:38:203027 EXPECT_EQ(
3028 ERR_IO_PENDING,
3029 handle2.Init("a", params_, DEFAULT_PRIORITY,
3030 ClientSocketPool::RespectLimits::ENABLED,
3031 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513032
3033 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3034
robpercival214763f2016-07-01 23:27:013035 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3036 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513037 EXPECT_FALSE(pool_->HasGroup("a"));
3038}
3039
[email protected]e1b54dc2010-10-06 21:27:223040TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3041 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3042
3043 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3044
3045 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523046 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203047 EXPECT_EQ(
3048 ERR_IO_PENDING,
3049 handle1.Init("a", params_, DEFAULT_PRIORITY,
3050 ClientSocketPool::RespectLimits::ENABLED,
3051 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223052
3053 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523054 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203055 EXPECT_EQ(
3056 ERR_IO_PENDING,
3057 handle2.Init("a", params_, DEFAULT_PRIORITY,
3058 ClientSocketPool::RespectLimits::ENABLED,
3059 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223060 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523061 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203062 EXPECT_EQ(
3063 ERR_IO_PENDING,
3064 handle3.Init("a", params_, DEFAULT_PRIORITY,
3065 ClientSocketPool::RespectLimits::ENABLED,
3066 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223067
robpercival214763f2016-07-01 23:27:013068 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3069 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3070 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223071
3072 // Use the socket.
[email protected]83039bb2011-12-09 18:43:553073 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
3074 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:223075
3076 handle1.Reset();
3077 handle2.Reset();
3078 handle3.Reset();
3079
tfarina428341112016-09-22 13:38:203080 EXPECT_EQ(
3081 OK, handle1.Init("a", params_, DEFAULT_PRIORITY,
3082 ClientSocketPool::RespectLimits::ENABLED,
3083 callback1.callback(), pool_.get(), NetLogWithSource()));
3084 EXPECT_EQ(
3085 OK, handle2.Init("a", params_, DEFAULT_PRIORITY,
3086 ClientSocketPool::RespectLimits::ENABLED,
3087 callback2.callback(), pool_.get(), NetLogWithSource()));
3088 EXPECT_EQ(
3089 OK, handle3.Init("a", params_, DEFAULT_PRIORITY,
3090 ClientSocketPool::RespectLimits::ENABLED,
3091 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223092
3093 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3094 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3095 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3096}
3097
[email protected]2c2bef152010-10-13 00:55:033098TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3099 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3100 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3101
Alexandr Ilin65ec9582017-10-02 14:50:313102 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3103 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033104
3105 ASSERT_TRUE(pool_->HasGroup("a"));
3106 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103107 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033108 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3109
3110 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523111 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203112 EXPECT_EQ(
3113 ERR_IO_PENDING,
3114 handle1.Init("a", params_, DEFAULT_PRIORITY,
3115 ClientSocketPool::RespectLimits::ENABLED,
3116 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033117
3118 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523119 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203120 EXPECT_EQ(
3121 ERR_IO_PENDING,
3122 handle2.Init("a", params_, DEFAULT_PRIORITY,
3123 ClientSocketPool::RespectLimits::ENABLED,
3124 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033125
3126 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103127 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033128 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3129
robpercival214763f2016-07-01 23:27:013130 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3131 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033132 handle1.Reset();
3133 handle2.Reset();
3134
3135 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103136 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033137 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3138}
3139
3140TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3141 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3142 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3143
3144 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523145 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203146 EXPECT_EQ(
3147 ERR_IO_PENDING,
3148 handle1.Init("a", params_, DEFAULT_PRIORITY,
3149 ClientSocketPool::RespectLimits::ENABLED,
3150 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033151
3152 ASSERT_TRUE(pool_->HasGroup("a"));
3153 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103154 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033155 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3156
Alexandr Ilin65ec9582017-10-02 14:50:313157 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3158 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033159
3160 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103161 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033162 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3163
3164 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523165 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203166 EXPECT_EQ(
3167 ERR_IO_PENDING,
3168 handle2.Init("a", params_, DEFAULT_PRIORITY,
3169 ClientSocketPool::RespectLimits::ENABLED,
3170 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033171
3172 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103173 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033174 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3175
robpercival214763f2016-07-01 23:27:013176 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3177 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033178 handle1.Reset();
3179 handle2.Reset();
3180
3181 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103182 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033183 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3184}
3185
3186TEST_F(ClientSocketPoolBaseTest,
3187 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3188 CreatePool(4, 4);
3189 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3190
3191 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523192 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203193 EXPECT_EQ(
3194 ERR_IO_PENDING,
3195 handle1.Init("a", params_, DEFAULT_PRIORITY,
3196 ClientSocketPool::RespectLimits::ENABLED,
3197 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033198
3199 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523200 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203201 EXPECT_EQ(
3202 ERR_IO_PENDING,
3203 handle2.Init("a", params_, DEFAULT_PRIORITY,
3204 ClientSocketPool::RespectLimits::ENABLED,
3205 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033206
3207 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523208 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203209 EXPECT_EQ(
3210 ERR_IO_PENDING,
3211 handle3.Init("a", params_, DEFAULT_PRIORITY,
3212 ClientSocketPool::RespectLimits::ENABLED,
3213 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033214
3215 ASSERT_TRUE(pool_->HasGroup("a"));
3216 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103217 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033218 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3219
Alexandr Ilin65ec9582017-10-02 14:50:313220 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3221 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033222
3223 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103224 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033225 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3226
robpercival214763f2016-07-01 23:27:013227 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3228 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3229 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033230 handle1.Reset();
3231 handle2.Reset();
3232 handle3.Reset();
3233
3234 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103235 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033236 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3237}
3238
3239TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3240 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3241 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3242
3243 ASSERT_FALSE(pool_->HasGroup("a"));
3244
Alexandr Ilin65ec9582017-10-02 14:50:313245 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource(),
3246 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033247
3248 ASSERT_TRUE(pool_->HasGroup("a"));
3249 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103250 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033251
3252 ASSERT_FALSE(pool_->HasGroup("b"));
3253
Alexandr Ilin65ec9582017-10-02 14:50:313254 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource(),
3255 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033256
3257 ASSERT_FALSE(pool_->HasGroup("b"));
3258}
3259
3260TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3261 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3262 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3263
3264 ASSERT_FALSE(pool_->HasGroup("a"));
3265
3266 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Alexandr Ilin65ec9582017-10-02 14:50:313267 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033268
3269 ASSERT_TRUE(pool_->HasGroup("a"));
3270 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103271 EXPECT_EQ(kDefaultMaxSockets - 1,
3272 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483273 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033274
3275 ASSERT_FALSE(pool_->HasGroup("b"));
3276
Alexandr Ilin65ec9582017-10-02 14:50:313277 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource(),
3278 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033279
3280 ASSERT_TRUE(pool_->HasGroup("b"));
3281 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483282 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033283}
3284
3285TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3286 CreatePool(4, 4);
3287 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3288
3289 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523290 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203291 EXPECT_EQ(
3292 ERR_IO_PENDING,
3293 handle1.Init("a", params_, DEFAULT_PRIORITY,
3294 ClientSocketPool::RespectLimits::ENABLED,
3295 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013296 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033297 handle1.Reset();
3298
3299 ASSERT_TRUE(pool_->HasGroup("a"));
3300 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103301 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033302 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3303
Alexandr Ilin65ec9582017-10-02 14:50:313304 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3305 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033306
3307 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103308 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033309 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3310}
3311
3312TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3313 CreatePool(4, 4);
3314 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3315
3316 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523317 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203318 EXPECT_EQ(
3319 ERR_IO_PENDING,
3320 handle1.Init("a", params_, DEFAULT_PRIORITY,
3321 ClientSocketPool::RespectLimits::ENABLED,
3322 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013323 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033324
3325 ASSERT_TRUE(pool_->HasGroup("a"));
3326 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103327 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033328 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3329 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3330
Alexandr Ilin65ec9582017-10-02 14:50:313331 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3332 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033333
3334 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103335 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033336 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3337 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3338}
3339
3340TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3341 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3342 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3343
3344 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313345 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033346
3347 ASSERT_TRUE(pool_->HasGroup("a"));
3348 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103349 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033350 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3351
3352 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313353 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033354
3355 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103356 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033357 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3358}
3359
[email protected]3c819f522010-12-02 02:03:123360TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3361 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3362 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3363
3364 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313365 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]3c819f522010-12-02 02:03:123366
3367 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523368
3369 connect_job_factory_->set_job_type(
3370 TestConnectJob::kMockAdditionalErrorStateJob);
3371 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Alexandr Ilin65ec9582017-10-02 14:50:313372 NetLogWithSource(), HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]fd2e53e2011-01-14 20:40:523373
3374 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123375}
3376
[email protected]8159a1c2012-06-07 00:00:103377TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033378 CreatePool(4, 4);
3379 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3380
Alexandr Ilin65ec9582017-10-02 14:50:313381 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3382 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033383
3384 ASSERT_TRUE(pool_->HasGroup("a"));
3385 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103386 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033387 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3388
Alexandr Ilin65ec9582017-10-02 14:50:313389 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3390 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033391 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103392 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033393 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3394
3395 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523396 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203397 EXPECT_EQ(
3398 ERR_IO_PENDING,
3399 handle1.Init("a", params_, DEFAULT_PRIORITY,
3400 ClientSocketPool::RespectLimits::ENABLED,
3401 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013402 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033403
3404 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523405 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153406 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
3407 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203408 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033409 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013410 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3411 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033412 }
3413
[email protected]8159a1c2012-06-07 00:00:103414 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3415 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3416 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3417 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3418
[email protected]2c2bef152010-10-13 00:55:033419 handle1.Reset();
3420 handle2.Reset();
3421
[email protected]8159a1c2012-06-07 00:00:103422 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3423 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033424 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3425
Alexandr Ilin65ec9582017-10-02 14:50:313426 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3427 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033428 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103429 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033430 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3431}
3432
3433TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3434 CreatePool(4, 4);
3435 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3436
Alexandr Ilin65ec9582017-10-02 14:50:313437 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3438 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033439
3440 ASSERT_TRUE(pool_->HasGroup("a"));
3441 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103442 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033443 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3444
Alexandr Ilin65ec9582017-10-02 14:50:313445 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3446 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033447 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103448 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033449 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3450
Alexandr Ilin65ec9582017-10-02 14:50:313451 pool_->RequestSockets("a", &params_, 3, NetLogWithSource(),
3452 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033453 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103454 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033455 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3456
Alexandr Ilin65ec9582017-10-02 14:50:313457 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3458 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033459 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103460 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033461 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3462}
3463
3464TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3465 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3466 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3467
Alexandr Ilin65ec9582017-10-02 14:50:313468 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3469 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]2c2bef152010-10-13 00:55:033470
3471 ASSERT_TRUE(pool_->HasGroup("a"));
3472 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103473 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033474 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3475
3476 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523477 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203478 EXPECT_EQ(
3479 ERR_IO_PENDING,
3480 handle1.Init("a", params_, DEFAULT_PRIORITY,
3481 ClientSocketPool::RespectLimits::ENABLED,
3482 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033483
3484 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103485 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033486 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3487
robpercival214763f2016-07-01 23:27:013488 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033489
[email protected]0dc88b32014-03-26 20:12:283490 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483491 // starts, it has a connect start time.
3492 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033493 handle1.Reset();
3494
3495 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3496}
3497
[email protected]034df0f32013-01-07 23:17:483498// Checks that fully connected preconnect jobs have no connect times, and are
3499// marked as reused.
3500TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3501 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3502 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Alexandr Ilin65ec9582017-10-02 14:50:313503 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3504 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]034df0f32013-01-07 23:17:483505
3506 ASSERT_TRUE(pool_->HasGroup("a"));
3507 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3508 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3509 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3510
3511 ClientSocketHandle handle;
3512 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203513 EXPECT_EQ(OK,
3514 handle.Init("a", params_, DEFAULT_PRIORITY,
3515 ClientSocketPool::RespectLimits::ENABLED,
3516 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483517
3518 // Make sure the idle socket was used.
3519 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3520
3521 TestLoadTimingInfoConnectedReused(handle);
3522 handle.Reset();
3523 TestLoadTimingInfoNotConnected(handle);
3524}
3525
[email protected]dcbe168a2010-12-02 03:14:463526// http://crbug.com/64940 regression test.
3527TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3528 const int kMaxTotalSockets = 3;
3529 const int kMaxSocketsPerGroup = 2;
3530 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3531 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3532
3533 // Note that group name ordering matters here. "a" comes before "b", so
3534 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3535
3536 // Set up one idle socket in "a".
3537 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523538 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203539 EXPECT_EQ(
3540 ERR_IO_PENDING,
3541 handle1.Init("a", params_, DEFAULT_PRIORITY,
3542 ClientSocketPool::RespectLimits::ENABLED,
3543 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463544
robpercival214763f2016-07-01 23:27:013545 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463546 handle1.Reset();
3547 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3548
3549 // Set up two active sockets in "b".
3550 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523551 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203552 EXPECT_EQ(
3553 ERR_IO_PENDING,
3554 handle1.Init("b", params_, DEFAULT_PRIORITY,
3555 ClientSocketPool::RespectLimits::ENABLED,
3556 callback1.callback(), pool_.get(), NetLogWithSource()));
3557 EXPECT_EQ(
3558 ERR_IO_PENDING,
3559 handle2.Init("b", params_, DEFAULT_PRIORITY,
3560 ClientSocketPool::RespectLimits::ENABLED,
3561 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463562
robpercival214763f2016-07-01 23:27:013563 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3564 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463565 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103566 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463567 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3568
3569 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3570 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3571 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3572 // sockets for "a", and "b" should still have 2 active sockets.
3573
Alexandr Ilin65ec9582017-10-02 14:50:313574 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3575 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]dcbe168a2010-12-02 03:14:463576 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103577 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463578 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3579 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3580 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103581 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463582 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3583 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3584
3585 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3586 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3587 // "a" should result in closing 1 for "b".
3588 handle1.Reset();
3589 handle2.Reset();
3590 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3591 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3592
Alexandr Ilin65ec9582017-10-02 14:50:313593 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3594 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]dcbe168a2010-12-02 03:14:463595 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103596 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463597 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3598 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3599 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103600 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463601 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3602 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3603}
3604
[email protected]b7b8be42011-07-12 12:46:413605TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073606 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3607 pool_->EnableConnectBackupJobs();
3608
3609 // Make the ConnectJob hang until it times out, shorten the timeout.
3610 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3611 connect_job_factory_->set_timeout_duration(
3612 base::TimeDelta::FromMilliseconds(500));
Alexandr Ilin65ec9582017-10-02 14:50:313613 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3614 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]a9fc8fc2011-05-10 02:41:073615 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103616 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073617 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073618
[email protected]b7b8be42011-07-12 12:46:413619 // Verify the backup timer doesn't create a backup job, by making
3620 // the backup job a pending job instead of a waiting job, so it
3621 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073622 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453623 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173624 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343625 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283626 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073627 EXPECT_FALSE(pool_->HasGroup("a"));
3628}
3629
[email protected]b7b8be42011-07-12 12:46:413630TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073631 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3632 pool_->EnableConnectBackupJobs();
3633
3634 // Make the ConnectJob hang forever.
3635 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Alexandr Ilin65ec9582017-10-02 14:50:313636 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3637 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]a9fc8fc2011-05-10 02:41:073638 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103639 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073640 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283641 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073642
3643 // Make the backup job be a pending job, so it completes normally.
3644 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3645 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523646 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153647 EXPECT_EQ(ERR_IO_PENDING,
3648 handle.Init("a", params_, DEFAULT_PRIORITY,
3649 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203650 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413651 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073652 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103653 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073654 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3655 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013656 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073657
3658 // The hung connect job should still be there, but everything else should be
3659 // complete.
3660 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103661 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073662 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3663 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3664}
3665
[email protected]0dc88b32014-03-26 20:12:283666// Tests that a preconnect that starts out with unread data can still be used.
3667// http://crbug.com/334467
3668TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3669 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3670 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3671
Alexandr Ilin65ec9582017-10-02 14:50:313672 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3673 HttpRequestInfo::NORMAL_MOTIVATION);
[email protected]0dc88b32014-03-26 20:12:283674
3675 ASSERT_TRUE(pool_->HasGroup("a"));
3676 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3677 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3678 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3679
3680 // Fail future jobs to be sure that handle receives the preconnected socket
3681 // rather than closing it and making a new one.
3682 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3683 ClientSocketHandle handle;
3684 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203685 EXPECT_EQ(OK,
3686 handle.Init("a", params_, DEFAULT_PRIORITY,
3687 ClientSocketPool::RespectLimits::ENABLED,
3688 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283689
3690 ASSERT_TRUE(pool_->HasGroup("a"));
3691 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3692 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3693 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3694
3695 // Drain the pending read.
3696 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3697
3698 TestLoadTimingInfoConnectedReused(handle);
3699 handle.Reset();
3700
3701 // The socket should be usable now that it's idle again.
3702 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3703}
3704
Alexandr Ilin65ec9582017-10-02 14:50:313705// Tests that a socket pool correctly sets a motivation for a preconnected
3706// socket.
3707TEST_F(ClientSocketPoolBaseTest, PreconnectSetsMotivation) {
3708 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3709 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3710
3711 for (auto motivation : {HttpRequestInfo::NORMAL_MOTIVATION,
3712 HttpRequestInfo::PRECONNECT_MOTIVATED,
3713 HttpRequestInfo::OMNIBOX_MOTIVATED}) {
3714 SCOPED_TRACE(::testing::Message() << "motivation: " << motivation);
3715 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(), motivation);
3716
3717 ClientSocketHandle handle;
3718 TestCompletionCallback callback;
3719 EXPECT_EQ(
3720 ERR_IO_PENDING,
3721 handle.Init("a", params_, DEFAULT_PRIORITY,
3722 ClientSocketPool::RespectLimits::ENABLED,
3723 callback.callback(), pool_.get(), NetLogWithSource()));
3724
3725 EXPECT_THAT(callback.WaitForResult(), IsOk());
3726 EXPECT_TRUE(handle.is_initialized());
3727 ASSERT_TRUE(handle.socket());
3728 EXPECT_EQ(motivation,
3729 static_cast<MockClientSocket*>(handle.socket())->motivation());
3730 handle.socket()->Disconnect();
3731 handle.Reset();
3732 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3733 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3734 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3735 }
3736}
3737
3738// Tests that a socket pool doesn't change motivation on existing sockets.
3739TEST_F(ClientSocketPoolBaseTest, PreconnectPreservesExistingMotivation) {
3740 CreatePool(3, 3);
3741 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3742
3743 // We should get one socket of each motivation.
3744 pool_->RequestSockets("a", &params_, 1, NetLogWithSource(),
3745 HttpRequestInfo::NORMAL_MOTIVATION);
3746 pool_->RequestSockets("a", &params_, 2, NetLogWithSource(),
3747 HttpRequestInfo::PRECONNECT_MOTIVATED);
3748 pool_->RequestSockets("a", &params_, 3, NetLogWithSource(),
3749 HttpRequestInfo::OMNIBOX_MOTIVATED);
3750
3751 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3752 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
3753 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3754
3755 std::vector<ClientSocketHandle> handles(3);
3756 std::vector<TestCompletionCallback> callbacks(3);
3757
3758 for (size_t i = 0; i < 3; ++i) {
3759 EXPECT_EQ(ERR_IO_PENDING,
3760 handles[i].Init("a", params_, DEFAULT_PRIORITY,
3761 ClientSocketPool::RespectLimits::ENABLED,
3762 callbacks[i].callback(), pool_.get(),
3763 NetLogWithSource()));
3764 }
3765
3766 for (size_t i = 0; i < 3; ++i) {
3767 EXPECT_THAT(callbacks[i].WaitForResult(), IsOk());
3768 EXPECT_TRUE(handles[i].is_initialized());
3769 EXPECT_TRUE(handles[i].socket());
3770 }
3771
3772 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3773 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3774 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3775 EXPECT_EQ(3, pool_->NumActiveSocketsInGroup("a"));
3776
3777 EXPECT_EQ(HttpRequestInfo::NORMAL_MOTIVATION,
3778 static_cast<MockClientSocket*>(handles[0].socket())->motivation());
3779 EXPECT_EQ(HttpRequestInfo::PRECONNECT_MOTIVATED,
3780 static_cast<MockClientSocket*>(handles[1].socket())->motivation());
3781 EXPECT_EQ(HttpRequestInfo::OMNIBOX_MOTIVATED,
3782 static_cast<MockClientSocket*>(handles[2].socket())->motivation());
3783}
3784
[email protected]043b68c82013-08-22 23:41:523785class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203786 public:
3787 MockLayeredPool(TestClientSocketPool* pool,
3788 const std::string& group_name)
3789 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203790 group_name_(group_name),
3791 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523792 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203793 }
3794
3795 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523796 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203797 }
3798
3799 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153800 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073801 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:153802 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203803 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203804 }
3805
3806 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153807 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073808 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:153809 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203810 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203811 }
3812
3813 bool ReleaseOneConnection() {
3814 if (!handle_.is_initialized() || !can_release_connection_) {
3815 return false;
3816 }
3817 handle_.socket()->Disconnect();
3818 handle_.Reset();
3819 return true;
3820 }
3821
3822 void set_can_release_connection(bool can_release_connection) {
3823 can_release_connection_ = can_release_connection;
3824 }
3825
3826 MOCK_METHOD0(CloseOneIdleConnection, bool());
3827
3828 private:
3829 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203830 ClientSocketHandle handle_;
3831 TestCompletionCallback callback_;
3832 const std::string group_name_;
3833 bool can_release_connection_;
3834};
3835
3836TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3837 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3838 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3839
3840 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013841 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203842 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3843 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523844 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203845}
3846
3847TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
[email protected]58e562f2013-04-22 17:32:203848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3849 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3850
3851 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013852 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203853 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3854 .WillOnce(Invoke(&mock_layered_pool,
3855 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523856 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203857}
3858
3859// Tests the basic case of closing an idle socket in a higher layered pool when
3860// a new request is issued and the lower layer pool is stalled.
3861TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3862 CreatePool(1, 1);
3863 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3864
3865 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013866 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203867 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3868 .WillOnce(Invoke(&mock_layered_pool,
3869 &MockLayeredPool::ReleaseOneConnection));
3870 ClientSocketHandle handle;
3871 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153872 EXPECT_EQ(ERR_IO_PENDING,
3873 handle.Init("a", params_, DEFAULT_PRIORITY,
3874 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203875 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013876 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203877}
3878
3879// Same as above, but the idle socket is in the same group as the stalled
3880// socket, and closes the only other request in its group when closing requests
3881// in higher layered pools. This generally shouldn't happen, but it may be
3882// possible if a higher level pool issues a request and the request is
3883// subsequently cancelled. Even if it's not possible, best not to crash.
3884TEST_F(ClientSocketPoolBaseTest,
3885 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3886 CreatePool(2, 2);
3887 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3888
3889 // Need a socket in another group for the pool to be stalled (If a group
3890 // has the maximum number of connections already, it's not stalled).
3891 ClientSocketHandle handle1;
3892 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203893 EXPECT_EQ(
3894 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3895 ClientSocketPool::RespectLimits::ENABLED,
3896 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203897
3898 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013899 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203900 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3901 .WillOnce(Invoke(&mock_layered_pool,
3902 &MockLayeredPool::ReleaseOneConnection));
3903 ClientSocketHandle handle;
3904 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153905 EXPECT_EQ(ERR_IO_PENDING,
3906 handle.Init("group2", params_, DEFAULT_PRIORITY,
3907 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203908 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013909 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203910}
3911
3912// Tests the case when an idle socket can be closed when a new request is
3913// issued, and the new request belongs to a group that was previously stalled.
3914TEST_F(ClientSocketPoolBaseTest,
3915 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3916 CreatePool(2, 2);
3917 std::list<TestConnectJob::JobType> job_types;
3918 job_types.push_back(TestConnectJob::kMockJob);
3919 job_types.push_back(TestConnectJob::kMockJob);
3920 job_types.push_back(TestConnectJob::kMockJob);
3921 job_types.push_back(TestConnectJob::kMockJob);
3922 connect_job_factory_->set_job_types(&job_types);
3923
3924 ClientSocketHandle handle1;
3925 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203926 EXPECT_EQ(
3927 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3928 ClientSocketPool::RespectLimits::ENABLED,
3929 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203930
3931 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013932 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203933 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3934 .WillRepeatedly(Invoke(&mock_layered_pool,
3935 &MockLayeredPool::ReleaseOneConnection));
3936 mock_layered_pool.set_can_release_connection(false);
3937
3938 // The third request is made when the socket pool is in a stalled state.
3939 ClientSocketHandle handle3;
3940 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203941 EXPECT_EQ(
3942 ERR_IO_PENDING,
3943 handle3.Init("group3", params_, DEFAULT_PRIORITY,
3944 ClientSocketPool::RespectLimits::ENABLED,
3945 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203946
3947 base::RunLoop().RunUntilIdle();
3948 EXPECT_FALSE(callback3.have_result());
3949
3950 // The fourth request is made when the pool is no longer stalled. The third
3951 // request should be serviced first, since it was issued first and has the
3952 // same priority.
3953 mock_layered_pool.set_can_release_connection(true);
3954 ClientSocketHandle handle4;
3955 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203956 EXPECT_EQ(
3957 ERR_IO_PENDING,
3958 handle4.Init("group3", params_, DEFAULT_PRIORITY,
3959 ClientSocketPool::RespectLimits::ENABLED,
3960 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013961 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203962 EXPECT_FALSE(callback4.have_result());
3963
3964 // Closing a handle should free up another socket slot.
3965 handle1.Reset();
robpercival214763f2016-07-01 23:27:013966 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203967}
3968
3969// Tests the case when an idle socket can be closed when a new request is
3970// issued, and the new request belongs to a group that was previously stalled.
3971//
3972// The two differences from the above test are that the stalled requests are not
3973// in the same group as the layered pool's request, and the the fourth request
3974// has a higher priority than the third one, so gets a socket first.
3975TEST_F(ClientSocketPoolBaseTest,
3976 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3977 CreatePool(2, 2);
3978 std::list<TestConnectJob::JobType> job_types;
3979 job_types.push_back(TestConnectJob::kMockJob);
3980 job_types.push_back(TestConnectJob::kMockJob);
3981 job_types.push_back(TestConnectJob::kMockJob);
3982 job_types.push_back(TestConnectJob::kMockJob);
3983 connect_job_factory_->set_job_types(&job_types);
3984
3985 ClientSocketHandle handle1;
3986 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203987 EXPECT_EQ(
3988 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3989 ClientSocketPool::RespectLimits::ENABLED,
3990 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203991
3992 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013993 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203994 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3995 .WillRepeatedly(Invoke(&mock_layered_pool,
3996 &MockLayeredPool::ReleaseOneConnection));
3997 mock_layered_pool.set_can_release_connection(false);
3998
3999 // The third request is made when the socket pool is in a stalled state.
4000 ClientSocketHandle handle3;
4001 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204002 EXPECT_EQ(
4003 ERR_IO_PENDING,
4004 handle3.Init("group3", params_, MEDIUM,
4005 ClientSocketPool::RespectLimits::ENABLED,
4006 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204007
4008 base::RunLoop().RunUntilIdle();
4009 EXPECT_FALSE(callback3.have_result());
4010
4011 // The fourth request is made when the pool is no longer stalled. This
4012 // request has a higher priority than the third request, so is serviced first.
4013 mock_layered_pool.set_can_release_connection(true);
4014 ClientSocketHandle handle4;
4015 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204016 EXPECT_EQ(
4017 ERR_IO_PENDING,
4018 handle4.Init("group3", params_, HIGHEST,
4019 ClientSocketPool::RespectLimits::ENABLED,
4020 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014021 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204022 EXPECT_FALSE(callback3.have_result());
4023
4024 // Closing a handle should free up another socket slot.
4025 handle1.Reset();
robpercival214763f2016-07-01 23:27:014026 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204027}
4028
4029TEST_F(ClientSocketPoolBaseTest,
4030 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4031 CreatePool(1, 1);
4032 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4033
4034 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014035 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204036 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4037 .WillRepeatedly(Invoke(&mock_layered_pool1,
4038 &MockLayeredPool::ReleaseOneConnection));
4039 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014040 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4041 IsOk());
[email protected]58e562f2013-04-22 17:32:204042 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4043 .WillRepeatedly(Invoke(&mock_layered_pool2,
4044 &MockLayeredPool::ReleaseOneConnection));
4045 ClientSocketHandle handle;
4046 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154047 EXPECT_EQ(ERR_IO_PENDING,
4048 handle.Init("a", params_, DEFAULT_PRIORITY,
4049 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204050 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014051 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204052}
4053
[email protected]b021ece62013-06-11 11:06:334054// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154055// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4056// socket instead of a request with the same priority that was issued earlier,
4057// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334058TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334059 CreatePool(1, 1);
4060
4061 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154062 EXPECT_EQ(
4063 OK, StartRequestWithIgnoreLimits(
4064 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334065 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4066
4067 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4068
mmenked3641e12016-01-28 16:06:154069 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4070 "a", MAXIMUM_PRIORITY,
4071 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334072 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4073
mmenked3641e12016-01-28 16:06:154074 // Issue a request that ignores the limits, so a new ConnectJob is
4075 // created.
4076 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4077 "a", MAXIMUM_PRIORITY,
4078 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334079 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4080
robpercival214763f2016-07-01 23:27:014081 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334082 EXPECT_FALSE(request(1)->have_result());
4083}
4084
[email protected]c55fabd2013-11-04 23:26:564085// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154086// issued for a request with RespectLimits::DISABLED is not cancelled when a
4087// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564088TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564089 CreatePool(1, 1);
4090
4091 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154092 EXPECT_EQ(
4093 OK, StartRequestWithIgnoreLimits(
4094 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564095 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4096
4097 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4098
mmenked3641e12016-01-28 16:06:154099 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4100 "a", MAXIMUM_PRIORITY,
4101 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564102 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4103
mmenked3641e12016-01-28 16:06:154104 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4105 // created.
4106 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4107 "a", MAXIMUM_PRIORITY,
4108 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334109 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4110
mmenked3641e12016-01-28 16:06:154111 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334112 // should not be cancelled.
4113 request(1)->handle()->Reset();
4114 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4115
robpercival214763f2016-07-01 23:27:014116 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334117 EXPECT_FALSE(request(1)->have_result());
4118}
4119
[email protected]f6d1d6eb2009-06-24 20:16:094120} // namespace
4121
4122} // namespace net