blob: cd48a1e446c286dd8739f68808961147b8eedf3d [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"
18#include "base/memory/scoped_vector.h"
[email protected]6ea7b152011-12-21 21:21:1319#include "base/memory/weak_ptr.h"
[email protected]18b577412013-07-18 04:19:1520#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4821#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4522#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5123#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1524#include "base/strings/stringprintf.h"
xunjieli26619e72016-11-23 19:39:5525#include "base/test/histogram_tester.h"
[email protected]f214f8792011-01-01 02:17:0826#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3527#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0328#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4829#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5930#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0631#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3132#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0933#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3534#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0735#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0036#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1937#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0038#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5639#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4640#include "net/log/test_net_log_entry.h"
41#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0942#include "net/socket/client_socket_factory.h"
43#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2644#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2845#include "net/socket/socket_performance_watcher.h"
[email protected]75439d3b2009-07-23 22:11:1746#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4447#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1048#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0149#include "net/test/gtest_util.h"
[email protected]51fdc7c2012-04-10 19:19:4850#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0951#include "testing/gtest/include/gtest/gtest.h"
52
robpercival214763f2016-07-01 23:27:0153using net::test::IsError;
54using net::test::IsOk;
55
[email protected]51fdc7c2012-04-10 19:19:4856using ::testing::Invoke;
57using ::testing::Return;
58
[email protected]f6d1d6eb2009-06-24 20:16:0959namespace net {
60
61namespace {
62
[email protected]211d21722009-07-22 15:48:5363const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2064const int kDefaultMaxSocketsPerGroup = 2;
xunjieli26619e72016-11-23 19:39:5565const char kIdleSocketFateHistogram[] = "Net.Socket.IdleSocketFate";
[email protected]0b7648c2009-07-06 20:14:0166
[email protected]034df0f32013-01-07 23:17:4867// Make sure |handle| sets load times correctly when it has been assigned a
68// reused socket.
69void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
70 LoadTimingInfo load_timing_info;
71 // Only pass true in as |is_reused|, as in general, HttpStream types should
72 // have stricter concepts of reuse than socket pools.
73 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
74
75 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1976 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4877
[email protected]b258e0792013-01-12 07:11:5978 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
79 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4880}
81
82// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3383// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4884// of a connection where |is_reused| is false may consider the connection
85// reused.
86void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
87 EXPECT_FALSE(handle.is_reused());
88
89 LoadTimingInfo load_timing_info;
90 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
91
92 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1993 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4894
[email protected]b258e0792013-01-12 07:11:5995 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
96 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
97 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4898
99 TestLoadTimingInfoConnectedReused(handle);
100}
101
102// Make sure |handle| sets load times correctly, in the case that it does not
103// currently have a socket.
104void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
105 // Should only be set to true once a socket is assigned, if at all.
106 EXPECT_FALSE(handle.is_reused());
107
108 LoadTimingInfo load_timing_info;
109 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
110
111 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19112 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48113
[email protected]b258e0792013-01-12 07:11:59114 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
115 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48116}
117
[email protected]df4b4ef2010-07-12 18:25:21118class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20119 public:
mmenked3641e12016-01-28 16:06:15120 explicit TestSocketParams() {}
[email protected]51fdc7c2012-04-10 19:19:48121
[email protected]df4b4ef2010-07-12 18:25:21122 private:
123 friend class base::RefCounted<TestSocketParams>;
124 ~TestSocketParams() {}
125};
[email protected]7fc5b09a2010-02-27 00:07:38126typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49127
[email protected]3268023f2011-05-05 00:08:10128class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09129 public:
[email protected]034df0f32013-01-07 23:17:48130 explicit MockClientSocket(net::NetLog* net_log)
131 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28132 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20133 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
ttuttle859dc7a2015-04-23 19:42:29134 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09135
[email protected]0dc88b32014-03-26 20:12:28136 // Sets whether the socket has unread data. If true, the next call to Read()
137 // will return 1 byte and IsConnectedAndIdle() will return false.
138 void set_has_unread_data(bool has_unread_data) {
139 has_unread_data_ = has_unread_data;
140 }
141
[email protected]3f55aa12011-12-07 02:03:33142 // Socket implementation.
dchengb03027d2014-10-21 12:00:20143 int Read(IOBuffer* /* buf */,
144 int len,
145 const CompletionCallback& /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28146 if (has_unread_data_ && len > 0) {
147 has_unread_data_ = false;
148 was_used_to_convey_data_ = true;
149 return 1;
150 }
[email protected]e86df8dc2013-03-30 13:18:28151 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33152 }
[email protected]ab838892009-06-30 18:49:05153
dchengb03027d2014-10-21 12:00:20154 int Write(IOBuffer* /* buf */,
155 int len,
156 const CompletionCallback& /* callback */) override {
[email protected]0f873e82010-09-02 16:09:01157 was_used_to_convey_data_ = true;
158 return len;
[email protected]ab838892009-06-30 18:49:05159 }
Avi Drissman13fc8932015-12-20 04:40:46160 int SetReceiveBufferSize(int32_t size) override { return OK; }
161 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05162
[email protected]dbf036f2011-12-06 23:33:24163 // StreamSocket implementation.
dchengb03027d2014-10-21 12:00:20164 int Connect(const CompletionCallback& callback) override {
[email protected]dbf036f2011-12-06 23:33:24165 connected_ = true;
166 return OK;
167 }
[email protected]f6d1d6eb2009-06-24 20:16:09168
dchengb03027d2014-10-21 12:00:20169 void Disconnect() override { connected_ = false; }
170 bool IsConnected() const override { return connected_; }
171 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28172 return connected_ && !has_unread_data_;
173 }
[email protected]0b7648c2009-07-06 20:14:01174
dchengb03027d2014-10-21 12:00:20175 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16176 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09177 }
[email protected]f6d1d6eb2009-06-24 20:16:09178
dchengb03027d2014-10-21 12:00:20179 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35180 return ERR_UNEXPECTED;
181 }
182
tfarina428341112016-09-22 13:38:20183 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02184
dchengb03027d2014-10-21 12:00:20185 void SetSubresourceSpeculation() override {}
186 void SetOmniboxSpeculation() override {}
187 bool WasEverUsed() const override { return was_used_to_convey_data_; }
dchengb03027d2014-10-21 12:00:20188 bool WasNpnNegotiated() const override { return false; }
189 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
190 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03191 void GetConnectionAttempts(ConnectionAttempts* out) const override {
192 out->clear();
193 }
194 void ClearConnectionAttempts() override {}
195 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49196 int64_t GetTotalReceivedBytes() const override {
197 NOTIMPLEMENTED();
198 return 0;
199 }
[email protected]9b5614a2010-08-25 20:29:45200
[email protected]f6d1d6eb2009-06-24 20:16:09201 private:
202 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28203 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20204 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01205 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09206
[email protected]ab838892009-06-30 18:49:05207 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09208};
209
[email protected]5fc08e32009-07-15 17:09:57210class TestConnectJob;
211
[email protected]f6d1d6eb2009-06-24 20:16:09212class MockClientSocketFactory : public ClientSocketFactory {
213 public:
[email protected]ab838892009-06-30 18:49:05214 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09215
danakj655b66c2016-04-16 00:51:38216 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04217 DatagramSocket::BindType bind_type,
218 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41219 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19220 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41221 NOTREACHED();
danakj655b66c2016-04-16 00:51:38222 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41223 }
224
danakj655b66c2016-04-16 00:51:38225 std::unique_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07226 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38227 std::unique_ptr<
228 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07229 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19230 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09231 allocation_count_++;
danakj655b66c2016-04-16 00:51:38232 return std::unique_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09233 }
234
danakj655b66c2016-04-16 00:51:38235 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
236 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27237 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21238 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13239 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09240 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38241 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09242 }
243
dchengb03027d2014-10-21 12:00:20244 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59245
[email protected]5fc08e32009-07-15 17:09:57246 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55247
[email protected]5fc08e32009-07-15 17:09:57248 void SignalJobs();
249
[email protected]03b7c8c2013-07-20 04:38:55250 void SignalJob(size_t job);
251
252 void SetJobLoadState(size_t job, LoadState load_state);
253
[email protected]f6d1d6eb2009-06-24 20:16:09254 int allocation_count() const { return allocation_count_; }
255
[email protected]f6d1d6eb2009-06-24 20:16:09256 private:
257 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57258 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09259};
260
[email protected]ab838892009-06-30 18:49:05261class TestConnectJob : public ConnectJob {
262 public:
263 enum JobType {
264 kMockJob,
265 kMockFailingJob,
266 kMockPendingJob,
267 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57268 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13269 kMockRecoverableJob,
270 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18271 kMockAdditionalErrorStateJob,
272 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28273 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05274 };
275
[email protected]994d4932010-07-12 17:55:13276 // The kMockPendingJob uses a slight delay before allowing the connect
277 // to complete.
278 static const int kPendingConnectDelay = 2;
279
[email protected]ab838892009-06-30 18:49:05280 TestConnectJob(JobType job_type,
281 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49282 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34283 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05284 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30285 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17286 NetLog* net_log)
tfarina428341112016-09-22 13:38:20287 : ConnectJob(
288 group_name,
289 timeout_duration,
290 request.priority(),
291 request.respect_limits(),
292 delegate,
davidbenb7048f092016-11-30 21:20:26293 NetLogWithSource::Make(net_log,
294 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58295 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05296 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18297 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39298 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15299 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05300
[email protected]974ebd62009-08-03 23:14:34301 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13302 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34303 }
304
[email protected]03b7c8c2013-07-20 04:38:55305 void set_load_state(LoadState load_state) { load_state_ = load_state; }
306
307 // From ConnectJob:
308
dchengb03027d2014-10-21 12:00:20309 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21310
dchengb03027d2014-10-21 12:00:20311 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18312 if (store_additional_error_state_) {
313 // Set all of the additional error state fields in some way.
314 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43315 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45316 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43317 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18318 }
319 }
320
[email protected]974ebd62009-08-03 23:14:34321 private:
[email protected]03b7c8c2013-07-20 04:38:55322 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05323
dchengb03027d2014-10-21 12:00:20324 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05325 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21326 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19327 NetLogSource());
danakj655b66c2016-04-16 00:51:38328 SetSocket(std::unique_ptr<StreamSocket>(
329 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05330 switch (job_type_) {
331 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13332 return DoConnect(true /* successful */, false /* sync */,
333 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05334 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13335 return DoConnect(false /* error */, false /* sync */,
336 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05337 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57338 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47339
340 // Depending on execution timings, posting a delayed task can result
341 // in the task getting executed the at the earliest possible
342 // opportunity or only after returning once from the message loop and
343 // then a second call into the message loop. In order to make behavior
344 // more deterministic, we change the default delay to 2ms. This should
345 // always require us to wait for the second call into the message loop.
346 //
347 // N.B. The correct fix for this and similar timing problems is to
348 // abstract time for the purpose of unittests. Unfortunately, we have
349 // a lot of third-party components that directly call the various
350 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45351 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05352 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13353 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45354 weak_factory_.GetWeakPtr(), true /* successful */,
355 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53356 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05357 return ERR_IO_PENDING;
358 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57359 set_load_state(LOAD_STATE_CONNECTING);
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(), false /* error */,
364 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53365 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05366 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57367 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55368 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57369 client_socket_factory_->WaitForSignal(this);
370 waiting_success_ = true;
371 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13372 case kMockRecoverableJob:
373 return DoConnect(false /* error */, false /* sync */,
374 true /* recoverable */);
375 case kMockPendingRecoverableJob:
376 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45377 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13378 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13379 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45380 weak_factory_.GetWeakPtr(), false /* error */,
381 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53382 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13383 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18384 case kMockAdditionalErrorStateJob:
385 store_additional_error_state_ = true;
386 return DoConnect(false /* error */, false /* sync */,
387 false /* recoverable */);
388 case kMockPendingAdditionalErrorStateJob:
389 set_load_state(LOAD_STATE_CONNECTING);
390 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45391 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18392 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13393 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45394 weak_factory_.GetWeakPtr(), false /* error */,
395 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53396 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18397 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28398 case kMockUnreadDataJob: {
399 int ret = DoConnect(true /* successful */, false /* sync */,
400 false /* recoverable */);
401 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
402 return ret;
403 }
[email protected]ab838892009-06-30 18:49:05404 default:
405 NOTREACHED();
danakj655b66c2016-04-16 00:51:38406 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05407 return ERR_FAILED;
408 }
409 }
410
[email protected]e772db3f2010-07-12 18:11:13411 int DoConnect(bool succeed, bool was_async, bool recoverable) {
412 int result = OK;
[email protected]ab838892009-06-30 18:49:05413 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55414 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13415 } else if (recoverable) {
416 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40417 } else {
[email protected]e772db3f2010-07-12 18:11:13418 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38419 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05420 }
[email protected]2ab05b52009-07-01 23:57:58421
422 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30423 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05424 return result;
425 }
426
[email protected]5fc08e32009-07-15 17:09:57427 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05428 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57429 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21430 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18431 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05432
[email protected]d5492c52013-11-10 20:44:39433 base::WeakPtrFactory<TestConnectJob> weak_factory_;
434
[email protected]ab838892009-06-30 18:49:05435 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
436};
437
[email protected]d80a4322009-08-14 07:07:49438class TestConnectJobFactory
439 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05440 public:
[email protected]034df0f32013-01-07 23:17:48441 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
442 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05443 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48444 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48445 client_socket_factory_(client_socket_factory),
446 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33447 }
[email protected]ab838892009-06-30 18:49:05448
dchengb03027d2014-10-21 12:00:20449 ~TestConnectJobFactory() override {}
[email protected]ab838892009-06-30 18:49:05450
451 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
452
[email protected]51fdc7c2012-04-10 19:19:48453 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
454 job_types_ = job_types;
455 CHECK(!job_types_->empty());
456 }
457
[email protected]974ebd62009-08-03 23:14:34458 void set_timeout_duration(base::TimeDelta timeout_duration) {
459 timeout_duration_ = timeout_duration;
460 }
461
[email protected]3f55aa12011-12-07 02:03:33462 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55463
danakj655b66c2016-04-16 00:51:38464 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05465 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49466 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13467 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48468 EXPECT_TRUE(!job_types_ || !job_types_->empty());
469 TestConnectJob::JobType job_type = job_type_;
470 if (job_types_ && !job_types_->empty()) {
471 job_type = job_types_->front();
472 job_types_->pop_front();
473 }
danakj655b66c2016-04-16 00:51:38474 return std::unique_ptr<ConnectJob>(
475 new TestConnectJob(job_type, group_name, request, timeout_duration_,
476 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05477 }
478
dchengb03027d2014-10-21 12:00:20479 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26480 return timeout_duration_;
481 }
482
[email protected]ab838892009-06-30 18:49:05483 private:
484 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48485 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34486 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57487 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48488 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05489
490 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
491};
492
493class TestClientSocketPool : public ClientSocketPool {
494 public:
[email protected]12322e7e2013-08-15 17:49:26495 typedef TestSocketParams SocketParams;
496
[email protected]ab838892009-06-30 18:49:05497 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53498 int max_sockets,
[email protected]ab838892009-06-30 18:49:05499 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16500 base::TimeDelta unused_idle_socket_timeout,
501 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49502 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41503 : base_(NULL,
504 max_sockets,
505 max_sockets_per_group,
506 unused_idle_socket_timeout,
507 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38508 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05509
dchengb03027d2014-10-21 12:00:20510 ~TestClientSocketPool() override {}
[email protected]2431756e2010-09-29 20:26:13511
dchengb03027d2014-10-21 12:00:20512 int RequestSocket(const std::string& group_name,
513 const void* params,
ttuttle859dc7a2015-04-23 19:42:29514 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15515 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20516 ClientSocketHandle* handle,
517 const CompletionCallback& callback,
tfarina428341112016-09-22 13:38:20518 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21519 const scoped_refptr<TestSocketParams>* casted_socket_params =
520 static_cast<const scoped_refptr<TestSocketParams>*>(params);
521 return base_.RequestSocket(group_name, *casted_socket_params, priority,
mmenked3641e12016-01-28 16:06:15522 respect_limits, handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05523 }
524
dchengb03027d2014-10-21 12:00:20525 void RequestSockets(const std::string& group_name,
526 const void* params,
527 int num_sockets,
tfarina428341112016-09-22 13:38:20528 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03529 const scoped_refptr<TestSocketParams>* casted_params =
530 static_cast<const scoped_refptr<TestSocketParams>*>(params);
531
532 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
533 }
534
dchengb03027d2014-10-21 12:00:20535 void CancelRequest(const std::string& group_name,
536 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49537 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05538 }
539
dchengb03027d2014-10-21 12:00:20540 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38541 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20542 int id) override {
dchengc7eeda422015-12-26 03:56:48543 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24544 }
545
dchengb03027d2014-10-21 12:00:20546 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05547
dchengb03027d2014-10-21 12:00:20548 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48549
dchengb03027d2014-10-21 12:00:20550 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05551
dchengb03027d2014-10-21 12:00:20552 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05553
dchengb03027d2014-10-21 12:00:20554 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49555 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05556 }
557
dchengb03027d2014-10-21 12:00:20558 LoadState GetLoadState(const std::string& group_name,
559 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49560 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05561 }
562
dchengb03027d2014-10-21 12:00:20563 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52564 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48565 }
566
dchengb03027d2014-10-21 12:00:20567 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52568 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48569 }
570
danakj655b66c2016-04-16 00:51:38571 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59572 const std::string& name,
573 const std::string& type,
mostynbba063d6032014-10-09 11:01:13574 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27575 return base_.GetInfoAsValue(name, type);
576 }
577
dchengb03027d2014-10-21 12:00:20578 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26579 return base_.ConnectionTimeout();
580 }
581
[email protected]d80a4322009-08-14 07:07:49582 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20583
[email protected]8159a1c2012-06-07 00:00:10584 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
585 return base_.NumUnassignedConnectJobsInGroup(group_name);
586 }
587
[email protected]974ebd62009-08-03 23:14:34588 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49589 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34590 }
591
[email protected]2c2bef152010-10-13 00:55:03592 int NumActiveSocketsInGroup(const std::string& group_name) const {
593 return base_.NumActiveSocketsInGroup(group_name);
594 }
595
[email protected]2abfe90a2010-08-25 17:49:51596 bool HasGroup(const std::string& group_name) const {
597 return base_.HasGroup(group_name);
598 }
599
[email protected]9bf28db2009-08-29 01:35:16600 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
601
[email protected]06d94042010-08-25 01:45:22602 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54603
[email protected]043b68c82013-08-22 23:41:52604 bool CloseOneIdleConnectionInHigherLayeredPool() {
605 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48606 }
607
[email protected]ab838892009-06-30 18:49:05608 private:
[email protected]d80a4322009-08-14 07:07:49609 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05610
611 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
612};
613
[email protected]a937a06d2009-08-19 21:19:24614} // namespace
615
[email protected]a937a06d2009-08-19 21:19:24616namespace {
617
[email protected]5fc08e32009-07-15 17:09:57618void MockClientSocketFactory::SignalJobs() {
619 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
620 it != waiting_jobs_.end(); ++it) {
621 (*it)->Signal();
622 }
623 waiting_jobs_.clear();
624}
625
[email protected]03b7c8c2013-07-20 04:38:55626void MockClientSocketFactory::SignalJob(size_t job) {
627 ASSERT_LT(job, waiting_jobs_.size());
628 waiting_jobs_[job]->Signal();
629 waiting_jobs_.erase(waiting_jobs_.begin() + job);
630}
631
632void MockClientSocketFactory::SetJobLoadState(size_t job,
633 LoadState load_state) {
634 ASSERT_LT(job, waiting_jobs_.size());
635 waiting_jobs_[job]->set_load_state(load_state);
636}
637
[email protected]974ebd62009-08-03 23:14:34638class TestConnectJobDelegate : public ConnectJob::Delegate {
639 public:
640 TestConnectJobDelegate()
641 : have_result_(false), waiting_for_result_(false), result_(OK) {}
dchengb03027d2014-10-21 12:00:20642 ~TestConnectJobDelegate() override {}
[email protected]974ebd62009-08-03 23:14:34643
dchengb03027d2014-10-21 12:00:20644 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34645 result_ = result;
danakj655b66c2016-04-16 00:51:38646 std::unique_ptr<ConnectJob> owned_job(job);
647 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07648 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44649 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34650 have_result_ = true;
651 if (waiting_for_result_)
ki.stfu375812e2015-10-09 20:23:17652 base::MessageLoop::current()->QuitWhenIdle();
[email protected]974ebd62009-08-03 23:14:34653 }
654
655 int WaitForResult() {
656 DCHECK(!waiting_for_result_);
657 while (!have_result_) {
658 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28659 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34660 waiting_for_result_ = false;
661 }
662 have_result_ = false; // auto-reset for next callback
663 return result_;
664 }
665
666 private:
667 bool have_result_;
668 bool waiting_for_result_;
669 int result_;
670};
671
[email protected]2431756e2010-09-29 20:26:13672class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09673 protected:
mmenked3641e12016-01-28 16:06:15674 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54675 connect_backup_jobs_enabled_ =
676 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
677 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
678 }
[email protected]2431756e2010-09-29 20:26:13679
dcheng67be2b1f2014-10-27 21:47:29680 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54681 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
682 connect_backup_jobs_enabled_);
683 }
[email protected]c9d6a1d2009-07-14 16:15:20684
[email protected]211d21722009-07-22 15:48:53685 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16686 CreatePoolWithIdleTimeouts(
687 max_sockets,
688 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30689 ClientSocketPool::unused_idle_socket_timeout(),
690 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16691 }
692
693 void CreatePoolWithIdleTimeouts(
694 int max_sockets, int max_sockets_per_group,
695 base::TimeDelta unused_idle_socket_timeout,
696 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20697 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48698 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
699 &net_log_);
[email protected]2431756e2010-09-29 20:26:13700 pool_.reset(new TestClientSocketPool(max_sockets,
701 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13702 unused_idle_socket_timeout,
703 used_idle_socket_timeout,
704 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20705 }
[email protected]f6d1d6eb2009-06-24 20:16:09706
mmenked3641e12016-01-28 16:06:15707 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33708 const std::string& group_name,
709 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15710 ClientSocketPool::RespectLimits respect_limits) {
711 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
712 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33713 }
714
715 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15716 return StartRequestWithIgnoreLimits(
717 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09718 }
719
[email protected]2431756e2010-09-29 20:26:13720 int GetOrderOfRequest(size_t index) const {
721 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09722 }
723
[email protected]2431756e2010-09-29 20:26:13724 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
725 return test_base_.ReleaseOneConnection(keep_alive);
726 }
727
728 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
729 test_base_.ReleaseAllConnections(keep_alive);
730 }
731
732 TestSocketRequest* request(int i) { return test_base_.request(i); }
733 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38734 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42735 return test_base_.requests();
736 }
[email protected]2431756e2010-09-29 20:26:13737 size_t completion_count() const { return test_base_.completion_count(); }
738
vishal.b62985ca92015-04-17 08:45:51739 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54740 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09741 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04742 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21743 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38744 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13745 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09746};
747
[email protected]974ebd62009-08-03 23:14:34748// Even though a timeout is specified, it doesn't time out on a synchronous
749// completion.
750TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
751 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06752 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49753 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07754 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15755 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20756 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
757 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38758 std::unique_ptr<TestConnectJob> job(
759 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
760 base::TimeDelta::FromMicroseconds(1), &delegate,
761 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01762 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34763}
764
765TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
766 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06767 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51768 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53769
[email protected]d80a4322009-08-14 07:07:49770 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07771 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15772 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20773 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
774 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34775 // Deleted by TestConnectJobDelegate.
776 TestConnectJob* job =
777 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12778 "a",
[email protected]974ebd62009-08-03 23:14:34779 request,
780 base::TimeDelta::FromMicroseconds(1),
781 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30782 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17783 &log);
robpercival214763f2016-07-01 23:27:01784 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00785 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01786 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30787
mmenke43758e62015-05-04 21:09:46788 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40789 log.GetEntries(&entries);
790
791 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00792 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
793 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46794 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00795 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
796 EXPECT_TRUE(LogContainsEvent(entries, 2,
797 NetLogEventType::CONNECT_JOB_SET_SOCKET,
798 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46799 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00800 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
801 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46802 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00803 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
804 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
805 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34806}
807
[email protected]5fc08e32009-07-15 17:09:57808TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53809 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20810
[email protected]6ecf2b92011-12-15 01:14:52811 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06812 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51813 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48814 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53815
mmenked3641e12016-01-28 16:06:15816 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
817 ClientSocketPool::RespectLimits::ENABLED,
818 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09819 EXPECT_TRUE(handle.is_initialized());
820 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48821 TestLoadTimingInfoConnectedNotReused(handle);
822
[email protected]f6d1d6eb2009-06-24 20:16:09823 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48824 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30825
mmenke43758e62015-05-04 21:09:46826 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40827 log.GetEntries(&entries);
828
829 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00830 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53831 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00832 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
833 NetLogEventPhase::NONE));
834 EXPECT_TRUE(LogContainsEvent(entries, 2,
835 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
836 NetLogEventPhase::NONE));
837 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09838}
839
[email protected]ab838892009-06-30 18:49:05840TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53841 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20842
[email protected]ab838892009-06-30 18:49:05843 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51844 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53845
[email protected]2431756e2010-09-29 20:26:13846 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52847 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18848 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13849 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43850 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45851 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13852 handle.set_ssl_error_response_info(info);
853 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:15854 handle.Init("a", params_, DEFAULT_PRIORITY,
855 ClientSocketPool::RespectLimits::ENABLED,
856 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13857 EXPECT_FALSE(handle.socket());
858 EXPECT_FALSE(handle.is_ssl_error());
859 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48860 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30861
mmenke43758e62015-05-04 21:09:46862 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40863 log.GetEntries(&entries);
864
865 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00866 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17867 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00868 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
869 NetLogEventPhase::NONE));
870 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09871}
872
[email protected]211d21722009-07-22 15:48:53873TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
xunjieli26619e72016-11-23 19:39:55874 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53875 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
876
[email protected]9e743cd2010-03-16 07:03:53877 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30878
robpercival214763f2016-07-01 23:27:01879 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
880 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
881 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
882 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53883
[email protected]2431756e2010-09-29 20:26:13884 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53885 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13886 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53887
robpercival214763f2016-07-01 23:27:01888 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
889 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
890 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53891
[email protected]2431756e2010-09-29 20:26:13892 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53893
xunjieli26619e72016-11-23 19:39:55894 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
895 testing::ElementsAre(
896 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 7)));
897
[email protected]2431756e2010-09-29 20:26:13898 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53899 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13900 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53901
902 EXPECT_EQ(1, GetOrderOfRequest(1));
903 EXPECT_EQ(2, GetOrderOfRequest(2));
904 EXPECT_EQ(3, GetOrderOfRequest(3));
905 EXPECT_EQ(4, GetOrderOfRequest(4));
906 EXPECT_EQ(5, GetOrderOfRequest(5));
907 EXPECT_EQ(6, GetOrderOfRequest(6));
908 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17909
910 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13911 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53912}
913
914TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
xunjieli26619e72016-11-23 19:39:55915 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53916 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
917
[email protected]9e743cd2010-03-16 07:03:53918 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30919
[email protected]211d21722009-07-22 15:48:53920 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01921 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
922 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
923 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
924 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53925
[email protected]2431756e2010-09-29 20:26:13926 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53927 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13928 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53929
930 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01931 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53932
[email protected]2431756e2010-09-29 20:26:13933 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:55934 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
935 testing::ElementsAre(
936 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 5)));
[email protected]211d21722009-07-22 15:48:53937
[email protected]2431756e2010-09-29 20:26:13938 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53939 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13940 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53941
942 EXPECT_EQ(1, GetOrderOfRequest(1));
943 EXPECT_EQ(2, GetOrderOfRequest(2));
944 EXPECT_EQ(3, GetOrderOfRequest(3));
945 EXPECT_EQ(4, GetOrderOfRequest(4));
946 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17947
948 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13949 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53950}
951
952TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
xunjieli26619e72016-11-23 19:39:55953 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53954 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
955
robpercival214763f2016-07-01 23:27:01956 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
957 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
958 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
959 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53960
[email protected]2431756e2010-09-29 20:26:13961 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53962 client_socket_factory_.allocation_count());
963
robpercival214763f2016-07-01 23:27:01964 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
965 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
966 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53967
[email protected]2431756e2010-09-29 20:26:13968 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:55969 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
970 testing::ElementsAre(
971 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 7)));
[email protected]211d21722009-07-22 15:48:53972
[email protected]2431756e2010-09-29 20:26:13973 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53974
975 // First 4 requests don't have to wait, and finish in order.
976 EXPECT_EQ(1, GetOrderOfRequest(1));
977 EXPECT_EQ(2, GetOrderOfRequest(2));
978 EXPECT_EQ(3, GetOrderOfRequest(3));
979 EXPECT_EQ(4, GetOrderOfRequest(4));
980
[email protected]ac790b42009-12-02 04:31:31981 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
982 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53983 EXPECT_EQ(7, GetOrderOfRequest(5));
984 EXPECT_EQ(6, GetOrderOfRequest(6));
985 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17986
987 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13988 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53989}
990
991TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
xunjieli26619e72016-11-23 19:39:55992 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53993 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
994
robpercival214763f2016-07-01 23:27:01995 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
996 EXPECT_THAT(StartRequest("a", LOW), IsOk());
997 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
998 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:53999
[email protected]2431756e2010-09-29 20:26:131000 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531001 client_socket_factory_.allocation_count());
1002
robpercival214763f2016-07-01 23:27:011003 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1004 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1005 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531006
[email protected]2431756e2010-09-29 20:26:131007 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551008 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1009 testing::ElementsAre(
1010 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 7)));
[email protected]211d21722009-07-22 15:48:531011
[email protected]2431756e2010-09-29 20:26:131012 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531013 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131014 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531015
1016 // First 4 requests don't have to wait, and finish in order.
1017 EXPECT_EQ(1, GetOrderOfRequest(1));
1018 EXPECT_EQ(2, GetOrderOfRequest(2));
1019 EXPECT_EQ(3, GetOrderOfRequest(3));
1020 EXPECT_EQ(4, GetOrderOfRequest(4));
1021
1022 // Request ("b", 7) has the highest priority, but we can't make new socket for
1023 // group "b", because it has reached the per-group limit. Then we make
1024 // socket for ("c", 6), because it has higher priority than ("a", 4),
1025 // and we still can't make a socket for group "b".
1026 EXPECT_EQ(5, GetOrderOfRequest(5));
1027 EXPECT_EQ(6, GetOrderOfRequest(6));
1028 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171029
1030 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131031 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531032}
1033
1034// Make sure that we count connecting sockets against the total limit.
1035TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
xunjieli26619e72016-11-23 19:39:551036 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531037 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1038
robpercival214763f2016-07-01 23:27:011039 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1040 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1041 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531042
1043 // Create one asynchronous request.
1044 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011045 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531046
[email protected]6b175382009-10-13 06:47:471047 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1048 // actually become pending until 2ms after they have been created. In order
1049 // to flush all tasks, we need to wait so that we know there are no
1050 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001051 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281052 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471053
[email protected]211d21722009-07-22 15:48:531054 // The next synchronous request should wait for its turn.
1055 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011056 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531057
[email protected]2431756e2010-09-29 20:26:131058 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551059 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1060 testing::ElementsAre(
1061 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 5)));
[email protected]211d21722009-07-22 15:48:531062
[email protected]2431756e2010-09-29 20:26:131063 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531064 client_socket_factory_.allocation_count());
1065
1066 EXPECT_EQ(1, GetOrderOfRequest(1));
1067 EXPECT_EQ(2, GetOrderOfRequest(2));
1068 EXPECT_EQ(3, GetOrderOfRequest(3));
1069 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171070 EXPECT_EQ(5, GetOrderOfRequest(5));
1071
1072 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131073 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531074}
1075
[email protected]6427fe22010-04-16 22:27:411076TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
xunjieli26619e72016-11-23 19:39:551077 base::HistogramTester histograms;
[email protected]6427fe22010-04-16 22:27:411078 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1079 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1080
robpercival214763f2016-07-01 23:27:011081 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1082 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1083 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1084 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411085
1086 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1087
1088 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1089
robpercival214763f2016-07-01 23:27:011090 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1091 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411092
1093 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1094
[email protected]2431756e2010-09-29 20:26:131095 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551096 EXPECT_THAT(
1097 histograms.GetAllSamples(kIdleSocketFateHistogram),
1098 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 1)));
[email protected]6427fe22010-04-16 22:27:411099 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131100 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551101 EXPECT_THAT(
1102 histograms.GetAllSamples(kIdleSocketFateHistogram),
1103 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 2)));
[email protected]6427fe22010-04-16 22:27:411104 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131105 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1106 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411107 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
xunjieli26619e72016-11-23 19:39:551108 EXPECT_THAT(
1109 histograms.GetAllSamples(kIdleSocketFateHistogram),
1110 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 2)));
[email protected]6427fe22010-04-16 22:27:411111}
1112
[email protected]d7027bb2010-05-10 18:58:541113TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1114 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1115 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1116
1117 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521118 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131119 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151120 handle.Init("a", params_, DEFAULT_PRIORITY,
1121 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201122 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541123
1124 ClientSocketHandle handles[4];
1125 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521126 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201127 EXPECT_EQ(
1128 ERR_IO_PENDING,
1129 handles[i].Init("b", params_, DEFAULT_PRIORITY,
1130 ClientSocketPool::RespectLimits::ENABLED,
1131 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541132 }
1133
1134 // One will be stalled, cancel all the handles now.
1135 // This should hit the OnAvailableSocketSlot() code where we previously had
1136 // stalled groups, but no longer have any.
1137 for (size_t i = 0; i < arraysize(handles); ++i)
1138 handles[i].Reset();
1139}
1140
[email protected]eb5a99382010-07-11 03:18:261141TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541142 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1143 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1144
[email protected]eb5a99382010-07-11 03:18:261145 {
1146 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521147 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261148 for (int i = 0; i < kDefaultMaxSockets; ++i) {
tfarina428341112016-09-22 13:38:201149 EXPECT_EQ(OK,
1150 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1151 ClientSocketPool::RespectLimits::ENABLED,
1152 callbacks[i].callback(), pool_.get(),
1153 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261154 }
1155
1156 // Force a stalled group.
1157 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521158 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201159 EXPECT_EQ(ERR_IO_PENDING,
1160 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1161 ClientSocketPool::RespectLimits::ENABLED,
1162 callback.callback(), pool_.get(),
1163 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261164
1165 // Cancel the stalled request.
1166 stalled_handle.Reset();
1167
1168 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1169 EXPECT_EQ(0, pool_->IdleSocketCount());
1170
1171 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541172 }
1173
[email protected]43a21b82010-06-10 21:30:541174 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1175 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261176}
[email protected]43a21b82010-06-10 21:30:541177
[email protected]eb5a99382010-07-11 03:18:261178TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1179 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1180 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1181
1182 {
1183 ClientSocketHandle handles[kDefaultMaxSockets];
1184 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521185 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201186 EXPECT_EQ(ERR_IO_PENDING,
1187 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1188 ClientSocketPool::RespectLimits::ENABLED,
1189 callback.callback(), pool_.get(),
1190 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261191 }
1192
1193 // Force a stalled group.
1194 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1195 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521196 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201197 EXPECT_EQ(ERR_IO_PENDING,
1198 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1199 ClientSocketPool::RespectLimits::ENABLED,
1200 callback.callback(), pool_.get(),
1201 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261202
1203 // Since it is stalled, it should have no connect jobs.
1204 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101205 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261206
1207 // Cancel the stalled request.
1208 handles[0].Reset();
1209
[email protected]eb5a99382010-07-11 03:18:261210 // Now we should have a connect job.
1211 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101212 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261213
1214 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011215 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261216
1217 EXPECT_EQ(kDefaultMaxSockets + 1,
1218 client_socket_factory_.allocation_count());
1219 EXPECT_EQ(0, pool_->IdleSocketCount());
1220 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101221 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261222
1223 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541224 }
1225
[email protected]eb5a99382010-07-11 03:18:261226 EXPECT_EQ(1, pool_->IdleSocketCount());
1227}
[email protected]43a21b82010-06-10 21:30:541228
[email protected]eb5a99382010-07-11 03:18:261229TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1230 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1231 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541232
[email protected]eb5a99382010-07-11 03:18:261233 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521234 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261235 {
[email protected]51fdc7c2012-04-10 19:19:481236 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261237 ClientSocketHandle handles[kDefaultMaxSockets];
1238 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521239 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201240 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
1241 params_, DEFAULT_PRIORITY,
1242 ClientSocketPool::RespectLimits::ENABLED,
1243 callback.callback(), pool_.get(),
1244 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261245 }
1246
1247 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1248 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481249 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261250
1251 // Now we will hit the socket limit.
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]51fdc7c2012-04-10 19:19:481257 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261258
1259 // Dropping out of scope will close all handles and return them to idle.
1260 }
[email protected]43a21b82010-06-10 21:30:541261
1262 // But if we wait for it, the released idle sockets will be closed in
1263 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011264 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261265
1266 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1267 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541268}
1269
1270// Regression test for http://crbug.com/40952.
1271TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
xunjieli26619e72016-11-23 19:39:551272 base::HistogramTester histograms;
[email protected]43a21b82010-06-10 21:30:541273 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221274 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541275 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1276
1277 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1278 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521279 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201280 EXPECT_EQ(
1281 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1282 ClientSocketPool::RespectLimits::ENABLED,
1283 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541284 }
1285
1286 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281287 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541288
1289 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1290 // reuse a socket.
1291 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1292 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521293 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541294
1295 // "0" is special here, since it should be the first entry in the sorted map,
1296 // which is the one which we would close an idle socket for. We shouldn't
1297 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201298 EXPECT_EQ(OK,
1299 handle.Init("0", params_, DEFAULT_PRIORITY,
1300 ClientSocketPool::RespectLimits::ENABLED,
1301 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541302
xunjieli26619e72016-11-23 19:39:551303 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1304 testing::ElementsAre(
1305 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1)));
[email protected]43a21b82010-06-10 21:30:541306 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1307 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1308}
1309
[email protected]ab838892009-06-30 18:49:051310TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
xunjieli26619e72016-11-23 19:39:551311 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531312 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091313
robpercival214763f2016-07-01 23:27:011314 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1315 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1316 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1317 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1318 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1319 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1320 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1321 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091322
[email protected]2431756e2010-09-29 20:26:131323 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551324 // 2 sockets reused for last 6 requests.
1325 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1326 testing::ElementsAre(
1327 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 6)));
[email protected]f6d1d6eb2009-06-24 20:16:091328
[email protected]c9d6a1d2009-07-14 16:15:201329 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1330 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131331 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1332 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091333
[email protected]c9d6a1d2009-07-14 16:15:201334 EXPECT_EQ(1, GetOrderOfRequest(1));
1335 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031336 EXPECT_EQ(8, GetOrderOfRequest(3));
1337 EXPECT_EQ(6, GetOrderOfRequest(4));
1338 EXPECT_EQ(4, GetOrderOfRequest(5));
1339 EXPECT_EQ(3, GetOrderOfRequest(6));
1340 EXPECT_EQ(5, GetOrderOfRequest(7));
1341 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171342
1343 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131344 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091345}
1346
[email protected]ab838892009-06-30 18:49:051347TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
xunjieli26619e72016-11-23 19:39:551348 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531349 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091350
robpercival214763f2016-07-01 23:27:011351 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1352 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1353 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1354 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1355 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1356 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1357 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091358
[email protected]2431756e2010-09-29 20:26:131359 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091360
[email protected]2431756e2010-09-29 20:26:131361 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011362 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201363
xunjieli26619e72016-11-23 19:39:551364 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1365 testing::ElementsAre(
1366 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABE=*/3, 7)));
[email protected]2431756e2010-09-29 20:26:131367 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201368 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131369 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1370 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091371}
1372
1373// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051374// The pending connect job will be cancelled and should not call back into
1375// ClientSocketPoolBase.
1376TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531377 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201378
[email protected]ab838892009-06-30 18:49:051379 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131380 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521381 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151382 EXPECT_EQ(ERR_IO_PENDING,
1383 handle.Init("a", params_, DEFAULT_PRIORITY,
1384 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201385 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131386 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091387}
1388
[email protected]ab838892009-06-30 18:49:051389TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531390 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201391
[email protected]ab838892009-06-30 18:49:051392 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061393 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521394 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091395
mmenked3641e12016-01-28 16:06:151396 EXPECT_EQ(ERR_IO_PENDING,
1397 handle.Init("a", params_, DEFAULT_PRIORITY,
1398 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201399 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091400
1401 handle.Reset();
1402
[email protected]6ecf2b92011-12-15 01:14:521403 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131404 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151405 handle.Init("a", params_, DEFAULT_PRIORITY,
1406 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201407 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091408
robpercival214763f2016-07-01 23:27:011409 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091410 EXPECT_FALSE(callback.have_result());
1411
1412 handle.Reset();
1413}
1414
[email protected]ab838892009-06-30 18:49:051415TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
xunjieli26619e72016-11-23 19:39:551416 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531417 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091418
robpercival214763f2016-07-01 23:27:011419 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1420 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1421 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1422 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1423 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1424 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1425 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091426
1427 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201428 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131429 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1430 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091431
[email protected]2431756e2010-09-29 20:26:131432 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551433 // 2 sockets reused for 4 requests.
1434 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1435 testing::ElementsAre(
1436 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 4)));
[email protected]f6d1d6eb2009-06-24 20:16:091437
[email protected]c9d6a1d2009-07-14 16:15:201438 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1439 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131440 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1441 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091442
[email protected]c9d6a1d2009-07-14 16:15:201443 EXPECT_EQ(1, GetOrderOfRequest(1));
1444 EXPECT_EQ(2, GetOrderOfRequest(2));
1445 EXPECT_EQ(5, GetOrderOfRequest(3));
1446 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131447 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1448 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201449 EXPECT_EQ(4, GetOrderOfRequest(6));
1450 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171451
1452 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131453 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091454}
1455
mmenke33d24423d2015-05-19 19:41:091456// Function to be used as a callback on socket request completion. It first
1457// disconnects the successfully connected socket from the first request, and
1458// then reuses the ClientSocketHandle to request another socket.
1459//
1460// |nested_callback| is called with the result of the second socket request.
1461void RequestSocketOnComplete(ClientSocketHandle* handle,
1462 TestClientSocketPool* pool,
1463 TestConnectJobFactory* test_connect_job_factory,
1464 TestConnectJob::JobType next_job_type,
1465 const CompletionCallback& nested_callback,
1466 int first_request_result) {
robpercival214763f2016-07-01 23:27:011467 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091468
1469 test_connect_job_factory->set_job_type(next_job_type);
1470
1471 // Don't allow reuse of the socket. Disconnect it and then release it.
1472 if (handle->socket())
1473 handle->socket()->Disconnect();
1474 handle->Reset();
1475
mmenked3641e12016-01-28 16:06:151476 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091477 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151478 int rv = handle->Init("a", params, LOWEST,
1479 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201480 nested_callback, pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091481 if (rv != ERR_IO_PENDING) {
1482 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1483 nested_callback.Run(rv);
1484 } else {
1485 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521486 }
mmenke33d24423d2015-05-19 19:41:091487}
[email protected]f6d1d6eb2009-06-24 20:16:091488
mmenke33d24423d2015-05-19 19:41:091489// Tests the case where a second socket is requested in a completion callback,
1490// and the second socket connects asynchronously. Reuses the same
1491// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581492TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531493 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201494
[email protected]0b7648c2009-07-06 20:14:011495 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061496 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091497 TestCompletionCallback second_result_callback;
1498 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151499 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091500 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1501 connect_job_factory_, TestConnectJob::kMockPendingJob,
1502 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201503 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011504 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091505
robpercival214763f2016-07-01 23:27:011506 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581507}
[email protected]f6d1d6eb2009-06-24 20:16:091508
mmenke33d24423d2015-05-19 19:41:091509// Tests the case where a second socket is requested in a completion callback,
1510// and the second socket connects synchronously. Reuses the same
1511// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581512TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531513 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201514
[email protected]0b7648c2009-07-06 20:14:011515 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061516 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091517 TestCompletionCallback second_result_callback;
1518 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151519 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091520 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1521 connect_job_factory_, TestConnectJob::kMockPendingJob,
1522 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201523 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011524 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581525
robpercival214763f2016-07-01 23:27:011526 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091527}
1528
1529// Make sure that pending requests get serviced after active requests get
1530// cancelled.
[email protected]ab838892009-06-30 18:49:051531TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531532 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201533
[email protected]0b7648c2009-07-06 20:14:011534 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091535
robpercival214763f2016-07-01 23:27:011536 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1537 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1538 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1539 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1540 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1541 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1542 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091543
[email protected]c9d6a1d2009-07-14 16:15:201544 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1545 // Let's cancel them.
1546 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131547 ASSERT_FALSE(request(i)->handle()->is_initialized());
1548 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091549 }
1550
[email protected]f6d1d6eb2009-06-24 20:16:091551 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131552 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011553 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131554 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091555 }
1556
[email protected]2431756e2010-09-29 20:26:131557 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1558 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091559}
1560
1561// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051562TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531563 const size_t kMaxSockets = 5;
1564 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201565
[email protected]0b7648c2009-07-06 20:14:011566 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091567
[email protected]211d21722009-07-22 15:48:531568 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1569 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091570
1571 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531572 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011573 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091574
[email protected]211d21722009-07-22 15:48:531575 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011576 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091577}
1578
[email protected]5fc08e32009-07-15 17:09:571579TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531580 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571581
1582 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1583
[email protected]2431756e2010-09-29 20:26:131584 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521585 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151586 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1587 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201588 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011589 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571590
1591 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131592 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571593
mmenked3641e12016-01-28 16:06:151594 rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1595 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201596 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011597 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1598 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571599
[email protected]2431756e2010-09-29 20:26:131600 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481601 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571602 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1603}
1604
xunjieli26619e72016-11-23 19:39:551605TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
1606 base::HistogramTester histograms;
1607 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1608 ClientSocketHandle handle;
1609 TestCompletionCallback callback;
1610 BoundTestNetLog log;
1611 int rv = handle.Init("a", params_, LOWEST,
1612 ClientSocketPool::RespectLimits::ENABLED,
1613 callback.callback(), pool_.get(), log.bound());
1614 EXPECT_THAT(rv, IsOk());
1615 handle.Reset();
1616 EXPECT_EQ(1, pool_->IdleSocketCount());
1617 pool_->CloseIdleSockets();
1618 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1619 testing::ElementsAre(
1620 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_FORCED=*/4, 1)));
1621}
1622
1623TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
1624 base::HistogramTester histograms;
1625 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1626 ClientSocketHandle handle;
1627 TestCompletionCallback callback;
1628 BoundTestNetLog log;
1629 int rv = handle.Init("a", params_, LOWEST,
1630 ClientSocketPool::RespectLimits::ENABLED,
1631 callback.callback(), pool_.get(), log.bound());
1632 EXPECT_THAT(rv, IsOk());
1633 StreamSocket* socket = handle.socket();
1634 handle.Reset();
1635 EXPECT_EQ(1, pool_->IdleSocketCount());
1636
1637 // Disconnect socket now to make the socket unusable.
1638 socket->Disconnect();
1639 ClientSocketHandle handle2;
1640 rv = handle2.Init("a", params_, LOWEST,
1641 ClientSocketPool::RespectLimits::ENABLED,
1642 callback.callback(), pool_.get(), log.bound());
1643 EXPECT_THAT(rv, IsOk());
1644 EXPECT_FALSE(handle2.is_reused());
1645
1646 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1647 testing::ElementsAre(
1648 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_UNUSABLE=*/7, 1)));
1649}
1650
[email protected]2b7523d2009-07-29 20:29:231651// Regression test for http://crbug.com/17985.
1652TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
xunjieli26619e72016-11-23 19:39:551653 base::HistogramTester histograms;
[email protected]2b7523d2009-07-29 20:29:231654 const int kMaxSockets = 3;
1655 const int kMaxSocketsPerGroup = 2;
1656 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1657
[email protected]ac790b42009-12-02 04:31:311658 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231659
robpercival214763f2016-07-01 23:27:011660 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1661 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231662
1663 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011664 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231665
1666 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011667 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231668
1669 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011670 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1671 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231672
[email protected]eb5a99382010-07-11 03:18:261673 // Release the first two sockets from "a". Because this is a keepalive,
1674 // the first release will unblock the pending request for "a". The
1675 // second release will unblock a request for "c", becaue it is the next
1676 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131677 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551678 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1679 testing::ElementsAre(
1680 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1)));
[email protected]2431756e2010-09-29 20:26:131681 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551682 EXPECT_THAT(
1683 histograms.GetAllSamples(kIdleSocketFateHistogram),
1684 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1),
1685 base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 1)));
[email protected]2b7523d2009-07-29 20:29:231686
1687 // Closing idle sockets should not get us into trouble, but in the bug
1688 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411689 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541690 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261691
[email protected]2da659e2013-05-23 20:51:341692 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281693 base::RunLoop().RunUntilIdle();
xunjieli26619e72016-11-23 19:39:551694 EXPECT_THAT(
1695 histograms.GetAllSamples(kIdleSocketFateHistogram),
1696 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1),
1697 base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 1)));
[email protected]2b7523d2009-07-29 20:29:231698}
1699
[email protected]4d3b05d2010-01-27 21:27:291700TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531701 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571702
1703 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131704 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521705 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511706 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:151707 int rv = handle.Init("a", params_, LOWEST,
1708 ClientSocketPool::RespectLimits::ENABLED,
1709 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011710 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131711 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481712 TestLoadTimingInfoNotConnected(handle);
1713
robpercival214763f2016-07-01 23:27:011714 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131715 EXPECT_TRUE(handle.is_initialized());
1716 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481717 TestLoadTimingInfoConnectedNotReused(handle);
1718
[email protected]2431756e2010-09-29 20:26:131719 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481720 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301721
mmenke43758e62015-05-04 21:09:461722 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401723 log.GetEntries(&entries);
1724
1725 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001726 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171727 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001728 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1729 NetLogEventPhase::NONE));
1730 EXPECT_TRUE(LogContainsEvent(entries, 2,
1731 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1732 NetLogEventPhase::NONE));
1733 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571734}
1735
[email protected]4d3b05d2010-01-27 21:27:291736TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571737 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531738 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571739
1740 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131741 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521742 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511743 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181744 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131745 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431746 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451747 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131748 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151749 EXPECT_EQ(ERR_IO_PENDING,
1750 handle.Init("a", params_, DEFAULT_PRIORITY,
1751 ClientSocketPool::RespectLimits::ENABLED,
1752 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131753 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011754 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131755 EXPECT_FALSE(handle.is_ssl_error());
1756 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301757
mmenke43758e62015-05-04 21:09:461758 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401759 log.GetEntries(&entries);
1760
1761 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001762 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171763 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001764 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1765 NetLogEventPhase::NONE));
1766 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571767}
1768
mmenke6be122f2015-03-09 22:22:471769// Check that an async ConnectJob failure does not result in creation of a new
1770// ConnectJob when there's another pending request also waiting on its own
1771// ConnectJob. See http://crbug.com/463960.
1772TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1773 CreatePool(2, 2);
1774 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1775
robpercival214763f2016-07-01 23:27:011776 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1777 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471778
robpercival214763f2016-07-01 23:27:011779 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1780 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471781
1782 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1783}
1784
[email protected]4d3b05d2010-01-27 21:27:291785TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101786 // TODO(eroman): Add back the log expectations! Removed them because the
1787 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531788 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571789
1790 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131791 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521792 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131793 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521794 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571795
[email protected]2431756e2010-09-29 20:26:131796 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151797 handle.Init("a", params_, DEFAULT_PRIORITY,
1798 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201799 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511800 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201801 EXPECT_EQ(
1802 ERR_IO_PENDING,
1803 handle2.Init("a", params_, DEFAULT_PRIORITY,
1804 ClientSocketPool::RespectLimits::ENABLED,
1805 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571806
[email protected]2431756e2010-09-29 20:26:131807 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571808
[email protected]fd7b7c92009-08-20 19:38:301809
1810 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301811
robpercival214763f2016-07-01 23:27:011812 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131813 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301814
1815 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531816 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571817}
1818
[email protected]4d3b05d2010-01-27 21:27:291819TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341820 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1821
[email protected]17a0c6c2009-08-04 00:07:041822 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1823
robpercival214763f2016-07-01 23:27:011824 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1825 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1826 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1827 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341828
1829 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131830 (*requests())[2]->handle()->Reset();
1831 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341832 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1833
[email protected]2431756e2010-09-29 20:26:131834 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341835 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1836
[email protected]2431756e2010-09-29 20:26:131837 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261838 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341839}
1840
[email protected]5fc08e32009-07-15 17:09:571841// When requests and ConnectJobs are not coupled, the request will get serviced
1842// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291843TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531844 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571845
1846 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321847 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571848
[email protected]2431756e2010-09-29 20:26:131849 std::vector<TestSocketRequest*> request_order;
1850 size_t completion_count; // unused
1851 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:201852 int rv = req1.handle()->Init(
1853 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
1854 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011855 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1856 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571857
1858 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1859 // without a job.
1860 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1861
[email protected]2431756e2010-09-29 20:26:131862 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151863 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1864 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201865 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011866 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131867 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151868 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1869 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201870 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011871 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571872
1873 // Both Requests 2 and 3 are pending. We release socket 1 which should
1874 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331875 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341876 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281877 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331878 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011879 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331880 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571881
1882 // Signal job 2, which should service request 3.
1883
1884 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011885 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571886
[email protected]2431756e2010-09-29 20:26:131887 ASSERT_EQ(3U, request_order.size());
1888 EXPECT_EQ(&req1, request_order[0]);
1889 EXPECT_EQ(&req2, request_order[1]);
1890 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571891 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1892}
1893
1894// The requests are not coupled to the jobs. So, the requests should finish in
1895// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291896TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531897 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571898 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321899 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571900
[email protected]2431756e2010-09-29 20:26:131901 std::vector<TestSocketRequest*> request_order;
1902 size_t completion_count; // unused
1903 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:201904 int rv = req1.handle()->Init(
1905 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
1906 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011907 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571908
[email protected]2431756e2010-09-29 20:26:131909 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151910 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1911 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201912 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011913 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571914
1915 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321916 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571917
[email protected]2431756e2010-09-29 20:26:131918 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151919 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1920 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201921 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011922 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571923
robpercival214763f2016-07-01 23:27:011924 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1925 EXPECT_THAT(req2.WaitForResult(), IsOk());
1926 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:571927
[email protected]2431756e2010-09-29 20:26:131928 ASSERT_EQ(3U, request_order.size());
1929 EXPECT_EQ(&req1, request_order[0]);
1930 EXPECT_EQ(&req2, request_order[1]);
1931 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571932}
1933
[email protected]03b7c8c2013-07-20 04:38:551934// Test GetLoadState in the case there's only one socket request.
1935TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:531936 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:551937 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:571938
[email protected]2431756e2010-09-29 20:26:131939 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521940 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151941 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1942 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201943 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011944 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551945 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571946
[email protected]03b7c8c2013-07-20 04:38:551947 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1948 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1949
1950 // No point in completing the connection, since ClientSocketHandles only
1951 // expect the LoadState to be checked while connecting.
1952}
1953
1954// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:001955// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:551956TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
1957 CreatePool(2, 2);
1958 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1959
1960 ClientSocketHandle handle;
1961 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151962 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1963 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201964 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011965 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001966 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
1967
1968 ClientSocketHandle handle2;
1969 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151970 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
1971 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201972 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011973 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001974 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
1975
1976 // Check that both handles report the state of the first job.
1977 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
1978 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
1979
1980 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
1981
1982 // Check that both handles change to LOAD_STATE_CONNECTING.
1983 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1984 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1985}
1986
1987// Test that the second connection request does not affect the pool's load
1988// status.
1989TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
1990 CreatePool(2, 2);
1991 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1992
1993 ClientSocketHandle handle;
1994 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151995 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1996 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201997 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011998 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571999
[email protected]2431756e2010-09-29 20:26:132000 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522001 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152002 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2003 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202004 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012005 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002006 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552007
[email protected]03b7c8c2013-07-20 04:38:552008 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2009 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2010
haavardm835c1d62015-04-22 08:18:002011 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552012 // second handle switches to the state of the remaining ConnectJob.
2013 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012014 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002015 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552016}
2017
2018// Test GetLoadState in the case the per-group limit is reached.
2019TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2020 CreatePool(2, 1);
2021 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2022
2023 ClientSocketHandle handle;
2024 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152025 int rv = handle.Init("a", params_, MEDIUM,
2026 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202027 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012028 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552029 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2030
2031 // Request another socket from the same pool, buth with a higher priority.
2032 // The first request should now be stalled at the socket group limit.
2033 ClientSocketHandle handle2;
2034 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152035 rv = handle2.Init("a", params_, HIGHEST,
2036 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202037 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012038 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552039 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2040 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2041
2042 // The first handle should remain stalled as the other socket goes through
2043 // the connect process.
2044
2045 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2046 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2047 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2048
2049 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012050 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552051 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2052
2053 // Closing the second socket should cause the stalled handle to finally get a
2054 // ConnectJob.
2055 handle2.socket()->Disconnect();
2056 handle2.Reset();
2057 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2058}
2059
2060// Test GetLoadState in the case the per-pool limit is reached.
2061TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2062 CreatePool(2, 2);
2063 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2064
2065 ClientSocketHandle handle;
2066 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152067 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2068 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202069 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012070 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552071
2072 // Request for socket from another pool.
2073 ClientSocketHandle handle2;
2074 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152075 rv = handle2.Init("b", params_, DEFAULT_PRIORITY,
2076 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202077 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012078 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552079
2080 // Request another socket from the first pool. Request should stall at the
2081 // socket pool limit.
2082 ClientSocketHandle handle3;
2083 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152084 rv = handle3.Init("a", params_, DEFAULT_PRIORITY,
2085 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202086 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012087 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552088
2089 // The third handle should remain stalled as the other sockets in its group
2090 // goes through the connect process.
2091
2092 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2093 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2094
2095 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2096 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2097 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2098
2099 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012100 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552101 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2102
2103 // Closing a socket should allow the stalled handle to finally get a new
2104 // ConnectJob.
2105 handle.socket()->Disconnect();
2106 handle.Reset();
2107 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572108}
2109
[email protected]e772db3f2010-07-12 18:11:132110TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2112 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2113
[email protected]2431756e2010-09-29 20:26:132114 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522115 TestCompletionCallback callback;
2116 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
mmenked3641e12016-01-28 16:06:152117 handle.Init("a", params_, DEFAULT_PRIORITY,
2118 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202119 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132120 EXPECT_TRUE(handle.is_initialized());
2121 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132122}
2123
2124TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2125 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2126
2127 connect_job_factory_->set_job_type(
2128 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132129 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522130 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132131 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152132 handle.Init("a", params_, DEFAULT_PRIORITY,
2133 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202134 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132135 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012136 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132137 EXPECT_TRUE(handle.is_initialized());
2138 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132139}
2140
[email protected]e60e47a2010-07-14 03:37:182141TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2142 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2143 connect_job_factory_->set_job_type(
2144 TestConnectJob::kMockAdditionalErrorStateJob);
2145
[email protected]2431756e2010-09-29 20:26:132146 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522147 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132148 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:152149 handle.Init("a", params_, DEFAULT_PRIORITY,
2150 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202151 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132152 EXPECT_FALSE(handle.is_initialized());
2153 EXPECT_FALSE(handle.socket());
2154 EXPECT_TRUE(handle.is_ssl_error());
2155 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182156}
2157
2158TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2159 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2160
2161 connect_job_factory_->set_job_type(
2162 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132163 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522164 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132165 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152166 handle.Init("a", params_, DEFAULT_PRIORITY,
2167 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202168 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132169 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012170 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132171 EXPECT_FALSE(handle.is_initialized());
2172 EXPECT_FALSE(handle.socket());
2173 EXPECT_TRUE(handle.is_ssl_error());
2174 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182175}
2176
martijn003cd612016-05-19 22:24:382177// Make sure we can reuse sockets.
2178TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
xunjieli26619e72016-11-23 19:39:552179 base::HistogramTester histograms;
[email protected]64770b7d2011-11-16 04:30:412180 CreatePoolWithIdleTimeouts(
2181 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032182 base::TimeDelta(), // Time out unused sockets immediately.
2183 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2184
2185 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2186
2187 ClientSocketHandle handle;
2188 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152189 int rv = handle.Init("a", params_, LOWEST,
2190 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202191 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012192 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032193 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012194 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032195
2196 // Use and release the socket.
2197 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482198 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032199 handle.Reset();
2200
2201 // Should now have one idle socket.
2202 ASSERT_EQ(1, pool_->IdleSocketCount());
2203
2204 // Request a new socket. This should reuse the old socket and complete
2205 // synchronously.
vishal.b62985ca92015-04-17 08:45:512206 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:152207 rv = handle.Init("a", params_, LOWEST,
2208 ClientSocketPool::RespectLimits::ENABLED,
2209 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012210 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032211 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482212 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032213
2214 ASSERT_TRUE(pool_->HasGroup("a"));
2215 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2216 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
xunjieli26619e72016-11-23 19:39:552217 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
2218 testing::ElementsAre(
2219 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_REUSED=*/0, 1)));
[email protected]e7b1c6d2c2012-05-05 00:54:032220
mmenke43758e62015-05-04 21:09:462221 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032222 log.GetEntries(&entries);
2223 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002224 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032225}
2226
blundellb8163592f2015-12-16 14:22:422227#if defined(OS_IOS)
2228// TODO(droger): Enable this test (crbug.com/512595).
martijn003cd612016-05-19 22:24:382229#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2230 DISABLED_CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422231#else
martijn003cd612016-05-19 22:24:382232#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2233 CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422234#endif
martijn003cd612016-05-19 22:24:382235// Make sure we cleanup old unused sockets.
2236TEST_F(ClientSocketPoolBaseTest, MAYBE_CleanupTimedOutIdleSocketsNoReuse) {
xunjieli26619e72016-11-23 19:39:552237 base::HistogramTester histograms;
[email protected]e7b1c6d2c2012-05-05 00:54:032238 CreatePoolWithIdleTimeouts(
2239 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2240 base::TimeDelta(), // Time out unused sockets immediately
2241 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412242
2243 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2244
2245 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2246
2247 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522248 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152249 int rv = handle.Init("a", params_, LOWEST,
2250 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202251 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012252 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412253 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2254
2255 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522256 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152257 rv = handle2.Init("a", params_, LOWEST,
2258 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202259 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012260 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412261 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2262
2263 // Cancel one of the requests. Wait for the other, which will get the first
2264 // job. Release the socket. Run the loop again to make sure the second
2265 // socket is sitting idle and the first one is released (since ReleaseSocket()
2266 // just posts a DoReleaseSocket() task).
2267
2268 handle.Reset();
robpercival214763f2016-07-01 23:27:012269 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412270 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552271 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412272 handle2.Reset();
2273
[email protected]e7b1c6d2c2012-05-05 00:54:032274 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2275 // actually become pending until 2ms after they have been created. In order
2276 // to flush all tasks, we need to wait so that we know there are no
2277 // soon-to-be-pending tasks waiting.
2278 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282279 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412280
[email protected]e7b1c6d2c2012-05-05 00:54:032281 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412282 ASSERT_EQ(2, pool_->IdleSocketCount());
2283
2284 // Request a new socket. This should cleanup the unused and timed out ones.
2285 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512286 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522287 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152288 rv = handle.Init("a", params_, LOWEST,
2289 ClientSocketPool::RespectLimits::ENABLED,
2290 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012291 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2292 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412293 EXPECT_FALSE(handle.is_reused());
2294
xunjieli26619e72016-11-23 19:39:552295 EXPECT_THAT(
2296 histograms.GetAllSamples(kIdleSocketFateHistogram),
2297 testing::ElementsAre(
2298 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_REUSED=*/5, 1),
2299 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_UNUSED=*/6, 1)));
2300
[email protected]e7b1c6d2c2012-05-05 00:54:032301 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412302 ASSERT_TRUE(pool_->HasGroup("a"));
2303 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2304 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2305
mmenke43758e62015-05-04 21:09:462306 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412307 log.GetEntries(&entries);
2308 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002309 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412310}
2311
[email protected]2041cf342010-02-19 03:15:592312// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162313// because of multiple releasing disconnected sockets.
2314TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2315 CreatePoolWithIdleTimeouts(
2316 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2317 base::TimeDelta(), // Time out unused sockets immediately.
2318 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2319
2320 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2321
2322 // Startup 4 connect jobs. Two of them will be pending.
2323
[email protected]2431756e2010-09-29 20:26:132324 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522325 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152326 int rv = handle.Init("a", params_, LOWEST,
2327 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202328 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012329 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162330
[email protected]2431756e2010-09-29 20:26:132331 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522332 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152333 rv = handle2.Init("a", params_, LOWEST,
2334 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202335 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012336 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162337
[email protected]2431756e2010-09-29 20:26:132338 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522339 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152340 rv = handle3.Init("a", params_, LOWEST,
2341 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202342 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012343 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162344
[email protected]2431756e2010-09-29 20:26:132345 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522346 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:152347 rv = handle4.Init("a", params_, LOWEST,
2348 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202349 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012350 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162351
2352 // Release two disconnected sockets.
2353
[email protected]2431756e2010-09-29 20:26:132354 handle.socket()->Disconnect();
2355 handle.Reset();
2356 handle2.socket()->Disconnect();
2357 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162358
robpercival214763f2016-07-01 23:27:012359 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132360 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012361 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132362 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162363}
2364
[email protected]d7027bb2010-05-10 18:58:542365// Regression test for http://crbug.com/42267.
2366// When DoReleaseSocket() is processed for one socket, it is blocked because the
2367// other stalled groups all have releasing sockets, so no progress can be made.
2368TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2369 CreatePoolWithIdleTimeouts(
2370 4 /* socket limit */, 4 /* socket limit per group */,
2371 base::TimeDelta(), // Time out unused sockets immediately.
2372 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2373
2374 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2375
2376 // Max out the socket limit with 2 per group.
2377
[email protected]2431756e2010-09-29 20:26:132378 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522379 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132380 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522381 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542382
2383 for (int i = 0; i < 2; ++i) {
mmenked3641e12016-01-28 16:06:152384 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST,
2385 ClientSocketPool::RespectLimits::ENABLED,
2386 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202387 NetLogWithSource()));
mmenked3641e12016-01-28 16:06:152388 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST,
2389 ClientSocketPool::RespectLimits::ENABLED,
2390 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202391 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542392 }
[email protected]b89f7e42010-05-20 20:37:002393
[email protected]d7027bb2010-05-10 18:58:542394 // Make 4 pending requests, 2 per group.
2395
2396 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202397 EXPECT_EQ(ERR_IO_PENDING,
2398 handle_a[i].Init("a", params_, LOWEST,
2399 ClientSocketPool::RespectLimits::ENABLED,
2400 callback_a[i].callback(), pool_.get(),
2401 NetLogWithSource()));
2402 EXPECT_EQ(ERR_IO_PENDING,
2403 handle_b[i].Init("b", params_, LOWEST,
2404 ClientSocketPool::RespectLimits::ENABLED,
2405 callback_b[i].callback(), pool_.get(),
2406 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542407 }
2408
2409 // Release b's socket first. The order is important, because in
2410 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2411 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2412 // first, which has a releasing socket, so it refuses to start up another
2413 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132414 handle_b[0].socket()->Disconnect();
2415 handle_b[0].Reset();
2416 handle_a[0].socket()->Disconnect();
2417 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542418
2419 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282420 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542421
[email protected]2431756e2010-09-29 20:26:132422 handle_b[1].socket()->Disconnect();
2423 handle_b[1].Reset();
2424 handle_a[1].socket()->Disconnect();
2425 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542426
2427 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012428 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2429 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542430 }
2431}
2432
[email protected]fd4fe0b2010-02-08 23:02:152433TEST_F(ClientSocketPoolBaseTest,
2434 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
xunjieli26619e72016-11-23 19:39:552435 base::HistogramTester histograms;
[email protected]fd4fe0b2010-02-08 23:02:152436 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2437
2438 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2439
robpercival214763f2016-07-01 23:27:012440 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2441 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2442 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2443 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152444
robpercival214763f2016-07-01 23:27:012445 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2446 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132447 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152448
2449 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132450 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012451 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
xunjieli26619e72016-11-23 19:39:552452 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
2453 testing::ElementsAre(
2454 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 1)));
[email protected]fd4fe0b2010-02-08 23:02:152455
[email protected]2431756e2010-09-29 20:26:132456 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012457 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132458 EXPECT_EQ(4u, completion_count());
xunjieli26619e72016-11-23 19:39:552459 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
2460 testing::ElementsAre(
2461 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 2)));
[email protected]fd4fe0b2010-02-08 23:02:152462
2463 EXPECT_EQ(1, GetOrderOfRequest(1));
2464 EXPECT_EQ(2, GetOrderOfRequest(2));
2465 EXPECT_EQ(3, GetOrderOfRequest(3));
2466 EXPECT_EQ(4, GetOrderOfRequest(4));
2467
2468 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132469 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152470}
2471
[email protected]6ecf2b92011-12-15 01:14:522472class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042473 public:
[email protected]2431756e2010-09-29 20:26:132474 TestReleasingSocketRequest(TestClientSocketPool* pool,
2475 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182476 bool reset_releasing_handle)
2477 : pool_(pool),
2478 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522479 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322480 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2481 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522482 }
2483
dchengb03027d2014-10-21 12:00:202484 ~TestReleasingSocketRequest() override {}
[email protected]4f1e4982010-03-02 18:31:042485
2486 ClientSocketHandle* handle() { return &handle_; }
2487
[email protected]6ecf2b92011-12-15 01:14:522488 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042489
2490 private:
[email protected]6ecf2b92011-12-15 01:14:522491 void OnComplete(int result) {
2492 SetResult(result);
2493 if (reset_releasing_handle_)
2494 handle_.Reset();
2495
mmenked3641e12016-01-28 16:06:152496 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522497 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072498 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:152499 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202500 callback2_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522501 }
2502
[email protected]2431756e2010-09-29 20:26:132503 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182504 int expected_result_;
2505 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042506 ClientSocketHandle handle_;
2507 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522508 CompletionCallback callback_;
2509 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042510};
2511
[email protected]e60e47a2010-07-14 03:37:182512
2513TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2514 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2515
robpercival214763f2016-07-01 23:27:012516 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2517 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2518 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182519
[email protected]2431756e2010-09-29 20:26:132520 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182521 client_socket_factory_.allocation_count());
2522
2523 connect_job_factory_->set_job_type(
2524 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2525 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202526 EXPECT_EQ(
2527 ERR_IO_PENDING,
2528 req.handle()->Init("a", params_, DEFAULT_PRIORITY,
2529 ClientSocketPool::RespectLimits::ENABLED,
2530 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182531 // The next job should complete synchronously
2532 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2533
robpercival214763f2016-07-01 23:27:012534 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182535 EXPECT_FALSE(req.handle()->is_initialized());
2536 EXPECT_FALSE(req.handle()->socket());
2537 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432538 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182539}
2540
[email protected]b6501d3d2010-06-03 23:53:342541// http://crbug.com/44724 regression test.
2542// We start releasing the pool when we flush on network change. When that
2543// happens, the only active references are in the ClientSocketHandles. When a
2544// ConnectJob completes and calls back into the last ClientSocketHandle, that
2545// callback can release the last reference and delete the pool. After the
2546// callback finishes, we go back to the stack frame within the now-deleted pool.
2547// Executing any code that refers to members of the now-deleted pool can cause
2548// crashes.
2549TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2550 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2551 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2552
2553 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522554 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152555 EXPECT_EQ(ERR_IO_PENDING,
2556 handle.Init("a", params_, DEFAULT_PRIORITY,
2557 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202558 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342559
[email protected]7af985a2012-12-14 22:40:422560 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342561
2562 // We'll call back into this now.
2563 callback.WaitForResult();
2564}
2565
[email protected]a7e38572010-06-07 18:22:242566TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2567 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2568 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2569
2570 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522571 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152572 EXPECT_EQ(ERR_IO_PENDING,
2573 handle.Init("a", params_, DEFAULT_PRIORITY,
2574 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202575 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012576 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242577 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2578
[email protected]7af985a2012-12-14 22:40:422579 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242580
2581 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282582 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242583
mmenked3641e12016-01-28 16:06:152584 EXPECT_EQ(ERR_IO_PENDING,
2585 handle.Init("a", params_, DEFAULT_PRIORITY,
2586 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202587 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012588 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242589 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2590}
2591
[email protected]6ecf2b92011-12-15 01:14:522592class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142593 public:
2594 ConnectWithinCallback(
2595 const std::string& group_name,
2596 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132597 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522598 : group_name_(group_name),
2599 params_(params),
2600 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322601 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2602 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142603 }
2604
dchengb03027d2014-10-21 12:00:202605 ~ConnectWithinCallback() override {}
[email protected]06f92462010-08-31 19:24:142606
2607 int WaitForNestedResult() {
2608 return nested_callback_.WaitForResult();
2609 }
2610
[email protected]6ecf2b92011-12-15 01:14:522611 const CompletionCallback& callback() const { return callback_; }
2612
[email protected]06f92462010-08-31 19:24:142613 private:
[email protected]6ecf2b92011-12-15 01:14:522614 void OnComplete(int result) {
2615 SetResult(result);
tfarina428341112016-09-22 13:38:202616 EXPECT_EQ(
2617 ERR_IO_PENDING,
2618 handle_.Init(group_name_, params_, DEFAULT_PRIORITY,
2619 ClientSocketPool::RespectLimits::ENABLED,
2620 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522621 }
2622
[email protected]06f92462010-08-31 19:24:142623 const std::string group_name_;
2624 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132625 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142626 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522627 CompletionCallback callback_;
2628 TestCompletionCallback nested_callback_;
2629
2630 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142631};
2632
2633TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2634 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2635
2636 // First job will be waiting until it gets aborted.
2637 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2638
2639 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132640 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152641 EXPECT_EQ(ERR_IO_PENDING,
2642 handle.Init("a", params_, DEFAULT_PRIORITY,
2643 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202644 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142645
2646 // Second job will be started during the first callback, and will
2647 // asynchronously complete with OK.
2648 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422649 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012650 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2651 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142652}
2653
[email protected]25eea382010-07-10 23:55:262654// Cancel a pending socket request while we're at max sockets,
2655// and verify that the backup socket firing doesn't cause a crash.
2656TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2657 // Max 4 sockets globally, max 4 sockets per group.
2658 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222659 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262660
[email protected]4baaf9d2010-08-31 15:15:442661 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2662 // timer.
[email protected]25eea382010-07-10 23:55:262663 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2664 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522665 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152666 EXPECT_EQ(ERR_IO_PENDING,
2667 handle.Init("bar", params_, DEFAULT_PRIORITY,
2668 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202669 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262670
2671 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2672 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2673 ClientSocketHandle handles[kDefaultMaxSockets];
2674 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522675 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:202676 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY,
2677 ClientSocketPool::RespectLimits::ENABLED,
2678 callback.callback(), pool_.get(),
2679 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262680 }
2681
fdoray5eeb7642016-06-22 16:11:282682 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262683
2684 // Cancel the pending request.
2685 handle.Reset();
2686
2687 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002688 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2689 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262690
fdoray5eeb7642016-06-22 16:11:282691 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262692 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2693}
2694
[email protected]3f00be82010-09-27 19:50:022695TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442696 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2697 pool_->EnableConnectBackupJobs();
2698
2699 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2700 // timer.
2701 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2702 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522703 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152704 EXPECT_EQ(ERR_IO_PENDING,
2705 handle.Init("bar", params_, DEFAULT_PRIORITY,
2706 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202707 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442708 ASSERT_TRUE(pool_->HasGroup("bar"));
2709 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102710 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442711
2712 // Cancel the socket request. This should cancel the backup timer. Wait for
2713 // the backup time to see if it indeed got canceled.
2714 handle.Reset();
2715 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002716 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2717 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282718 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442719 ASSERT_TRUE(pool_->HasGroup("bar"));
2720 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2721}
2722
[email protected]3f00be82010-09-27 19:50:022723TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2724 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2725 pool_->EnableConnectBackupJobs();
2726
2727 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2728 // timer.
2729 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2730 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522731 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152732 EXPECT_EQ(ERR_IO_PENDING,
2733 handle.Init("bar", params_, DEFAULT_PRIORITY,
2734 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202735 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022736 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2737 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522738 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202739 EXPECT_EQ(
2740 ERR_IO_PENDING,
2741 handle2.Init("bar", params_, DEFAULT_PRIORITY,
2742 ClientSocketPool::RespectLimits::ENABLED,
2743 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022744 ASSERT_TRUE(pool_->HasGroup("bar"));
2745 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2746
2747 // Cancel request 1 and then complete request 2. With the requests finished,
2748 // the backup timer should be cancelled.
2749 handle.Reset();
robpercival214763f2016-07-01 23:27:012750 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022751 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002752 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2753 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282754 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022755}
2756
[email protected]eb5a99382010-07-11 03:18:262757// Test delayed socket binding for the case where we have two connects,
2758// and while one is waiting on a connect, the other frees up.
2759// The socket waiting on a connect should switch immediately to the freed
2760// up socket.
2761TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2762 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2763 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2764
2765 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522766 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132767 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152768 handle1.Init("a", params_, DEFAULT_PRIORITY,
2769 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202770 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012771 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262772
2773 // No idle sockets, no pending jobs.
2774 EXPECT_EQ(0, pool_->IdleSocketCount());
2775 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2776
2777 // Create a second socket to the same host, but this one will wait.
2778 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2779 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132780 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152781 handle2.Init("a", params_, DEFAULT_PRIORITY,
2782 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202783 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262784 // No idle sockets, and one connecting job.
2785 EXPECT_EQ(0, pool_->IdleSocketCount());
2786 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2787
2788 // Return the first handle to the pool. This will initiate the delayed
2789 // binding.
2790 handle1.Reset();
2791
fdoray5eeb7642016-06-22 16:11:282792 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262793
2794 // Still no idle sockets, still one pending connect job.
2795 EXPECT_EQ(0, pool_->IdleSocketCount());
2796 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2797
2798 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012799 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262800
2801 // And we can see there is still one job waiting.
2802 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2803
2804 // Finally, signal the waiting Connect.
2805 client_socket_factory_.SignalJobs();
2806 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2807
fdoray5eeb7642016-06-22 16:11:282808 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262809}
2810
2811// Test delayed socket binding when a group is at capacity and one
2812// of the group's sockets frees up.
2813TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2814 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2815 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2816
2817 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522818 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132819 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152820 handle1.Init("a", params_, DEFAULT_PRIORITY,
2821 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202822 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012823 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262824
2825 // No idle sockets, no pending jobs.
2826 EXPECT_EQ(0, pool_->IdleSocketCount());
2827 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2828
2829 // Create a second socket to the same host, but this one will wait.
2830 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2831 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132832 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152833 handle2.Init("a", params_, DEFAULT_PRIORITY,
2834 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202835 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262836 // No idle sockets, and one connecting job.
2837 EXPECT_EQ(0, pool_->IdleSocketCount());
2838 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2839
2840 // Return the first handle to the pool. This will initiate the delayed
2841 // binding.
2842 handle1.Reset();
2843
fdoray5eeb7642016-06-22 16:11:282844 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262845
2846 // Still no idle sockets, still one pending connect job.
2847 EXPECT_EQ(0, pool_->IdleSocketCount());
2848 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2849
2850 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012851 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262852
2853 // And we can see there is still one job waiting.
2854 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2855
2856 // Finally, signal the waiting Connect.
2857 client_socket_factory_.SignalJobs();
2858 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2859
fdoray5eeb7642016-06-22 16:11:282860 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262861}
2862
2863// Test out the case where we have one socket connected, one
2864// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512865// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262866// should complete, by taking the first socket's idle socket.
2867TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2868 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2869 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2870
2871 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522872 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132873 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152874 handle1.Init("a", params_, DEFAULT_PRIORITY,
2875 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202876 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012877 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262878
2879 // No idle sockets, no pending jobs.
2880 EXPECT_EQ(0, pool_->IdleSocketCount());
2881 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2882
2883 // Create a second socket to the same host, but this one will wait.
2884 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2885 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132886 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152887 handle2.Init("a", params_, DEFAULT_PRIORITY,
2888 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202889 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262890 // No idle sockets, and one connecting job.
2891 EXPECT_EQ(0, pool_->IdleSocketCount());
2892 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2893
2894 // Return the first handle to the pool. This will initiate the delayed
2895 // binding.
2896 handle1.Reset();
2897
fdoray5eeb7642016-06-22 16:11:282898 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262899
2900 // Still no idle sockets, still one pending connect job.
2901 EXPECT_EQ(0, pool_->IdleSocketCount());
2902 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2903
2904 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012905 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262906
2907 // And we can see there is still one job waiting.
2908 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2909
2910 // Finally, signal the waiting Connect.
2911 client_socket_factory_.SignalJobs();
2912 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2913
fdoray5eeb7642016-06-22 16:11:282914 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262915}
2916
[email protected]2abfe90a2010-08-25 17:49:512917// Cover the case where on an available socket slot, we have one pending
2918// request that completes synchronously, thereby making the Group empty.
2919TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
2920 const int kUnlimitedSockets = 100;
2921 const int kOneSocketPerGroup = 1;
2922 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
2923
2924 // Make the first request asynchronous fail.
2925 // This will free up a socket slot later.
2926 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2927
2928 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522929 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202930 EXPECT_EQ(
2931 ERR_IO_PENDING,
2932 handle1.Init("a", params_, DEFAULT_PRIORITY,
2933 ClientSocketPool::RespectLimits::ENABLED,
2934 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:512935 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2936
2937 // Make the second request synchronously fail. This should make the Group
2938 // empty.
2939 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
2940 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522941 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:512942 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
2943 // when created.
tfarina428341112016-09-22 13:38:202944 EXPECT_EQ(
2945 ERR_IO_PENDING,
2946 handle2.Init("a", params_, DEFAULT_PRIORITY,
2947 ClientSocketPool::RespectLimits::ENABLED,
2948 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:512949
2950 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2951
robpercival214763f2016-07-01 23:27:012952 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2953 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:512954 EXPECT_FALSE(pool_->HasGroup("a"));
2955}
2956
[email protected]e1b54dc2010-10-06 21:27:222957TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
2958 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2959
2960 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2961
2962 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522963 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202964 EXPECT_EQ(
2965 ERR_IO_PENDING,
2966 handle1.Init("a", params_, DEFAULT_PRIORITY,
2967 ClientSocketPool::RespectLimits::ENABLED,
2968 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222969
2970 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522971 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202972 EXPECT_EQ(
2973 ERR_IO_PENDING,
2974 handle2.Init("a", params_, DEFAULT_PRIORITY,
2975 ClientSocketPool::RespectLimits::ENABLED,
2976 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222977 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522978 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:202979 EXPECT_EQ(
2980 ERR_IO_PENDING,
2981 handle3.Init("a", params_, DEFAULT_PRIORITY,
2982 ClientSocketPool::RespectLimits::ENABLED,
2983 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222984
robpercival214763f2016-07-01 23:27:012985 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2986 EXPECT_THAT(callback2.WaitForResult(), IsOk());
2987 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:222988
2989 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552990 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
2991 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:222992
2993 handle1.Reset();
2994 handle2.Reset();
2995 handle3.Reset();
2996
tfarina428341112016-09-22 13:38:202997 EXPECT_EQ(
2998 OK, handle1.Init("a", params_, DEFAULT_PRIORITY,
2999 ClientSocketPool::RespectLimits::ENABLED,
3000 callback1.callback(), pool_.get(), NetLogWithSource()));
3001 EXPECT_EQ(
3002 OK, handle2.Init("a", params_, DEFAULT_PRIORITY,
3003 ClientSocketPool::RespectLimits::ENABLED,
3004 callback2.callback(), pool_.get(), NetLogWithSource()));
3005 EXPECT_EQ(
3006 OK, handle3.Init("a", params_, DEFAULT_PRIORITY,
3007 ClientSocketPool::RespectLimits::ENABLED,
3008 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223009
3010 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3011 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3012 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3013}
3014
[email protected]2c2bef152010-10-13 00:55:033015TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3016 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3017 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3018
tfarina428341112016-09-22 13:38:203019 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033020
3021 ASSERT_TRUE(pool_->HasGroup("a"));
3022 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103023 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033024 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3025
3026 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523027 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203028 EXPECT_EQ(
3029 ERR_IO_PENDING,
3030 handle1.Init("a", params_, DEFAULT_PRIORITY,
3031 ClientSocketPool::RespectLimits::ENABLED,
3032 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033033
3034 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523035 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203036 EXPECT_EQ(
3037 ERR_IO_PENDING,
3038 handle2.Init("a", params_, DEFAULT_PRIORITY,
3039 ClientSocketPool::RespectLimits::ENABLED,
3040 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033041
3042 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103043 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033044 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3045
robpercival214763f2016-07-01 23:27:013046 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3047 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033048 handle1.Reset();
3049 handle2.Reset();
3050
3051 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103052 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033053 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3054}
3055
3056TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3057 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3058 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3059
3060 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523061 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203062 EXPECT_EQ(
3063 ERR_IO_PENDING,
3064 handle1.Init("a", params_, DEFAULT_PRIORITY,
3065 ClientSocketPool::RespectLimits::ENABLED,
3066 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033067
3068 ASSERT_TRUE(pool_->HasGroup("a"));
3069 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103070 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033071 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3072
tfarina428341112016-09-22 13:38:203073 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033074
3075 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103076 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033077 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3078
3079 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523080 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203081 EXPECT_EQ(
3082 ERR_IO_PENDING,
3083 handle2.Init("a", params_, DEFAULT_PRIORITY,
3084 ClientSocketPool::RespectLimits::ENABLED,
3085 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033086
3087 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103088 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033089 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3090
robpercival214763f2016-07-01 23:27:013091 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3092 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033093 handle1.Reset();
3094 handle2.Reset();
3095
3096 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103097 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033098 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3099}
3100
3101TEST_F(ClientSocketPoolBaseTest,
3102 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3103 CreatePool(4, 4);
3104 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3105
3106 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523107 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203108 EXPECT_EQ(
3109 ERR_IO_PENDING,
3110 handle1.Init("a", params_, DEFAULT_PRIORITY,
3111 ClientSocketPool::RespectLimits::ENABLED,
3112 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033113
3114 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523115 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203116 EXPECT_EQ(
3117 ERR_IO_PENDING,
3118 handle2.Init("a", params_, DEFAULT_PRIORITY,
3119 ClientSocketPool::RespectLimits::ENABLED,
3120 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033121
3122 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523123 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203124 EXPECT_EQ(
3125 ERR_IO_PENDING,
3126 handle3.Init("a", params_, DEFAULT_PRIORITY,
3127 ClientSocketPool::RespectLimits::ENABLED,
3128 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033129
3130 ASSERT_TRUE(pool_->HasGroup("a"));
3131 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103132 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033133 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3134
tfarina428341112016-09-22 13:38:203135 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033136
3137 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103138 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033139 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3140
robpercival214763f2016-07-01 23:27:013141 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3142 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3143 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033144 handle1.Reset();
3145 handle2.Reset();
3146 handle3.Reset();
3147
3148 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103149 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033150 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3151}
3152
3153TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3154 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3155 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3156
3157 ASSERT_FALSE(pool_->HasGroup("a"));
3158
tfarina428341112016-09-22 13:38:203159 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033160
3161 ASSERT_TRUE(pool_->HasGroup("a"));
3162 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103163 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033164
3165 ASSERT_FALSE(pool_->HasGroup("b"));
3166
tfarina428341112016-09-22 13:38:203167 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033168
3169 ASSERT_FALSE(pool_->HasGroup("b"));
3170}
3171
3172TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3173 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3174 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3175
3176 ASSERT_FALSE(pool_->HasGroup("a"));
3177
3178 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
tfarina428341112016-09-22 13:38:203179 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033180
3181 ASSERT_TRUE(pool_->HasGroup("a"));
3182 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103183 EXPECT_EQ(kDefaultMaxSockets - 1,
3184 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483185 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033186
3187 ASSERT_FALSE(pool_->HasGroup("b"));
3188
tfarina428341112016-09-22 13:38:203189 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033190
3191 ASSERT_TRUE(pool_->HasGroup("b"));
3192 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483193 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033194}
3195
3196TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3197 CreatePool(4, 4);
3198 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3199
3200 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523201 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203202 EXPECT_EQ(
3203 ERR_IO_PENDING,
3204 handle1.Init("a", params_, DEFAULT_PRIORITY,
3205 ClientSocketPool::RespectLimits::ENABLED,
3206 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013207 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033208 handle1.Reset();
3209
3210 ASSERT_TRUE(pool_->HasGroup("a"));
3211 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103212 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033213 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3214
tfarina428341112016-09-22 13:38:203215 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033216
3217 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103218 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033219 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3220}
3221
3222TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3223 CreatePool(4, 4);
3224 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3225
3226 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523227 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203228 EXPECT_EQ(
3229 ERR_IO_PENDING,
3230 handle1.Init("a", params_, DEFAULT_PRIORITY,
3231 ClientSocketPool::RespectLimits::ENABLED,
3232 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013233 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033234
3235 ASSERT_TRUE(pool_->HasGroup("a"));
3236 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103237 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033238 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3239 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3240
tfarina428341112016-09-22 13:38:203241 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033242
3243 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103244 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033245 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3246 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3247}
3248
3249TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3250 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3251 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3252
3253 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203254 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033255
3256 ASSERT_TRUE(pool_->HasGroup("a"));
3257 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103258 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033259 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3260
3261 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203262 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033263
3264 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103265 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033266 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3267}
3268
[email protected]3c819f522010-12-02 02:03:123269TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3270 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3271 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3272
3273 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203274 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123275
3276 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523277
3278 connect_job_factory_->set_job_type(
3279 TestConnectJob::kMockAdditionalErrorStateJob);
3280 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203281 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523282
3283 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123284}
3285
[email protected]8159a1c2012-06-07 00:00:103286TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033287 CreatePool(4, 4);
3288 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3289
tfarina428341112016-09-22 13:38:203290 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033291
3292 ASSERT_TRUE(pool_->HasGroup("a"));
3293 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103294 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033295 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3296
tfarina428341112016-09-22 13:38:203297 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033298 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103299 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033300 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3301
3302 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523303 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203304 EXPECT_EQ(
3305 ERR_IO_PENDING,
3306 handle1.Init("a", params_, DEFAULT_PRIORITY,
3307 ClientSocketPool::RespectLimits::ENABLED,
3308 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013309 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033310
3311 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523312 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153313 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
3314 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203315 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033316 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013317 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3318 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033319 }
3320
[email protected]8159a1c2012-06-07 00:00:103321 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3322 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3323 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3324 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3325
[email protected]2c2bef152010-10-13 00:55:033326 handle1.Reset();
3327 handle2.Reset();
3328
[email protected]8159a1c2012-06-07 00:00:103329 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3330 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033331 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3332
tfarina428341112016-09-22 13:38:203333 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033334 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103335 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033336 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3337}
3338
3339TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3340 CreatePool(4, 4);
3341 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3342
tfarina428341112016-09-22 13:38:203343 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033344
3345 ASSERT_TRUE(pool_->HasGroup("a"));
3346 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103347 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033348 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3349
tfarina428341112016-09-22 13:38:203350 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033351 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103352 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033353 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3354
tfarina428341112016-09-22 13:38:203355 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033356 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103357 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033358 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3359
tfarina428341112016-09-22 13:38:203360 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033361 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103362 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033363 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3364}
3365
3366TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3367 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3368 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3369
tfarina428341112016-09-22 13:38:203370 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033371
3372 ASSERT_TRUE(pool_->HasGroup("a"));
3373 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103374 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033375 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3376
3377 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523378 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203379 EXPECT_EQ(
3380 ERR_IO_PENDING,
3381 handle1.Init("a", params_, DEFAULT_PRIORITY,
3382 ClientSocketPool::RespectLimits::ENABLED,
3383 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033384
3385 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103386 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033387 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3388
robpercival214763f2016-07-01 23:27:013389 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033390
[email protected]0dc88b32014-03-26 20:12:283391 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483392 // starts, it has a connect start time.
3393 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033394 handle1.Reset();
3395
3396 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3397}
3398
[email protected]034df0f32013-01-07 23:17:483399// Checks that fully connected preconnect jobs have no connect times, and are
3400// marked as reused.
3401TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3402 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3403 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
tfarina428341112016-09-22 13:38:203404 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483405
3406 ASSERT_TRUE(pool_->HasGroup("a"));
3407 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3408 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3409 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3410
3411 ClientSocketHandle handle;
3412 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203413 EXPECT_EQ(OK,
3414 handle.Init("a", params_, DEFAULT_PRIORITY,
3415 ClientSocketPool::RespectLimits::ENABLED,
3416 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483417
3418 // Make sure the idle socket was used.
3419 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3420
3421 TestLoadTimingInfoConnectedReused(handle);
3422 handle.Reset();
3423 TestLoadTimingInfoNotConnected(handle);
3424}
3425
[email protected]dcbe168a2010-12-02 03:14:463426// http://crbug.com/64940 regression test.
3427TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3428 const int kMaxTotalSockets = 3;
3429 const int kMaxSocketsPerGroup = 2;
3430 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3431 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3432
3433 // Note that group name ordering matters here. "a" comes before "b", so
3434 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3435
3436 // Set up one idle socket in "a".
3437 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523438 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203439 EXPECT_EQ(
3440 ERR_IO_PENDING,
3441 handle1.Init("a", params_, DEFAULT_PRIORITY,
3442 ClientSocketPool::RespectLimits::ENABLED,
3443 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463444
robpercival214763f2016-07-01 23:27:013445 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463446 handle1.Reset();
3447 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3448
3449 // Set up two active sockets in "b".
3450 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523451 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203452 EXPECT_EQ(
3453 ERR_IO_PENDING,
3454 handle1.Init("b", params_, DEFAULT_PRIORITY,
3455 ClientSocketPool::RespectLimits::ENABLED,
3456 callback1.callback(), pool_.get(), NetLogWithSource()));
3457 EXPECT_EQ(
3458 ERR_IO_PENDING,
3459 handle2.Init("b", params_, DEFAULT_PRIORITY,
3460 ClientSocketPool::RespectLimits::ENABLED,
3461 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463462
robpercival214763f2016-07-01 23:27:013463 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3464 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463465 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103466 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463467 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3468
3469 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3470 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3471 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3472 // sockets for "a", and "b" should still have 2 active sockets.
3473
tfarina428341112016-09-22 13:38:203474 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463475 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103476 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463477 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3478 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3479 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103480 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463481 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3482 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3483
3484 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3485 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3486 // "a" should result in closing 1 for "b".
3487 handle1.Reset();
3488 handle2.Reset();
3489 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3490 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3491
tfarina428341112016-09-22 13:38:203492 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463493 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103494 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463495 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3496 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3497 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103498 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463499 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3500 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3501}
3502
[email protected]b7b8be42011-07-12 12:46:413503TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073504 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3505 pool_->EnableConnectBackupJobs();
3506
3507 // Make the ConnectJob hang until it times out, shorten the timeout.
3508 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3509 connect_job_factory_->set_timeout_duration(
3510 base::TimeDelta::FromMilliseconds(500));
tfarina428341112016-09-22 13:38:203511 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073512 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103513 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073514 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073515
[email protected]b7b8be42011-07-12 12:46:413516 // Verify the backup timer doesn't create a backup job, by making
3517 // the backup job a pending job instead of a waiting job, so it
3518 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073519 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453520 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173521 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343522 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283523 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073524 EXPECT_FALSE(pool_->HasGroup("a"));
3525}
3526
[email protected]b7b8be42011-07-12 12:46:413527TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073528 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3529 pool_->EnableConnectBackupJobs();
3530
3531 // Make the ConnectJob hang forever.
3532 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
tfarina428341112016-09-22 13:38:203533 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073534 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103535 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073536 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283537 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073538
3539 // Make the backup job be a pending job, so it completes normally.
3540 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3541 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523542 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153543 EXPECT_EQ(ERR_IO_PENDING,
3544 handle.Init("a", params_, DEFAULT_PRIORITY,
3545 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203546 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413547 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073548 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103549 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073550 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3551 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013552 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073553
3554 // The hung connect job should still be there, but everything else should be
3555 // complete.
3556 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103557 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073558 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3559 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3560}
3561
[email protected]0dc88b32014-03-26 20:12:283562// Tests that a preconnect that starts out with unread data can still be used.
3563// http://crbug.com/334467
3564TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3565 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3566 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3567
tfarina428341112016-09-22 13:38:203568 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283569
3570 ASSERT_TRUE(pool_->HasGroup("a"));
3571 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3572 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3573 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3574
3575 // Fail future jobs to be sure that handle receives the preconnected socket
3576 // rather than closing it and making a new one.
3577 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3578 ClientSocketHandle handle;
3579 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203580 EXPECT_EQ(OK,
3581 handle.Init("a", params_, DEFAULT_PRIORITY,
3582 ClientSocketPool::RespectLimits::ENABLED,
3583 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283584
3585 ASSERT_TRUE(pool_->HasGroup("a"));
3586 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3587 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3588 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3589
3590 // Drain the pending read.
3591 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3592
3593 TestLoadTimingInfoConnectedReused(handle);
3594 handle.Reset();
3595
3596 // The socket should be usable now that it's idle again.
3597 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3598}
3599
[email protected]043b68c82013-08-22 23:41:523600class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203601 public:
3602 MockLayeredPool(TestClientSocketPool* pool,
3603 const std::string& group_name)
3604 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203605 group_name_(group_name),
3606 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523607 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203608 }
3609
3610 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523611 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203612 }
3613
3614 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153615 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073616 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:153617 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203618 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203619 }
3620
3621 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153622 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073623 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:153624 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203625 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203626 }
3627
3628 bool ReleaseOneConnection() {
3629 if (!handle_.is_initialized() || !can_release_connection_) {
3630 return false;
3631 }
3632 handle_.socket()->Disconnect();
3633 handle_.Reset();
3634 return true;
3635 }
3636
3637 void set_can_release_connection(bool can_release_connection) {
3638 can_release_connection_ = can_release_connection;
3639 }
3640
3641 MOCK_METHOD0(CloseOneIdleConnection, bool());
3642
3643 private:
3644 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203645 ClientSocketHandle handle_;
3646 TestCompletionCallback callback_;
3647 const std::string group_name_;
3648 bool can_release_connection_;
3649};
3650
3651TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3652 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3653 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3654
3655 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013656 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203657 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3658 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523659 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203660}
3661
3662TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
xunjieli26619e72016-11-23 19:39:553663 base::HistogramTester histograms;
[email protected]58e562f2013-04-22 17:32:203664 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3665 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3666
3667 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013668 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203669 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3670 .WillOnce(Invoke(&mock_layered_pool,
3671 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523672 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
xunjieli26619e72016-11-23 19:39:553673 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
3674 testing::ElementsAre(
3675 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 1)));
[email protected]58e562f2013-04-22 17:32:203676}
3677
3678// Tests the basic case of closing an idle socket in a higher layered pool when
3679// a new request is issued and the lower layer pool is stalled.
3680TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3681 CreatePool(1, 1);
3682 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3683
3684 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013685 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203686 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3687 .WillOnce(Invoke(&mock_layered_pool,
3688 &MockLayeredPool::ReleaseOneConnection));
3689 ClientSocketHandle handle;
3690 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153691 EXPECT_EQ(ERR_IO_PENDING,
3692 handle.Init("a", params_, DEFAULT_PRIORITY,
3693 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203694 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013695 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203696}
3697
3698// Same as above, but the idle socket is in the same group as the stalled
3699// socket, and closes the only other request in its group when closing requests
3700// in higher layered pools. This generally shouldn't happen, but it may be
3701// possible if a higher level pool issues a request and the request is
3702// subsequently cancelled. Even if it's not possible, best not to crash.
3703TEST_F(ClientSocketPoolBaseTest,
3704 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3705 CreatePool(2, 2);
3706 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3707
3708 // Need a socket in another group for the pool to be stalled (If a group
3709 // has the maximum number of connections already, it's not stalled).
3710 ClientSocketHandle handle1;
3711 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203712 EXPECT_EQ(
3713 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3714 ClientSocketPool::RespectLimits::ENABLED,
3715 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203716
3717 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013718 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203719 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3720 .WillOnce(Invoke(&mock_layered_pool,
3721 &MockLayeredPool::ReleaseOneConnection));
3722 ClientSocketHandle handle;
3723 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153724 EXPECT_EQ(ERR_IO_PENDING,
3725 handle.Init("group2", params_, DEFAULT_PRIORITY,
3726 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203727 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013728 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203729}
3730
3731// Tests the case when an idle socket can be closed when a new request is
3732// issued, and the new request belongs to a group that was previously stalled.
3733TEST_F(ClientSocketPoolBaseTest,
3734 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3735 CreatePool(2, 2);
3736 std::list<TestConnectJob::JobType> job_types;
3737 job_types.push_back(TestConnectJob::kMockJob);
3738 job_types.push_back(TestConnectJob::kMockJob);
3739 job_types.push_back(TestConnectJob::kMockJob);
3740 job_types.push_back(TestConnectJob::kMockJob);
3741 connect_job_factory_->set_job_types(&job_types);
3742
3743 ClientSocketHandle handle1;
3744 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203745 EXPECT_EQ(
3746 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3747 ClientSocketPool::RespectLimits::ENABLED,
3748 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203749
3750 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013751 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203752 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3753 .WillRepeatedly(Invoke(&mock_layered_pool,
3754 &MockLayeredPool::ReleaseOneConnection));
3755 mock_layered_pool.set_can_release_connection(false);
3756
3757 // The third request is made when the socket pool is in a stalled state.
3758 ClientSocketHandle handle3;
3759 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203760 EXPECT_EQ(
3761 ERR_IO_PENDING,
3762 handle3.Init("group3", params_, DEFAULT_PRIORITY,
3763 ClientSocketPool::RespectLimits::ENABLED,
3764 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203765
3766 base::RunLoop().RunUntilIdle();
3767 EXPECT_FALSE(callback3.have_result());
3768
3769 // The fourth request is made when the pool is no longer stalled. The third
3770 // request should be serviced first, since it was issued first and has the
3771 // same priority.
3772 mock_layered_pool.set_can_release_connection(true);
3773 ClientSocketHandle handle4;
3774 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203775 EXPECT_EQ(
3776 ERR_IO_PENDING,
3777 handle4.Init("group3", params_, DEFAULT_PRIORITY,
3778 ClientSocketPool::RespectLimits::ENABLED,
3779 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013780 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203781 EXPECT_FALSE(callback4.have_result());
3782
3783 // Closing a handle should free up another socket slot.
3784 handle1.Reset();
robpercival214763f2016-07-01 23:27:013785 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203786}
3787
3788// Tests the case when an idle socket can be closed when a new request is
3789// issued, and the new request belongs to a group that was previously stalled.
3790//
3791// The two differences from the above test are that the stalled requests are not
3792// in the same group as the layered pool's request, and the the fourth request
3793// has a higher priority than the third one, so gets a socket first.
3794TEST_F(ClientSocketPoolBaseTest,
3795 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3796 CreatePool(2, 2);
3797 std::list<TestConnectJob::JobType> job_types;
3798 job_types.push_back(TestConnectJob::kMockJob);
3799 job_types.push_back(TestConnectJob::kMockJob);
3800 job_types.push_back(TestConnectJob::kMockJob);
3801 job_types.push_back(TestConnectJob::kMockJob);
3802 connect_job_factory_->set_job_types(&job_types);
3803
3804 ClientSocketHandle handle1;
3805 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203806 EXPECT_EQ(
3807 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3808 ClientSocketPool::RespectLimits::ENABLED,
3809 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203810
3811 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013812 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203813 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3814 .WillRepeatedly(Invoke(&mock_layered_pool,
3815 &MockLayeredPool::ReleaseOneConnection));
3816 mock_layered_pool.set_can_release_connection(false);
3817
3818 // The third request is made when the socket pool is in a stalled state.
3819 ClientSocketHandle handle3;
3820 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203821 EXPECT_EQ(
3822 ERR_IO_PENDING,
3823 handle3.Init("group3", params_, MEDIUM,
3824 ClientSocketPool::RespectLimits::ENABLED,
3825 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203826
3827 base::RunLoop().RunUntilIdle();
3828 EXPECT_FALSE(callback3.have_result());
3829
3830 // The fourth request is made when the pool is no longer stalled. This
3831 // request has a higher priority than the third request, so is serviced first.
3832 mock_layered_pool.set_can_release_connection(true);
3833 ClientSocketHandle handle4;
3834 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203835 EXPECT_EQ(
3836 ERR_IO_PENDING,
3837 handle4.Init("group3", params_, HIGHEST,
3838 ClientSocketPool::RespectLimits::ENABLED,
3839 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013840 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203841 EXPECT_FALSE(callback3.have_result());
3842
3843 // Closing a handle should free up another socket slot.
3844 handle1.Reset();
robpercival214763f2016-07-01 23:27:013845 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203846}
3847
3848TEST_F(ClientSocketPoolBaseTest,
3849 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3850 CreatePool(1, 1);
3851 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3852
3853 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013854 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203855 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3856 .WillRepeatedly(Invoke(&mock_layered_pool1,
3857 &MockLayeredPool::ReleaseOneConnection));
3858 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013859 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3860 IsOk());
[email protected]58e562f2013-04-22 17:32:203861 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3862 .WillRepeatedly(Invoke(&mock_layered_pool2,
3863 &MockLayeredPool::ReleaseOneConnection));
3864 ClientSocketHandle handle;
3865 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153866 EXPECT_EQ(ERR_IO_PENDING,
3867 handle.Init("a", params_, DEFAULT_PRIORITY,
3868 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203869 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013870 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203871}
3872
[email protected]b021ece62013-06-11 11:06:333873// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153874// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3875// socket instead of a request with the same priority that was issued earlier,
3876// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333877TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333878 CreatePool(1, 1);
3879
3880 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153881 EXPECT_EQ(
3882 OK, StartRequestWithIgnoreLimits(
3883 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333884 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3885
3886 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3887
mmenked3641e12016-01-28 16:06:153888 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3889 "a", MAXIMUM_PRIORITY,
3890 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333891 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3892
mmenked3641e12016-01-28 16:06:153893 // Issue a request that ignores the limits, so a new ConnectJob is
3894 // created.
3895 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3896 "a", MAXIMUM_PRIORITY,
3897 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333898 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3899
robpercival214763f2016-07-01 23:27:013900 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333901 EXPECT_FALSE(request(1)->have_result());
3902}
3903
[email protected]c55fabd2013-11-04 23:26:563904// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153905// issued for a request with RespectLimits::DISABLED is not cancelled when a
3906// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563907TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563908 CreatePool(1, 1);
3909
3910 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153911 EXPECT_EQ(
3912 OK, StartRequestWithIgnoreLimits(
3913 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563914 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3915
3916 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3917
mmenked3641e12016-01-28 16:06:153918 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3919 "a", MAXIMUM_PRIORITY,
3920 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563921 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3922
mmenked3641e12016-01-28 16:06:153923 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
3924 // created.
3925 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3926 "a", MAXIMUM_PRIORITY,
3927 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333928 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3929
mmenked3641e12016-01-28 16:06:153930 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:333931 // should not be cancelled.
3932 request(1)->handle()->Reset();
3933 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3934
robpercival214763f2016-07-01 23:27:013935 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333936 EXPECT_FALSE(request(1)->have_result());
3937}
3938
[email protected]f6d1d6eb2009-06-24 20:16:093939} // namespace
3940
3941} // namespace net