blob: 49300118baf9e10dbeeb35b0e27bea258f96e755 [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
[email protected]51fdc7c2012-04-10 19:19:487#include <vector>
8
[email protected]6ecf2b92011-12-15 01:14:529#include "base/bind.h"
10#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5911#include "base/callback.h"
mmenke33d24423d2015-05-19 19:41:0912#include "base/logging.h"
[email protected]3b63f8f42011-03-28 01:54:1513#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_vector.h"
[email protected]6ea7b152011-12-21 21:21:1315#include "base/memory/weak_ptr.h"
[email protected]18b577412013-07-18 04:19:1516#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4817#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5118#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1519#include "base/strings/stringprintf.h"
[email protected]f214f8792011-01-01 02:17:0820#include "base/threading/platform_thread.h"
[email protected]f3a1c642011-07-12 19:15:0321#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4822#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5923#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0624#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3125#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0926#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3527#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0728#include "net/log/net_log.h"
mmenke16a7cbdd2015-04-24 23:00:5629#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4630#include "net/log/test_net_log_entry.h"
31#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0932#include "net/socket/client_socket_factory.h"
33#include "net/socket/client_socket_handle.h"
[email protected]75439d3b2009-07-23 22:11:1734#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4435#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1036#include "net/socket/stream_socket.h"
[email protected]18ccfdb2013-08-15 00:13:4437#include "net/udp/datagram_client_socket.h"
[email protected]51fdc7c2012-04-10 19:19:4838#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0939#include "testing/gtest/include/gtest/gtest.h"
40
[email protected]51fdc7c2012-04-10 19:19:4841using ::testing::Invoke;
42using ::testing::Return;
43
[email protected]f6d1d6eb2009-06-24 20:16:0944namespace net {
45
46namespace {
47
[email protected]211d21722009-07-22 15:48:5348const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2049const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0150
[email protected]034df0f32013-01-07 23:17:4851// Make sure |handle| sets load times correctly when it has been assigned a
52// reused socket.
53void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
54 LoadTimingInfo load_timing_info;
55 // Only pass true in as |is_reused|, as in general, HttpStream types should
56 // have stricter concepts of reuse than socket pools.
57 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
58
59 EXPECT_EQ(true, load_timing_info.socket_reused);
60 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
61
[email protected]b258e0792013-01-12 07:11:5962 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
63 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4864}
65
66// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3367// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4868// of a connection where |is_reused| is false may consider the connection
69// reused.
70void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
71 EXPECT_FALSE(handle.is_reused());
72
73 LoadTimingInfo load_timing_info;
74 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
75
76 EXPECT_FALSE(load_timing_info.socket_reused);
77 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
78
[email protected]b258e0792013-01-12 07:11:5979 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
80 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
81 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4882
83 TestLoadTimingInfoConnectedReused(handle);
84}
85
86// Make sure |handle| sets load times correctly, in the case that it does not
87// currently have a socket.
88void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
89 // Should only be set to true once a socket is assigned, if at all.
90 EXPECT_FALSE(handle.is_reused());
91
92 LoadTimingInfo load_timing_info;
93 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
94
95 EXPECT_FALSE(load_timing_info.socket_reused);
96 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
97
[email protected]b258e0792013-01-12 07:11:5998 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
99 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48100}
101
[email protected]df4b4ef2010-07-12 18:25:21102class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20103 public:
[email protected]bb1c4662013-11-14 00:00:07104 explicit TestSocketParams(bool ignore_limits)
105 : ignore_limits_(ignore_limits) {}
[email protected]51fdc7c2012-04-10 19:19:48106
[email protected]51fdc7c2012-04-10 19:19:48107 bool ignore_limits() { return ignore_limits_; }
108
[email protected]df4b4ef2010-07-12 18:25:21109 private:
110 friend class base::RefCounted<TestSocketParams>;
111 ~TestSocketParams() {}
[email protected]51fdc7c2012-04-10 19:19:48112
[email protected]bb1c4662013-11-14 00:00:07113 const bool ignore_limits_;
[email protected]df4b4ef2010-07-12 18:25:21114};
[email protected]7fc5b09a2010-02-27 00:07:38115typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49116
[email protected]3268023f2011-05-05 00:08:10117class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09118 public:
[email protected]034df0f32013-01-07 23:17:48119 explicit MockClientSocket(net::NetLog* net_log)
120 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28121 has_unread_data_(false),
ttuttle859dc7a2015-04-23 19:42:29122 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)),
123 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09124
[email protected]0dc88b32014-03-26 20:12:28125 // Sets whether the socket has unread data. If true, the next call to Read()
126 // will return 1 byte and IsConnectedAndIdle() will return false.
127 void set_has_unread_data(bool has_unread_data) {
128 has_unread_data_ = has_unread_data;
129 }
130
[email protected]3f55aa12011-12-07 02:03:33131 // Socket implementation.
dchengb03027d2014-10-21 12:00:20132 int Read(IOBuffer* /* buf */,
133 int len,
134 const CompletionCallback& /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28135 if (has_unread_data_ && len > 0) {
136 has_unread_data_ = false;
137 was_used_to_convey_data_ = true;
138 return 1;
139 }
[email protected]e86df8dc2013-03-30 13:18:28140 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33141 }
[email protected]ab838892009-06-30 18:49:05142
dchengb03027d2014-10-21 12:00:20143 int Write(IOBuffer* /* buf */,
144 int len,
145 const CompletionCallback& /* callback */) override {
[email protected]0f873e82010-09-02 16:09:01146 was_used_to_convey_data_ = true;
147 return len;
[email protected]ab838892009-06-30 18:49:05148 }
dchengb03027d2014-10-21 12:00:20149 int SetReceiveBufferSize(int32 size) override { return OK; }
150 int SetSendBufferSize(int32 size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05151
[email protected]dbf036f2011-12-06 23:33:24152 // StreamSocket implementation.
dchengb03027d2014-10-21 12:00:20153 int Connect(const CompletionCallback& callback) override {
[email protected]dbf036f2011-12-06 23:33:24154 connected_ = true;
155 return OK;
156 }
[email protected]f6d1d6eb2009-06-24 20:16:09157
dchengb03027d2014-10-21 12:00:20158 void Disconnect() override { connected_ = false; }
159 bool IsConnected() const override { return connected_; }
160 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28161 return connected_ && !has_unread_data_;
162 }
[email protected]0b7648c2009-07-06 20:14:01163
dchengb03027d2014-10-21 12:00:20164 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16165 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09166 }
[email protected]f6d1d6eb2009-06-24 20:16:09167
dchengb03027d2014-10-21 12:00:20168 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35169 return ERR_UNEXPECTED;
170 }
171
dchengb03027d2014-10-21 12:00:20172 const BoundNetLog& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02173
dchengb03027d2014-10-21 12:00:20174 void SetSubresourceSpeculation() override {}
175 void SetOmniboxSpeculation() override {}
176 bool WasEverUsed() const override { return was_used_to_convey_data_; }
177 bool UsingTCPFastOpen() const override { return false; }
178 bool WasNpnNegotiated() const override { return false; }
179 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
180 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03181 void GetConnectionAttempts(ConnectionAttempts* out) const override {
182 out->clear();
183 }
184 void ClearConnectionAttempts() override {}
185 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
[email protected]9b5614a2010-08-25 20:29:45186
[email protected]f6d1d6eb2009-06-24 20:16:09187 private:
188 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28189 bool has_unread_data_;
[email protected]a2006ece2010-04-23 16:44:02190 BoundNetLog net_log_;
[email protected]0f873e82010-09-02 16:09:01191 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09192
[email protected]ab838892009-06-30 18:49:05193 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09194};
195
[email protected]5fc08e32009-07-15 17:09:57196class TestConnectJob;
197
[email protected]f6d1d6eb2009-06-24 20:16:09198class MockClientSocketFactory : public ClientSocketFactory {
199 public:
[email protected]ab838892009-06-30 18:49:05200 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09201
dchengb03027d2014-10-21 12:00:20202 scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04203 DatagramSocket::BindType bind_type,
204 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41205 NetLog* net_log,
mostynbba063d6032014-10-09 11:01:13206 const NetLog::Source& source) override {
[email protected]98b0e582011-06-22 14:31:41207 NOTREACHED();
[email protected]18ccfdb2013-08-15 00:13:44208 return scoped_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41209 }
210
dchengb03027d2014-10-21 12:00:20211 scoped_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07212 const AddressList& addresses,
213 NetLog* /* net_log */,
mostynbba063d6032014-10-09 11:01:13214 const NetLog::Source& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09215 allocation_count_++;
[email protected]18ccfdb2013-08-15 00:13:44216 return scoped_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09217 }
218
dchengb03027d2014-10-21 12:00:20219 scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
[email protected]18ccfdb2013-08-15 00:13:44220 scoped_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27221 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21222 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13223 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09224 NOTIMPLEMENTED();
[email protected]18ccfdb2013-08-15 00:13:44225 return scoped_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09226 }
227
dchengb03027d2014-10-21 12:00:20228 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59229
[email protected]5fc08e32009-07-15 17:09:57230 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55231
[email protected]5fc08e32009-07-15 17:09:57232 void SignalJobs();
233
[email protected]03b7c8c2013-07-20 04:38:55234 void SignalJob(size_t job);
235
236 void SetJobLoadState(size_t job, LoadState load_state);
237
[email protected]f6d1d6eb2009-06-24 20:16:09238 int allocation_count() const { return allocation_count_; }
239
[email protected]f6d1d6eb2009-06-24 20:16:09240 private:
241 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57242 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09243};
244
[email protected]ab838892009-06-30 18:49:05245class TestConnectJob : public ConnectJob {
246 public:
247 enum JobType {
248 kMockJob,
249 kMockFailingJob,
250 kMockPendingJob,
251 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57252 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13253 kMockRecoverableJob,
254 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18255 kMockAdditionalErrorStateJob,
256 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28257 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05258 };
259
[email protected]994d4932010-07-12 17:55:13260 // The kMockPendingJob uses a slight delay before allowing the connect
261 // to complete.
262 static const int kPendingConnectDelay = 2;
263
[email protected]ab838892009-06-30 18:49:05264 TestConnectJob(JobType job_type,
265 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49266 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34267 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05268 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30269 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17270 NetLog* net_log)
[email protected]3f6007ab2013-08-22 19:45:39271 : ConnectJob(group_name, timeout_duration, request.priority(), delegate,
[email protected]06650c52010-06-03 00:49:17272 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58273 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05274 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18275 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39276 store_additional_error_state_(false),
277 weak_factory_(this) {
278 }
[email protected]ab838892009-06-30 18:49:05279
[email protected]974ebd62009-08-03 23:14:34280 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13281 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34282 }
283
[email protected]03b7c8c2013-07-20 04:38:55284 void set_load_state(LoadState load_state) { load_state_ = load_state; }
285
286 // From ConnectJob:
287
dchengb03027d2014-10-21 12:00:20288 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21289
dchengb03027d2014-10-21 12:00:20290 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18291 if (store_additional_error_state_) {
292 // Set all of the additional error state fields in some way.
293 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43294 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45295 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43296 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18297 }
298 }
299
[email protected]974ebd62009-08-03 23:14:34300 private:
[email protected]03b7c8c2013-07-20 04:38:55301 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05302
dchengb03027d2014-10-21 12:00:20303 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05304 AddressList ignored;
ttuttle859dc7a2015-04-23 19:42:29305 client_socket_factory_->CreateTransportClientSocket(ignored, NULL,
306 NetLog::Source());
[email protected]18ccfdb2013-08-15 00:13:44307 SetSocket(
308 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05309 switch (job_type_) {
310 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13311 return DoConnect(true /* successful */, false /* sync */,
312 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05313 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13314 return DoConnect(false /* error */, false /* sync */,
315 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05316 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57317 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47318
319 // Depending on execution timings, posting a delayed task can result
320 // in the task getting executed the at the earliest possible
321 // opportunity or only after returning once from the message loop and
322 // then a second call into the message loop. In order to make behavior
323 // more deterministic, we change the default delay to 2ms. This should
324 // always require us to wait for the second call into the message loop.
325 //
326 // N.B. The correct fix for this and similar timing problems is to
327 // abstract time for the purpose of unittests. Unfortunately, we have
328 // a lot of third-party components that directly call the various
329 // time functions, so this change would be rather invasive.
[email protected]2da659e2013-05-23 20:51:34330 base::MessageLoop::current()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05331 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13332 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
333 weak_factory_.GetWeakPtr(),
334 true /* successful */,
335 true /* async */,
336 false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53337 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05338 return ERR_IO_PENDING;
339 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57340 set_load_state(LOAD_STATE_CONNECTING);
[email protected]2da659e2013-05-23 20:51:34341 base::MessageLoop::current()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05342 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13343 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
344 weak_factory_.GetWeakPtr(),
345 false /* error */,
346 true /* async */,
347 false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53348 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05349 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57350 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55351 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57352 client_socket_factory_->WaitForSignal(this);
353 waiting_success_ = true;
354 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13355 case kMockRecoverableJob:
356 return DoConnect(false /* error */, false /* sync */,
357 true /* recoverable */);
358 case kMockPendingRecoverableJob:
359 set_load_state(LOAD_STATE_CONNECTING);
[email protected]2da659e2013-05-23 20:51:34360 base::MessageLoop::current()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13361 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13362 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
363 weak_factory_.GetWeakPtr(),
364 false /* error */,
365 true /* async */,
366 true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53367 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13368 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18369 case kMockAdditionalErrorStateJob:
370 store_additional_error_state_ = true;
371 return DoConnect(false /* error */, false /* sync */,
372 false /* recoverable */);
373 case kMockPendingAdditionalErrorStateJob:
374 set_load_state(LOAD_STATE_CONNECTING);
375 store_additional_error_state_ = true;
[email protected]2da659e2013-05-23 20:51:34376 base::MessageLoop::current()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18377 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13378 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
379 weak_factory_.GetWeakPtr(),
380 false /* error */,
381 true /* async */,
382 false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53383 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18384 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28385 case kMockUnreadDataJob: {
386 int ret = DoConnect(true /* successful */, false /* sync */,
387 false /* recoverable */);
388 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
389 return ret;
390 }
[email protected]ab838892009-06-30 18:49:05391 default:
392 NOTREACHED();
[email protected]18ccfdb2013-08-15 00:13:44393 SetSocket(scoped_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05394 return ERR_FAILED;
395 }
396 }
397
[email protected]e772db3f2010-07-12 18:11:13398 int DoConnect(bool succeed, bool was_async, bool recoverable) {
399 int result = OK;
[email protected]ab838892009-06-30 18:49:05400 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55401 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13402 } else if (recoverable) {
403 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40404 } else {
[email protected]e772db3f2010-07-12 18:11:13405 result = ERR_CONNECTION_FAILED;
[email protected]18ccfdb2013-08-15 00:13:44406 SetSocket(scoped_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05407 }
[email protected]2ab05b52009-07-01 23:57:58408
409 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30410 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05411 return result;
412 }
413
[email protected]5fc08e32009-07-15 17:09:57414 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05415 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57416 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21417 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18418 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05419
[email protected]d5492c52013-11-10 20:44:39420 base::WeakPtrFactory<TestConnectJob> weak_factory_;
421
[email protected]ab838892009-06-30 18:49:05422 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
423};
424
[email protected]d80a4322009-08-14 07:07:49425class TestConnectJobFactory
426 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05427 public:
[email protected]034df0f32013-01-07 23:17:48428 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
429 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05430 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48431 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48432 client_socket_factory_(client_socket_factory),
433 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33434 }
[email protected]ab838892009-06-30 18:49:05435
dchengb03027d2014-10-21 12:00:20436 ~TestConnectJobFactory() override {}
[email protected]ab838892009-06-30 18:49:05437
438 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
439
[email protected]51fdc7c2012-04-10 19:19:48440 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
441 job_types_ = job_types;
442 CHECK(!job_types_->empty());
443 }
444
[email protected]974ebd62009-08-03 23:14:34445 void set_timeout_duration(base::TimeDelta timeout_duration) {
446 timeout_duration_ = timeout_duration;
447 }
448
[email protected]3f55aa12011-12-07 02:03:33449 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55450
dchengb03027d2014-10-21 12:00:20451 scoped_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05452 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49453 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13454 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48455 EXPECT_TRUE(!job_types_ || !job_types_->empty());
456 TestConnectJob::JobType job_type = job_type_;
457 if (job_types_ && !job_types_->empty()) {
458 job_type = job_types_->front();
459 job_types_->pop_front();
460 }
[email protected]18ccfdb2013-08-15 00:13:44461 return scoped_ptr<ConnectJob>(new TestConnectJob(job_type,
462 group_name,
463 request,
464 timeout_duration_,
465 delegate,
466 client_socket_factory_,
467 net_log_));
[email protected]ab838892009-06-30 18:49:05468 }
469
dchengb03027d2014-10-21 12:00:20470 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26471 return timeout_duration_;
472 }
473
[email protected]ab838892009-06-30 18:49:05474 private:
475 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48476 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34477 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57478 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48479 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05480
481 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
482};
483
484class TestClientSocketPool : public ClientSocketPool {
485 public:
[email protected]12322e7e2013-08-15 17:49:26486 typedef TestSocketParams SocketParams;
487
[email protected]ab838892009-06-30 18:49:05488 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53489 int max_sockets,
[email protected]ab838892009-06-30 18:49:05490 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16491 base::TimeDelta unused_idle_socket_timeout,
492 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49493 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41494 : base_(NULL,
495 max_sockets,
496 max_sockets_per_group,
497 unused_idle_socket_timeout,
498 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38499 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05500
dchengb03027d2014-10-21 12:00:20501 ~TestClientSocketPool() override {}
[email protected]2431756e2010-09-29 20:26:13502
dchengb03027d2014-10-21 12:00:20503 int RequestSocket(const std::string& group_name,
504 const void* params,
ttuttle859dc7a2015-04-23 19:42:29505 RequestPriority priority,
dchengb03027d2014-10-21 12:00:20506 ClientSocketHandle* handle,
507 const CompletionCallback& callback,
508 const BoundNetLog& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21509 const scoped_refptr<TestSocketParams>* casted_socket_params =
510 static_cast<const scoped_refptr<TestSocketParams>*>(params);
511 return base_.RequestSocket(group_name, *casted_socket_params, priority,
512 handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05513 }
514
dchengb03027d2014-10-21 12:00:20515 void RequestSockets(const std::string& group_name,
516 const void* params,
517 int num_sockets,
518 const BoundNetLog& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03519 const scoped_refptr<TestSocketParams>* casted_params =
520 static_cast<const scoped_refptr<TestSocketParams>*>(params);
521
522 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
523 }
524
dchengb03027d2014-10-21 12:00:20525 void CancelRequest(const std::string& group_name,
526 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49527 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05528 }
529
dchengb03027d2014-10-21 12:00:20530 void ReleaseSocket(const std::string& group_name,
531 scoped_ptr<StreamSocket> socket,
532 int id) override {
[email protected]18ccfdb2013-08-15 00:13:44533 base_.ReleaseSocket(group_name, socket.Pass(), id);
[email protected]a7e38572010-06-07 18:22:24534 }
535
dchengb03027d2014-10-21 12:00:20536 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05537
dchengb03027d2014-10-21 12:00:20538 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48539
dchengb03027d2014-10-21 12:00:20540 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05541
dchengb03027d2014-10-21 12:00:20542 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05543
dchengb03027d2014-10-21 12:00:20544 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49545 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05546 }
547
dchengb03027d2014-10-21 12:00:20548 LoadState GetLoadState(const std::string& group_name,
549 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49550 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05551 }
552
dchengb03027d2014-10-21 12:00:20553 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52554 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48555 }
556
dchengb03027d2014-10-21 12:00:20557 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52558 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48559 }
560
ketan.goyalf84eda92015-06-03 10:53:36561 scoped_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59562 const std::string& name,
563 const std::string& type,
mostynbba063d6032014-10-09 11:01:13564 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27565 return base_.GetInfoAsValue(name, type);
566 }
567
dchengb03027d2014-10-21 12:00:20568 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26569 return base_.ConnectionTimeout();
570 }
571
[email protected]d80a4322009-08-14 07:07:49572 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20573
[email protected]8159a1c2012-06-07 00:00:10574 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
575 return base_.NumUnassignedConnectJobsInGroup(group_name);
576 }
577
[email protected]974ebd62009-08-03 23:14:34578 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49579 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34580 }
581
[email protected]2c2bef152010-10-13 00:55:03582 int NumActiveSocketsInGroup(const std::string& group_name) const {
583 return base_.NumActiveSocketsInGroup(group_name);
584 }
585
[email protected]2abfe90a2010-08-25 17:49:51586 bool HasGroup(const std::string& group_name) const {
587 return base_.HasGroup(group_name);
588 }
589
[email protected]9bf28db2009-08-29 01:35:16590 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
591
[email protected]06d94042010-08-25 01:45:22592 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54593
[email protected]043b68c82013-08-22 23:41:52594 bool CloseOneIdleConnectionInHigherLayeredPool() {
595 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48596 }
597
[email protected]ab838892009-06-30 18:49:05598 private:
[email protected]d80a4322009-08-14 07:07:49599 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05600
601 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
602};
603
[email protected]a937a06d2009-08-19 21:19:24604} // namespace
605
[email protected]a937a06d2009-08-19 21:19:24606namespace {
607
[email protected]5fc08e32009-07-15 17:09:57608void MockClientSocketFactory::SignalJobs() {
609 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
610 it != waiting_jobs_.end(); ++it) {
611 (*it)->Signal();
612 }
613 waiting_jobs_.clear();
614}
615
[email protected]03b7c8c2013-07-20 04:38:55616void MockClientSocketFactory::SignalJob(size_t job) {
617 ASSERT_LT(job, waiting_jobs_.size());
618 waiting_jobs_[job]->Signal();
619 waiting_jobs_.erase(waiting_jobs_.begin() + job);
620}
621
622void MockClientSocketFactory::SetJobLoadState(size_t job,
623 LoadState load_state) {
624 ASSERT_LT(job, waiting_jobs_.size());
625 waiting_jobs_[job]->set_load_state(load_state);
626}
627
[email protected]974ebd62009-08-03 23:14:34628class TestConnectJobDelegate : public ConnectJob::Delegate {
629 public:
630 TestConnectJobDelegate()
631 : have_result_(false), waiting_for_result_(false), result_(OK) {}
dchengb03027d2014-10-21 12:00:20632 ~TestConnectJobDelegate() override {}
[email protected]974ebd62009-08-03 23:14:34633
dchengb03027d2014-10-21 12:00:20634 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34635 result_ = result;
[email protected]18ccfdb2013-08-15 00:13:44636 scoped_ptr<ConnectJob> owned_job(job);
637 scoped_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07638 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44639 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34640 have_result_ = true;
641 if (waiting_for_result_)
[email protected]2da659e2013-05-23 20:51:34642 base::MessageLoop::current()->Quit();
[email protected]974ebd62009-08-03 23:14:34643 }
644
645 int WaitForResult() {
646 DCHECK(!waiting_for_result_);
647 while (!have_result_) {
648 waiting_for_result_ = true;
[email protected]2da659e2013-05-23 20:51:34649 base::MessageLoop::current()->Run();
[email protected]974ebd62009-08-03 23:14:34650 waiting_for_result_ = false;
651 }
652 have_result_ = false; // auto-reset for next callback
653 return result_;
654 }
655
656 private:
657 bool have_result_;
658 bool waiting_for_result_;
659 int result_;
660};
661
[email protected]2431756e2010-09-29 20:26:13662class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09663 protected:
[email protected]b89f7e42010-05-20 20:37:00664 ClientSocketPoolBaseTest()
rkaplowd90695c2015-03-25 22:12:41665 : params_(new TestSocketParams(false /* ignore_limits */)) {
[email protected]636b8252011-04-08 19:56:54666 connect_backup_jobs_enabled_ =
667 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
668 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
[email protected]64770b7d2011-11-16 04:30:41669 cleanup_timer_enabled_ =
670 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled();
[email protected]636b8252011-04-08 19:56:54671 }
[email protected]2431756e2010-09-29 20:26:13672
dcheng67be2b1f2014-10-27 21:47:29673 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54674 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
675 connect_backup_jobs_enabled_);
[email protected]64770b7d2011-11-16 04:30:41676 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(
677 cleanup_timer_enabled_);
[email protected]636b8252011-04-08 19:56:54678 }
[email protected]c9d6a1d2009-07-14 16:15:20679
[email protected]211d21722009-07-22 15:48:53680 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16681 CreatePoolWithIdleTimeouts(
682 max_sockets,
683 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30684 ClientSocketPool::unused_idle_socket_timeout(),
685 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16686 }
687
688 void CreatePoolWithIdleTimeouts(
689 int max_sockets, int max_sockets_per_group,
690 base::TimeDelta unused_idle_socket_timeout,
691 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20692 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48693 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
694 &net_log_);
[email protected]2431756e2010-09-29 20:26:13695 pool_.reset(new TestClientSocketPool(max_sockets,
696 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13697 unused_idle_socket_timeout,
698 used_idle_socket_timeout,
699 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20700 }
[email protected]f6d1d6eb2009-06-24 20:16:09701
[email protected]b021ece62013-06-11 11:06:33702 int StartRequestWithParams(
703 const std::string& group_name,
704 RequestPriority priority,
705 const scoped_refptr<TestSocketParams>& params) {
[email protected]12322e7e2013-08-15 17:49:26706 return test_base_.StartRequestUsingPool(
707 pool_.get(), group_name, priority, params);
[email protected]b021ece62013-06-11 11:06:33708 }
709
710 int StartRequest(const std::string& group_name, RequestPriority priority) {
711 return StartRequestWithParams(group_name, priority, params_);
[email protected]f6d1d6eb2009-06-24 20:16:09712 }
713
[email protected]2431756e2010-09-29 20:26:13714 int GetOrderOfRequest(size_t index) const {
715 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09716 }
717
[email protected]2431756e2010-09-29 20:26:13718 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
719 return test_base_.ReleaseOneConnection(keep_alive);
720 }
721
722 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
723 test_base_.ReleaseAllConnections(keep_alive);
724 }
725
726 TestSocketRequest* request(int i) { return test_base_.request(i); }
727 size_t requests_size() const { return test_base_.requests_size(); }
728 ScopedVector<TestSocketRequest>* requests() { return test_base_.requests(); }
729 size_t completion_count() const { return test_base_.completion_count(); }
730
vishal.b62985ca92015-04-17 08:45:51731 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54732 bool connect_backup_jobs_enabled_;
[email protected]64770b7d2011-11-16 04:30:41733 bool cleanup_timer_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09734 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04735 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21736 scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:13737 scoped_ptr<TestClientSocketPool> pool_;
738 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09739};
740
[email protected]974ebd62009-08-03 23:14:34741// Even though a timeout is specified, it doesn't time out on a synchronous
742// completion.
743TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
744 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06745 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49746 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07747 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
[email protected]2c2bef152010-10-13 00:55:03748 internal::ClientSocketPoolBaseHelper::NORMAL,
[email protected]5acdce12011-03-30 13:00:20749 false, params_, BoundNetLog());
[email protected]974ebd62009-08-03 23:14:34750 scoped_ptr<TestConnectJob> job(
751 new TestConnectJob(TestConnectJob::kMockJob,
[email protected]ec08bb22009-08-12 00:25:12752 "a",
[email protected]974ebd62009-08-03 23:14:34753 request,
754 base::TimeDelta::FromMicroseconds(1),
755 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30756 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17757 NULL));
[email protected]974ebd62009-08-03 23:14:34758 EXPECT_EQ(OK, job->Connect());
759}
760
761TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
762 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06763 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51764 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53765
[email protected]d80a4322009-08-14 07:07:49766 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07767 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
[email protected]2c2bef152010-10-13 00:55:03768 internal::ClientSocketPoolBaseHelper::NORMAL,
[email protected]5acdce12011-03-30 13:00:20769 false, params_, BoundNetLog());
[email protected]974ebd62009-08-03 23:14:34770 // Deleted by TestConnectJobDelegate.
771 TestConnectJob* job =
772 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12773 "a",
[email protected]974ebd62009-08-03 23:14:34774 request,
775 base::TimeDelta::FromMicroseconds(1),
776 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30777 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17778 &log);
[email protected]974ebd62009-08-03 23:14:34779 ASSERT_EQ(ERR_IO_PENDING, job->Connect());
[email protected]26b9973962012-01-28 00:57:00780 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
[email protected]974ebd62009-08-03 23:14:34781 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult());
[email protected]fd7b7c92009-08-20 19:38:30782
mmenke43758e62015-05-04 21:09:46783 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40784 log.GetEntries(&entries);
785
786 EXPECT_EQ(6u, entries.size());
[email protected]e9002a92010-01-29 07:10:46787 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40788 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB));
[email protected]06650c52010-06-03 00:49:17789 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40790 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT));
[email protected]e9002a92010-01-29 07:10:46791 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40792 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET,
[email protected]06650c52010-06-03 00:49:17793 NetLog::PHASE_NONE));
794 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40795 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
[email protected]9e743cd2010-03-16 07:03:53796 NetLog::PHASE_NONE));
[email protected]e9002a92010-01-29 07:10:46797 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40798 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT));
[email protected]06650c52010-06-03 00:49:17799 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40800 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34801}
802
[email protected]5fc08e32009-07-15 17:09:57803TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53804 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20805
[email protected]6ecf2b92011-12-15 01:14:52806 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06807 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51808 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48809 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53810
[email protected]2431756e2010-09-29 20:26:13811 EXPECT_EQ(OK,
812 handle.Init("a",
813 params_,
[email protected]bb1c4662013-11-14 00:00:07814 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:52815 callback.callback(),
[email protected]2431756e2010-09-29 20:26:13816 pool_.get(),
817 log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09818 EXPECT_TRUE(handle.is_initialized());
819 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48820 TestLoadTimingInfoConnectedNotReused(handle);
821
[email protected]f6d1d6eb2009-06-24 20:16:09822 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48823 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30824
mmenke43758e62015-05-04 21:09:46825 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40826 log.GetEntries(&entries);
827
828 EXPECT_EQ(4u, entries.size());
[email protected]e9002a92010-01-29 07:10:46829 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40830 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53831 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40832 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:17833 NetLog::PHASE_NONE));
834 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40835 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
[email protected]9e743cd2010-03-16 07:03:53836 NetLog::PHASE_NONE));
837 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40838 entries, 3, NetLog::TYPE_SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09839}
840
[email protected]ab838892009-06-30 18:49:05841TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53842 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20843
[email protected]ab838892009-06-30 18:49:05844 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51845 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53846
[email protected]2431756e2010-09-29 20:26:13847 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52848 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18849 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13850 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43851 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45852 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13853 handle.set_ssl_error_response_info(info);
854 EXPECT_EQ(ERR_CONNECTION_FAILED,
855 handle.Init("a",
856 params_,
[email protected]bb1c4662013-11-14 00:00:07857 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:52858 callback.callback(),
[email protected]2431756e2010-09-29 20:26:13859 pool_.get(),
860 log.bound()));
861 EXPECT_FALSE(handle.socket());
862 EXPECT_FALSE(handle.is_ssl_error());
863 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48864 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30865
mmenke43758e62015-05-04 21:09:46866 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40867 log.GetEntries(&entries);
868
869 EXPECT_EQ(3u, entries.size());
[email protected]5a1d7ca2010-04-28 20:12:27870 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40871 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17872 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40873 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:17874 NetLog::PHASE_NONE));
[email protected]a2006ece2010-04-23 16:44:02875 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40876 entries, 2, NetLog::TYPE_SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09877}
878
[email protected]211d21722009-07-22 15:48:53879TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
880 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
881
[email protected]9e743cd2010-03-16 07:03:53882 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30883
[email protected]bb1c4662013-11-14 00:00:07884 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
885 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
886 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY));
887 EXPECT_EQ(OK, StartRequest("d", DEFAULT_PRIORITY));
[email protected]211d21722009-07-22 15:48:53888
[email protected]2431756e2010-09-29 20:26:13889 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53890 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13891 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53892
[email protected]bb1c4662013-11-14 00:00:07893 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY));
894 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", DEFAULT_PRIORITY));
895 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", DEFAULT_PRIORITY));
[email protected]211d21722009-07-22 15:48:53896
[email protected]2431756e2010-09-29 20:26:13897 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53898
[email protected]2431756e2010-09-29 20:26:13899 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53900 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13901 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53902
903 EXPECT_EQ(1, GetOrderOfRequest(1));
904 EXPECT_EQ(2, GetOrderOfRequest(2));
905 EXPECT_EQ(3, GetOrderOfRequest(3));
906 EXPECT_EQ(4, GetOrderOfRequest(4));
907 EXPECT_EQ(5, GetOrderOfRequest(5));
908 EXPECT_EQ(6, GetOrderOfRequest(6));
909 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17910
911 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13912 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53913}
914
915TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
916 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.
[email protected]bb1c4662013-11-14 00:00:07921 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
922 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
923 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
924 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
[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.
[email protected]bb1c4662013-11-14 00:00:07931 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY));
[email protected]211d21722009-07-22 15:48:53932
[email protected]2431756e2010-09-29 20:26:13933 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53934
[email protected]2431756e2010-09-29 20:26:13935 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53936 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13937 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53938
939 EXPECT_EQ(1, GetOrderOfRequest(1));
940 EXPECT_EQ(2, GetOrderOfRequest(2));
941 EXPECT_EQ(3, GetOrderOfRequest(3));
942 EXPECT_EQ(4, GetOrderOfRequest(4));
943 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17944
945 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13946 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53947}
948
949TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
950 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
951
[email protected]ac790b42009-12-02 04:31:31952 EXPECT_EQ(OK, StartRequest("b", LOWEST));
953 EXPECT_EQ(OK, StartRequest("a", MEDIUM));
954 EXPECT_EQ(OK, StartRequest("b", HIGHEST));
955 EXPECT_EQ(OK, StartRequest("a", LOWEST));
[email protected]211d21722009-07-22 15:48:53956
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53958 client_socket_factory_.allocation_count());
959
[email protected]ac790b42009-12-02 04:31:31960 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", LOWEST));
961 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
962 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST));
[email protected]211d21722009-07-22 15:48:53963
[email protected]2431756e2010-09-29 20:26:13964 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53965
[email protected]2431756e2010-09-29 20:26:13966 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53967
968 // First 4 requests don't have to wait, and finish in order.
969 EXPECT_EQ(1, GetOrderOfRequest(1));
970 EXPECT_EQ(2, GetOrderOfRequest(2));
971 EXPECT_EQ(3, GetOrderOfRequest(3));
972 EXPECT_EQ(4, GetOrderOfRequest(4));
973
[email protected]ac790b42009-12-02 04:31:31974 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
975 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53976 EXPECT_EQ(7, GetOrderOfRequest(5));
977 EXPECT_EQ(6, GetOrderOfRequest(6));
978 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17979
980 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13981 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53982}
983
984TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
985 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
986
[email protected]ac790b42009-12-02 04:31:31987 EXPECT_EQ(OK, StartRequest("a", LOWEST));
988 EXPECT_EQ(OK, StartRequest("a", LOW));
989 EXPECT_EQ(OK, StartRequest("b", HIGHEST));
990 EXPECT_EQ(OK, StartRequest("b", MEDIUM));
[email protected]211d21722009-07-22 15:48:53991
[email protected]2431756e2010-09-29 20:26:13992 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53993 client_socket_factory_.allocation_count());
994
[email protected]ac790b42009-12-02 04:31:31995 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", MEDIUM));
996 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
997 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST));
[email protected]211d21722009-07-22 15:48:53998
[email protected]2431756e2010-09-29 20:26:13999 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531000
[email protected]2431756e2010-09-29 20:26:131001 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531002 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131003 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531004
1005 // First 4 requests don't have to wait, and finish in order.
1006 EXPECT_EQ(1, GetOrderOfRequest(1));
1007 EXPECT_EQ(2, GetOrderOfRequest(2));
1008 EXPECT_EQ(3, GetOrderOfRequest(3));
1009 EXPECT_EQ(4, GetOrderOfRequest(4));
1010
1011 // Request ("b", 7) has the highest priority, but we can't make new socket for
1012 // group "b", because it has reached the per-group limit. Then we make
1013 // socket for ("c", 6), because it has higher priority than ("a", 4),
1014 // and we still can't make a socket for group "b".
1015 EXPECT_EQ(5, GetOrderOfRequest(5));
1016 EXPECT_EQ(6, GetOrderOfRequest(6));
1017 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171018
1019 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131020 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531021}
1022
1023// Make sure that we count connecting sockets against the total limit.
1024TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1025 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1026
[email protected]bb1c4662013-11-14 00:00:071027 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1028 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
1029 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY));
[email protected]211d21722009-07-22 15:48:531030
1031 // Create one asynchronous request.
1032 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]bb1c4662013-11-14 00:00:071033 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", DEFAULT_PRIORITY));
[email protected]211d21722009-07-22 15:48:531034
[email protected]6b175382009-10-13 06:47:471035 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1036 // actually become pending until 2ms after they have been created. In order
1037 // to flush all tasks, we need to wait so that we know there are no
1038 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001039 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
[email protected]2da659e2013-05-23 20:51:341040 base::MessageLoop::current()->RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471041
[email protected]211d21722009-07-22 15:48:531042 // The next synchronous request should wait for its turn.
1043 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]bb1c4662013-11-14 00:00:071044 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY));
[email protected]211d21722009-07-22 15:48:531045
[email protected]2431756e2010-09-29 20:26:131046 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531047
[email protected]2431756e2010-09-29 20:26:131048 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531049 client_socket_factory_.allocation_count());
1050
1051 EXPECT_EQ(1, GetOrderOfRequest(1));
1052 EXPECT_EQ(2, GetOrderOfRequest(2));
1053 EXPECT_EQ(3, GetOrderOfRequest(3));
1054 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171055 EXPECT_EQ(5, GetOrderOfRequest(5));
1056
1057 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131058 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531059}
1060
[email protected]6427fe22010-04-16 22:27:411061TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1062 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1063 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1064
[email protected]bb1c4662013-11-14 00:00:071065 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1066 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1067 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1068 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
[email protected]6427fe22010-04-16 22:27:411069
1070 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1071
1072 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1073
[email protected]bb1c4662013-11-14 00:00:071074 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", DEFAULT_PRIORITY));
1075 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY));
[email protected]6427fe22010-04-16 22:27:411076
1077 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1078
[email protected]2431756e2010-09-29 20:26:131079 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411080 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131081 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411082 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131083 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1084 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411085 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1086}
1087
[email protected]d7027bb2010-05-10 18:58:541088TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1089 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1090 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1091
1092 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521093 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131094 EXPECT_EQ(ERR_IO_PENDING,
1095 handle.Init("a",
1096 params_,
[email protected]bb1c4662013-11-14 00:00:071097 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521098 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131099 pool_.get(),
1100 BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:541101
1102 ClientSocketHandle handles[4];
1103 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521104 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131105 EXPECT_EQ(ERR_IO_PENDING,
1106 handles[i].Init("b",
1107 params_,
[email protected]bb1c4662013-11-14 00:00:071108 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521109 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131110 pool_.get(),
1111 BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:541112 }
1113
1114 // One will be stalled, cancel all the handles now.
1115 // This should hit the OnAvailableSocketSlot() code where we previously had
1116 // stalled groups, but no longer have any.
1117 for (size_t i = 0; i < arraysize(handles); ++i)
1118 handles[i].Reset();
1119}
1120
[email protected]eb5a99382010-07-11 03:18:261121TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541122 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1123 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1124
[email protected]eb5a99382010-07-11 03:18:261125 {
1126 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521127 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261128 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]2431756e2010-09-29 20:26:131129 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i),
1130 params_,
[email protected]bb1c4662013-11-14 00:00:071131 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521132 callbacks[i].callback(),
[email protected]2431756e2010-09-29 20:26:131133 pool_.get(),
1134 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261135 }
1136
1137 // Force a stalled group.
1138 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521139 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131140 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo",
1141 params_,
[email protected]bb1c4662013-11-14 00:00:071142 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521143 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131144 pool_.get(),
1145 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261146
1147 // Cancel the stalled request.
1148 stalled_handle.Reset();
1149
1150 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1151 EXPECT_EQ(0, pool_->IdleSocketCount());
1152
1153 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541154 }
1155
[email protected]43a21b82010-06-10 21:30:541156 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1157 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261158}
[email protected]43a21b82010-06-10 21:30:541159
[email protected]eb5a99382010-07-11 03:18:261160TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1161 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1162 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1163
1164 {
1165 ClientSocketHandle handles[kDefaultMaxSockets];
1166 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521167 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131168 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i),
1169 params_,
[email protected]bb1c4662013-11-14 00:00:071170 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521171 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131172 pool_.get(),
1173 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261174 }
1175
1176 // Force a stalled group.
1177 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1178 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521179 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131180 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo",
1181 params_,
[email protected]bb1c4662013-11-14 00:00:071182 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521183 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131184 pool_.get(),
1185 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261186
1187 // Since it is stalled, it should have no connect jobs.
1188 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101189 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261190
1191 // Cancel the stalled request.
1192 handles[0].Reset();
1193
[email protected]eb5a99382010-07-11 03:18:261194 // Now we should have a connect job.
1195 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101196 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261197
1198 // The stalled socket should connect.
1199 EXPECT_EQ(OK, callback.WaitForResult());
1200
1201 EXPECT_EQ(kDefaultMaxSockets + 1,
1202 client_socket_factory_.allocation_count());
1203 EXPECT_EQ(0, pool_->IdleSocketCount());
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 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541208 }
1209
[email protected]eb5a99382010-07-11 03:18:261210 EXPECT_EQ(1, pool_->IdleSocketCount());
1211}
[email protected]43a21b82010-06-10 21:30:541212
[email protected]eb5a99382010-07-11 03:18:261213TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1214 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1215 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541216
[email protected]eb5a99382010-07-11 03:18:261217 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521218 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261219 {
[email protected]51fdc7c2012-04-10 19:19:481220 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261221 ClientSocketHandle handles[kDefaultMaxSockets];
1222 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521223 TestCompletionCallback callback;
[email protected]1870d5cf2011-05-12 01:55:401224 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf(
1225 "Take 2: %d", i),
1226 params_,
[email protected]bb1c4662013-11-14 00:00:071227 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521228 callback.callback(),
[email protected]1870d5cf2011-05-12 01:55:401229 pool_.get(),
1230 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261231 }
1232
1233 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1234 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481235 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261236
1237 // Now we will hit the socket limit.
[email protected]2431756e2010-09-29 20:26:131238 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo",
1239 params_,
[email protected]bb1c4662013-11-14 00:00:071240 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521241 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131242 pool_.get(),
1243 BoundNetLog()));
[email protected]51fdc7c2012-04-10 19:19:481244 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261245
1246 // Dropping out of scope will close all handles and return them to idle.
1247 }
[email protected]43a21b82010-06-10 21:30:541248
1249 // But if we wait for it, the released idle sockets will be closed in
1250 // preference of the waiting request.
[email protected]8ae03f42010-07-07 19:08:101251 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]eb5a99382010-07-11 03:18:261252
1253 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1254 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541255}
1256
1257// Regression test for http://crbug.com/40952.
1258TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1259 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221260 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541261 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1262
1263 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1264 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521265 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131266 EXPECT_EQ(OK, handle.Init(base::IntToString(i),
1267 params_,
[email protected]bb1c4662013-11-14 00:00:071268 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521269 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131270 pool_.get(),
1271 BoundNetLog()));
[email protected]43a21b82010-06-10 21:30:541272 }
1273
1274 // Flush all the DoReleaseSocket tasks.
[email protected]2da659e2013-05-23 20:51:341275 base::MessageLoop::current()->RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541276
1277 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1278 // reuse a socket.
1279 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1280 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521281 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541282
1283 // "0" is special here, since it should be the first entry in the sorted map,
1284 // which is the one which we would close an idle socket for. We shouldn't
1285 // close an idle socket though, since we should reuse the idle socket.
[email protected]2431756e2010-09-29 20:26:131286 EXPECT_EQ(OK, handle.Init("0",
1287 params_,
[email protected]bb1c4662013-11-14 00:00:071288 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521289 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131290 pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211291 BoundNetLog()));
[email protected]43a21b82010-06-10 21:30:541292
1293 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1294 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1295}
1296
[email protected]ab838892009-06-30 18:49:051297TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531298 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091299
[email protected]bb1c4662013-11-14 00:00:071300 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1301 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
[email protected]c9c6f5c2010-07-31 01:30:031302 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE));
[email protected]ac790b42009-12-02 04:31:311303 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1304 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1305 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1306 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1307 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
[email protected]f6d1d6eb2009-06-24 20:16:091308
[email protected]2431756e2010-09-29 20:26:131309 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091310
[email protected]c9d6a1d2009-07-14 16:15:201311 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1312 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131313 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1314 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091315
[email protected]c9d6a1d2009-07-14 16:15:201316 EXPECT_EQ(1, GetOrderOfRequest(1));
1317 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031318 EXPECT_EQ(8, GetOrderOfRequest(3));
1319 EXPECT_EQ(6, GetOrderOfRequest(4));
1320 EXPECT_EQ(4, GetOrderOfRequest(5));
1321 EXPECT_EQ(3, GetOrderOfRequest(6));
1322 EXPECT_EQ(5, GetOrderOfRequest(7));
1323 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171324
1325 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131326 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091327}
1328
[email protected]ab838892009-06-30 18:49:051329TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531330 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091331
[email protected]bb1c4662013-11-14 00:00:071332 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1333 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
[email protected]ac790b42009-12-02 04:31:311334 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1335 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1336 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1337 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1338 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
[email protected]f6d1d6eb2009-06-24 20:16:091339
[email protected]2431756e2010-09-29 20:26:131340 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091341
[email protected]2431756e2010-09-29 20:26:131342 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
1343 EXPECT_EQ(OK, request(i)->WaitForResult());
[email protected]c9d6a1d2009-07-14 16:15:201344
[email protected]2431756e2010-09-29 20:26:131345 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201346 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131347 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1348 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091349}
1350
1351// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051352// The pending connect job will be cancelled and should not call back into
1353// ClientSocketPoolBase.
1354TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531355 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201356
[email protected]ab838892009-06-30 18:49:051357 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131358 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521359 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131360 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
1361 params_,
[email protected]bb1c4662013-11-14 00:00:071362 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521363 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131364 pool_.get(),
1365 BoundNetLog()));
1366 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091367}
1368
[email protected]ab838892009-06-30 18:49:051369TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531370 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201371
[email protected]ab838892009-06-30 18:49:051372 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061373 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521374 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091375
[email protected]2431756e2010-09-29 20:26:131376 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
1377 params_,
[email protected]bb1c4662013-11-14 00:00:071378 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521379 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131380 pool_.get(),
1381 BoundNetLog()));
[email protected]f6d1d6eb2009-06-24 20:16:091382
1383 handle.Reset();
1384
[email protected]6ecf2b92011-12-15 01:14:521385 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131386 EXPECT_EQ(ERR_IO_PENDING,
1387 handle.Init("a",
1388 params_,
[email protected]bb1c4662013-11-14 00:00:071389 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521390 callback2.callback(),
[email protected]2431756e2010-09-29 20:26:131391 pool_.get(),
1392 BoundNetLog()));
[email protected]f6d1d6eb2009-06-24 20:16:091393
1394 EXPECT_EQ(OK, callback2.WaitForResult());
1395 EXPECT_FALSE(callback.have_result());
1396
1397 handle.Reset();
1398}
1399
[email protected]ab838892009-06-30 18:49:051400TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531401 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091402
[email protected]bb1c4662013-11-14 00:00:071403 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1404 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
[email protected]ac790b42009-12-02 04:31:311405 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1406 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1407 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1408 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1409 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
[email protected]f6d1d6eb2009-06-24 20:16:091410
1411 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201412 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131413 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1414 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091415
[email protected]2431756e2010-09-29 20:26:131416 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091417
[email protected]c9d6a1d2009-07-14 16:15:201418 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1419 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131420 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1421 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091422
[email protected]c9d6a1d2009-07-14 16:15:201423 EXPECT_EQ(1, GetOrderOfRequest(1));
1424 EXPECT_EQ(2, GetOrderOfRequest(2));
1425 EXPECT_EQ(5, GetOrderOfRequest(3));
1426 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131427 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1428 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201429 EXPECT_EQ(4, GetOrderOfRequest(6));
1430 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171431
1432 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131433 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091434}
1435
mmenke33d24423d2015-05-19 19:41:091436// Function to be used as a callback on socket request completion. It first
1437// disconnects the successfully connected socket from the first request, and
1438// then reuses the ClientSocketHandle to request another socket.
1439//
1440// |nested_callback| is called with the result of the second socket request.
1441void RequestSocketOnComplete(ClientSocketHandle* handle,
1442 TestClientSocketPool* pool,
1443 TestConnectJobFactory* test_connect_job_factory,
1444 TestConnectJob::JobType next_job_type,
1445 const CompletionCallback& nested_callback,
1446 int first_request_result) {
1447 EXPECT_EQ(OK, first_request_result);
1448
1449 test_connect_job_factory->set_job_type(next_job_type);
1450
1451 // Don't allow reuse of the socket. Disconnect it and then release it.
1452 if (handle->socket())
1453 handle->socket()->Disconnect();
1454 handle->Reset();
1455
1456 scoped_refptr<TestSocketParams> params(
1457 new TestSocketParams(false /* ignore_limits */));
1458 TestCompletionCallback callback;
1459 int rv =
1460 handle->Init("a", params, LOWEST, nested_callback, pool, BoundNetLog());
1461 if (rv != ERR_IO_PENDING) {
1462 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1463 nested_callback.Run(rv);
1464 } else {
1465 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521466 }
mmenke33d24423d2015-05-19 19:41:091467}
[email protected]f6d1d6eb2009-06-24 20:16:091468
mmenke33d24423d2015-05-19 19:41:091469// Tests the case where a second socket is requested in a completion callback,
1470// and the second socket connects asynchronously. Reuses the same
1471// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581472TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531473 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201474
[email protected]0b7648c2009-07-06 20:14:011475 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061476 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091477 TestCompletionCallback second_result_callback;
1478 int rv = handle.Init(
1479 "a", params_, DEFAULT_PRIORITY,
1480 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1481 connect_job_factory_, TestConnectJob::kMockPendingJob,
1482 second_result_callback.callback()),
1483 pool_.get(), BoundNetLog());
[email protected]f6d1d6eb2009-06-24 20:16:091484 ASSERT_EQ(ERR_IO_PENDING, rv);
1485
mmenke33d24423d2015-05-19 19:41:091486 EXPECT_EQ(OK, second_result_callback.WaitForResult());
[email protected]2ab05b52009-07-01 23:57:581487}
[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 synchronously. Reuses the same
1491// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581492TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[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(
1499 "a", params_, DEFAULT_PRIORITY,
1500 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1501 connect_job_factory_, TestConnectJob::kMockPendingJob,
1502 second_result_callback.callback()),
1503 pool_.get(), BoundNetLog());
[email protected]2ab05b52009-07-01 23:57:581504 ASSERT_EQ(ERR_IO_PENDING, rv);
1505
mmenke33d24423d2015-05-19 19:41:091506 EXPECT_EQ(OK, second_result_callback.WaitForResult());
[email protected]f6d1d6eb2009-06-24 20:16:091507}
1508
1509// Make sure that pending requests get serviced after active requests get
1510// cancelled.
[email protected]ab838892009-06-30 18:49:051511TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531512 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201513
[email protected]0b7648c2009-07-06 20:14:011514 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091515
[email protected]bb1c4662013-11-14 00:00:071516 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1517 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1518 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1519 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1520 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1521 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1522 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
[email protected]f6d1d6eb2009-06-24 20:16:091523
[email protected]c9d6a1d2009-07-14 16:15:201524 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1525 // Let's cancel them.
1526 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131527 ASSERT_FALSE(request(i)->handle()->is_initialized());
1528 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091529 }
1530
[email protected]f6d1d6eb2009-06-24 20:16:091531 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131532 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
1533 EXPECT_EQ(OK, request(i)->WaitForResult());
1534 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091535 }
1536
[email protected]2431756e2010-09-29 20:26:131537 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1538 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091539}
1540
1541// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051542TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531543 const size_t kMaxSockets = 5;
1544 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201545
[email protected]0b7648c2009-07-06 20:14:011546 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091547
[email protected]211d21722009-07-22 15:48:531548 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1549 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091550
1551 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531552 for (size_t i = 0; i < kNumberOfRequests; ++i)
[email protected]bb1c4662013-11-14 00:00:071553 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
[email protected]f6d1d6eb2009-06-24 20:16:091554
[email protected]211d21722009-07-22 15:48:531555 for (size_t i = 0; i < kNumberOfRequests; ++i)
[email protected]2431756e2010-09-29 20:26:131556 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult());
[email protected]f6d1d6eb2009-06-24 20:16:091557}
1558
[email protected]5fc08e32009-07-15 17:09:571559TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531560 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571561
1562 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1563
[email protected]2431756e2010-09-29 20:26:131564 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521565 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131566 int rv = handle.Init("a",
1567 params_,
[email protected]bb1c4662013-11-14 00:00:071568 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521569 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131570 pool_.get(),
1571 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571572 EXPECT_EQ(ERR_IO_PENDING, rv);
1573
1574 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131575 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571576
[email protected]2431756e2010-09-29 20:26:131577 rv = handle.Init("a",
1578 params_,
[email protected]bb1c4662013-11-14 00:00:071579 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521580 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131581 pool_.get(),
1582 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571583 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]2431756e2010-09-29 20:26:131584 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]5fc08e32009-07-15 17:09:571585
[email protected]2431756e2010-09-29 20:26:131586 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481587 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571588 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1589}
1590
[email protected]2b7523d2009-07-29 20:29:231591// Regression test for http://crbug.com/17985.
1592TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1593 const int kMaxSockets = 3;
1594 const int kMaxSocketsPerGroup = 2;
1595 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1596
[email protected]ac790b42009-12-02 04:31:311597 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231598
[email protected]bb1c4662013-11-14 00:00:071599 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1600 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
[email protected]2b7523d2009-07-29 20:29:231601
1602 // This is going to be a pending request in an otherwise empty group.
[email protected]bb1c4662013-11-14 00:00:071603 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
[email protected]2b7523d2009-07-29 20:29:231604
1605 // Reach the maximum socket limit.
[email protected]bb1c4662013-11-14 00:00:071606 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
[email protected]2b7523d2009-07-29 20:29:231607
1608 // Create a stalled group with high priorities.
1609 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1610 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
[email protected]2b7523d2009-07-29 20:29:231611
[email protected]eb5a99382010-07-11 03:18:261612 // Release the first two sockets from "a". Because this is a keepalive,
1613 // the first release will unblock the pending request for "a". The
1614 // second release will unblock a request for "c", becaue it is the next
1615 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131616 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1617 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231618
1619 // Closing idle sockets should not get us into trouble, but in the bug
1620 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411621 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541622 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261623
[email protected]2da659e2013-05-23 20:51:341624 // Run the released socket wakeups.
1625 base::MessageLoop::current()->RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231626}
1627
[email protected]4d3b05d2010-01-27 21:27:291628TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531629 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571630
1631 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131632 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521633 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511634 BoundTestNetLog log;
[email protected]2431756e2010-09-29 20:26:131635 int rv = handle.Init("a",
1636 params_,
1637 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:521638 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131639 pool_.get(),
1640 log.bound());
[email protected]5fc08e32009-07-15 17:09:571641 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]2431756e2010-09-29 20:26:131642 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481643 TestLoadTimingInfoNotConnected(handle);
1644
[email protected]2431756e2010-09-29 20:26:131645 EXPECT_EQ(OK, callback.WaitForResult());
1646 EXPECT_TRUE(handle.is_initialized());
1647 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481648 TestLoadTimingInfoConnectedNotReused(handle);
1649
[email protected]2431756e2010-09-29 20:26:131650 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481651 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301652
mmenke43758e62015-05-04 21:09:461653 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401654 log.GetEntries(&entries);
1655
1656 EXPECT_EQ(4u, entries.size());
[email protected]e9002a92010-01-29 07:10:461657 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:401658 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171659 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:401660 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:171661 NetLog::PHASE_NONE));
1662 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:401663 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
[email protected]06650c52010-06-03 00:49:171664 NetLog::PHASE_NONE));
[email protected]e9002a92010-01-29 07:10:461665 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:401666 entries, 3, NetLog::TYPE_SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571667}
1668
[email protected]4d3b05d2010-01-27 21:27:291669TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571670 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531671 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571672
1673 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131674 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521675 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511676 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181677 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131678 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431679 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451680 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131681 handle.set_ssl_error_response_info(info);
1682 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
1683 params_,
[email protected]bb1c4662013-11-14 00:00:071684 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521685 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131686 pool_.get(),
1687 log.bound()));
1688 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
1689 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
1690 EXPECT_FALSE(handle.is_ssl_error());
1691 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301692
mmenke43758e62015-05-04 21:09:461693 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401694 log.GetEntries(&entries);
1695
1696 EXPECT_EQ(3u, entries.size());
[email protected]e9002a92010-01-29 07:10:461697 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:401698 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171699 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:401700 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:171701 NetLog::PHASE_NONE));
[email protected]6b624c62010-03-14 08:37:321702 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:401703 entries, 2, NetLog::TYPE_SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571704}
1705
mmenke6be122f2015-03-09 22:22:471706// Check that an async ConnectJob failure does not result in creation of a new
1707// ConnectJob when there's another pending request also waiting on its own
1708// ConnectJob. See http://crbug.com/463960.
1709TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1710 CreatePool(2, 2);
1711 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1712
1713 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1714 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1715
1716 EXPECT_EQ(ERR_CONNECTION_FAILED, request(0)->WaitForResult());
1717 EXPECT_EQ(ERR_CONNECTION_FAILED, request(1)->WaitForResult());
1718
1719 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1720}
1721
[email protected]4d3b05d2010-01-27 21:27:291722TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101723 // TODO(eroman): Add back the log expectations! Removed them because the
1724 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531725 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571726
1727 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131728 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521729 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131730 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521731 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571732
[email protected]2431756e2010-09-29 20:26:131733 EXPECT_EQ(ERR_IO_PENDING,
1734 handle.Init("a",
1735 params_,
[email protected]bb1c4662013-11-14 00:00:071736 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521737 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131738 pool_.get(),
1739 BoundNetLog()));
vishal.b62985ca92015-04-17 08:45:511740 BoundTestNetLog log2;
[email protected]2431756e2010-09-29 20:26:131741 EXPECT_EQ(ERR_IO_PENDING,
1742 handle2.Init("a",
1743 params_,
[email protected]bb1c4662013-11-14 00:00:071744 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521745 callback2.callback(),
[email protected]2431756e2010-09-29 20:26:131746 pool_.get(),
1747 BoundNetLog()));
[email protected]5fc08e32009-07-15 17:09:571748
[email protected]2431756e2010-09-29 20:26:131749 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571750
[email protected]fd7b7c92009-08-20 19:38:301751
1752 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301753
[email protected]2431756e2010-09-29 20:26:131754 EXPECT_EQ(OK, callback2.WaitForResult());
1755 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301756
1757 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531758 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571759}
1760
[email protected]4d3b05d2010-01-27 21:27:291761TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341762 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1763
[email protected]17a0c6c2009-08-04 00:07:041764 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1765
[email protected]ac790b42009-12-02 04:31:311766 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1767 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1768 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1769 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
[email protected]974ebd62009-08-03 23:14:341770
1771 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131772 (*requests())[2]->handle()->Reset();
1773 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341774 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1775
[email protected]2431756e2010-09-29 20:26:131776 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341777 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1778
[email protected]2431756e2010-09-29 20:26:131779 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261780 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341781}
1782
[email protected]5fc08e32009-07-15 17:09:571783// When requests and ConnectJobs are not coupled, the request will get serviced
1784// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291785TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531786 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571787
1788 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321789 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571790
[email protected]2431756e2010-09-29 20:26:131791 std::vector<TestSocketRequest*> request_order;
1792 size_t completion_count; // unused
1793 TestSocketRequest req1(&request_order, &completion_count);
1794 int rv = req1.handle()->Init("a",
1795 params_,
[email protected]bb1c4662013-11-14 00:00:071796 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521797 req1.callback(), pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211798 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571799 EXPECT_EQ(ERR_IO_PENDING, rv);
1800 EXPECT_EQ(OK, req1.WaitForResult());
1801
1802 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1803 // without a job.
1804 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1805
[email protected]2431756e2010-09-29 20:26:131806 TestSocketRequest req2(&request_order, &completion_count);
1807 rv = req2.handle()->Init("a",
1808 params_,
[email protected]bb1c4662013-11-14 00:00:071809 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521810 req2.callback(),
[email protected]2431756e2010-09-29 20:26:131811 pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211812 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571813 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]2431756e2010-09-29 20:26:131814 TestSocketRequest req3(&request_order, &completion_count);
1815 rv = req3.handle()->Init("a",
1816 params_,
[email protected]bb1c4662013-11-14 00:00:071817 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521818 req3.callback(),
[email protected]2431756e2010-09-29 20:26:131819 pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211820 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571821 EXPECT_EQ(ERR_IO_PENDING, rv);
1822
1823 // Both Requests 2 and 3 are pending. We release socket 1 which should
1824 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331825 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341826 // Run the released socket wakeups.
1827 base::MessageLoop::current()->RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331828 ASSERT_TRUE(req2.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571829 EXPECT_EQ(OK, req2.WaitForResult());
[email protected]a6c59f62009-07-29 16:33:331830 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571831
1832 // Signal job 2, which should service request 3.
1833
1834 client_socket_factory_.SignalJobs();
1835 EXPECT_EQ(OK, req3.WaitForResult());
1836
[email protected]2431756e2010-09-29 20:26:131837 ASSERT_EQ(3U, request_order.size());
1838 EXPECT_EQ(&req1, request_order[0]);
1839 EXPECT_EQ(&req2, request_order[1]);
1840 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571841 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1842}
1843
1844// The requests are not coupled to the jobs. So, the requests should finish in
1845// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291846TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531847 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571848 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321849 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571850
[email protected]2431756e2010-09-29 20:26:131851 std::vector<TestSocketRequest*> request_order;
1852 size_t completion_count; // unused
1853 TestSocketRequest req1(&request_order, &completion_count);
1854 int rv = req1.handle()->Init("a",
1855 params_,
[email protected]bb1c4662013-11-14 00:00:071856 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521857 req1.callback(),
[email protected]2431756e2010-09-29 20:26:131858 pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211859 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571860 EXPECT_EQ(ERR_IO_PENDING, rv);
1861
[email protected]2431756e2010-09-29 20:26:131862 TestSocketRequest req2(&request_order, &completion_count);
1863 rv = req2.handle()->Init("a",
1864 params_,
[email protected]bb1c4662013-11-14 00:00:071865 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521866 req2.callback(),
[email protected]2431756e2010-09-29 20:26:131867 pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211868 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571869 EXPECT_EQ(ERR_IO_PENDING, rv);
1870
1871 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321872 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571873
[email protected]2431756e2010-09-29 20:26:131874 TestSocketRequest req3(&request_order, &completion_count);
1875 rv = req3.handle()->Init("a",
1876 params_,
[email protected]bb1c4662013-11-14 00:00:071877 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521878 req3.callback(),
[email protected]2431756e2010-09-29 20:26:131879 pool_.get(),
[email protected]df4b4ef2010-07-12 18:25:211880 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571881 EXPECT_EQ(ERR_IO_PENDING, rv);
1882
1883 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult());
1884 EXPECT_EQ(OK, req2.WaitForResult());
1885 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult());
1886
[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}
1892
[email protected]03b7c8c2013-07-20 04:38:551893// Test GetLoadState in the case there's only one socket request.
1894TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:531895 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:551896 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:571897
[email protected]2431756e2010-09-29 20:26:131898 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521899 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131900 int rv = handle.Init("a",
1901 params_,
[email protected]bb1c4662013-11-14 00:00:071902 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:521903 callback.callback(),
[email protected]2431756e2010-09-29 20:26:131904 pool_.get(),
1905 BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571906 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]03b7c8c2013-07-20 04:38:551907 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571908
[email protected]03b7c8c2013-07-20 04:38:551909 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1910 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1911
1912 // No point in completing the connection, since ClientSocketHandles only
1913 // expect the LoadState to be checked while connecting.
1914}
1915
1916// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:001917// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:551918TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
1919 CreatePool(2, 2);
1920 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1921
1922 ClientSocketHandle handle;
1923 TestCompletionCallback callback;
haavardm835c1d62015-04-22 08:18:001924 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(),
1925 pool_.get(), BoundNetLog());
1926 EXPECT_EQ(ERR_IO_PENDING, rv);
1927 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
1928
1929 ClientSocketHandle handle2;
1930 TestCompletionCallback callback2;
1931 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, callback2.callback(),
1932 pool_.get(), BoundNetLog());
1933 EXPECT_EQ(ERR_IO_PENDING, rv);
1934 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
1935
1936 // Check that both handles report the state of the first job.
1937 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
1938 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
1939
1940 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
1941
1942 // Check that both handles change to LOAD_STATE_CONNECTING.
1943 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1944 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1945}
1946
1947// Test that the second connection request does not affect the pool's load
1948// status.
1949TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
1950 CreatePool(2, 2);
1951 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1952
1953 ClientSocketHandle handle;
1954 TestCompletionCallback callback;
1955 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(),
1956 pool_.get(), BoundNetLog());
[email protected]03b7c8c2013-07-20 04:38:551957 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]5fc08e32009-07-15 17:09:571958
[email protected]2431756e2010-09-29 20:26:131959 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521960 TestCompletionCallback callback2;
haavardm835c1d62015-04-22 08:18:001961 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, callback2.callback(),
1962 pool_.get(), BoundNetLog());
[email protected]5fc08e32009-07-15 17:09:571963 EXPECT_EQ(ERR_IO_PENDING, rv);
haavardm835c1d62015-04-22 08:18:001964 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:551965
[email protected]03b7c8c2013-07-20 04:38:551966 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1967 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1968
haavardm835c1d62015-04-22 08:18:001969 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:551970 // second handle switches to the state of the remaining ConnectJob.
1971 client_socket_factory_.SignalJob(0);
1972 EXPECT_EQ(OK, callback.WaitForResult());
haavardm835c1d62015-04-22 08:18:001973 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:551974}
1975
1976// Test GetLoadState in the case the per-group limit is reached.
1977TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
1978 CreatePool(2, 1);
1979 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1980
1981 ClientSocketHandle handle;
1982 TestCompletionCallback callback;
1983 int rv = handle.Init("a",
1984 params_,
1985 MEDIUM,
1986 callback.callback(),
1987 pool_.get(),
1988 BoundNetLog());
1989 EXPECT_EQ(ERR_IO_PENDING, rv);
1990 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1991
1992 // Request another socket from the same pool, buth with a higher priority.
1993 // The first request should now be stalled at the socket group limit.
1994 ClientSocketHandle handle2;
1995 TestCompletionCallback callback2;
1996 rv = handle2.Init("a",
1997 params_,
1998 HIGHEST,
1999 callback2.callback(),
2000 pool_.get(),
2001 BoundNetLog());
2002 EXPECT_EQ(ERR_IO_PENDING, rv);
2003 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2004 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2005
2006 // The first handle should remain stalled as the other socket goes through
2007 // the connect process.
2008
2009 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2010 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2011 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2012
2013 client_socket_factory_.SignalJob(0);
2014 EXPECT_EQ(OK, callback2.WaitForResult());
2015 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2016
2017 // Closing the second socket should cause the stalled handle to finally get a
2018 // ConnectJob.
2019 handle2.socket()->Disconnect();
2020 handle2.Reset();
2021 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2022}
2023
2024// Test GetLoadState in the case the per-pool limit is reached.
2025TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2026 CreatePool(2, 2);
2027 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2028
2029 ClientSocketHandle handle;
2030 TestCompletionCallback callback;
2031 int rv = handle.Init("a",
2032 params_,
[email protected]bb1c4662013-11-14 00:00:072033 DEFAULT_PRIORITY,
[email protected]03b7c8c2013-07-20 04:38:552034 callback.callback(),
2035 pool_.get(),
2036 BoundNetLog());
2037 EXPECT_EQ(ERR_IO_PENDING, rv);
2038
2039 // Request for socket from another pool.
2040 ClientSocketHandle handle2;
2041 TestCompletionCallback callback2;
2042 rv = handle2.Init("b",
2043 params_,
[email protected]bb1c4662013-11-14 00:00:072044 DEFAULT_PRIORITY,
[email protected]03b7c8c2013-07-20 04:38:552045 callback2.callback(),
2046 pool_.get(),
2047 BoundNetLog());
2048 EXPECT_EQ(ERR_IO_PENDING, rv);
2049
2050 // Request another socket from the first pool. Request should stall at the
2051 // socket pool limit.
2052 ClientSocketHandle handle3;
2053 TestCompletionCallback callback3;
2054 rv = handle3.Init("a",
2055 params_,
[email protected]bb1c4662013-11-14 00:00:072056 DEFAULT_PRIORITY,
[email protected]03b7c8c2013-07-20 04:38:552057 callback2.callback(),
2058 pool_.get(),
2059 BoundNetLog());
2060 EXPECT_EQ(ERR_IO_PENDING, rv);
2061
2062 // The third handle should remain stalled as the other sockets in its group
2063 // goes through the connect process.
2064
2065 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2066 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2067
2068 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2069 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2070 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2071
2072 client_socket_factory_.SignalJob(0);
2073 EXPECT_EQ(OK, callback.WaitForResult());
2074 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2075
2076 // Closing a socket should allow the stalled handle to finally get a new
2077 // ConnectJob.
2078 handle.socket()->Disconnect();
2079 handle.Reset();
2080 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572081}
2082
[email protected]e772db3f2010-07-12 18:11:132083TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2084 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2085 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2086
[email protected]2431756e2010-09-29 20:26:132087 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522088 TestCompletionCallback callback;
2089 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
[email protected]bb1c4662013-11-14 00:00:072090 handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(),
[email protected]6ecf2b92011-12-15 01:14:522091 pool_.get(), BoundNetLog()));
[email protected]2431756e2010-09-29 20:26:132092 EXPECT_TRUE(handle.is_initialized());
2093 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132094}
2095
2096TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2097 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2098
2099 connect_job_factory_->set_job_type(
2100 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132101 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522102 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132103 EXPECT_EQ(ERR_IO_PENDING,
2104 handle.Init("a",
2105 params_,
[email protected]bb1c4662013-11-14 00:00:072106 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522107 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132108 pool_.get(),
2109 BoundNetLog()));
2110 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2111 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
2112 EXPECT_TRUE(handle.is_initialized());
2113 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132114}
2115
[email protected]e60e47a2010-07-14 03:37:182116TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2117 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2118 connect_job_factory_->set_job_type(
2119 TestConnectJob::kMockAdditionalErrorStateJob);
2120
[email protected]2431756e2010-09-29 20:26:132121 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522122 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132123 EXPECT_EQ(ERR_CONNECTION_FAILED,
2124 handle.Init("a",
2125 params_,
[email protected]bb1c4662013-11-14 00:00:072126 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522127 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132128 pool_.get(),
2129 BoundNetLog()));
2130 EXPECT_FALSE(handle.is_initialized());
2131 EXPECT_FALSE(handle.socket());
2132 EXPECT_TRUE(handle.is_ssl_error());
2133 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182134}
2135
2136TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2137 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2138
2139 connect_job_factory_->set_job_type(
2140 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132141 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522142 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132143 EXPECT_EQ(ERR_IO_PENDING,
2144 handle.Init("a",
2145 params_,
[email protected]bb1c4662013-11-14 00:00:072146 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522147 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132148 pool_.get(),
2149 BoundNetLog()));
2150 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2151 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
2152 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
[email protected]e7b1c6d2c2012-05-05 00:54:032158// Make sure we can reuse sockets when the cleanup timer is disabled.
2159TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) {
[email protected]64770b7d2011-11-16 04:30:412160 // Disable cleanup timer.
2161 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false);
2162
2163 CreatePoolWithIdleTimeouts(
2164 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032165 base::TimeDelta(), // Time out unused sockets immediately.
2166 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2167
2168 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2169
2170 ClientSocketHandle handle;
2171 TestCompletionCallback callback;
2172 int rv = handle.Init("a",
2173 params_,
2174 LOWEST,
2175 callback.callback(),
2176 pool_.get(),
2177 BoundNetLog());
2178 ASSERT_EQ(ERR_IO_PENDING, rv);
2179 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2180 ASSERT_EQ(OK, callback.WaitForResult());
2181
2182 // Use and release the socket.
2183 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482184 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032185 handle.Reset();
2186
2187 // Should now have one idle socket.
2188 ASSERT_EQ(1, pool_->IdleSocketCount());
2189
2190 // Request a new socket. This should reuse the old socket and complete
2191 // synchronously.
vishal.b62985ca92015-04-17 08:45:512192 BoundTestNetLog log;
[email protected]e7b1c6d2c2012-05-05 00:54:032193 rv = handle.Init("a",
2194 params_,
2195 LOWEST,
2196 CompletionCallback(),
2197 pool_.get(),
2198 log.bound());
2199 ASSERT_EQ(OK, rv);
2200 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482201 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032202
2203 ASSERT_TRUE(pool_->HasGroup("a"));
2204 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2205 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2206
mmenke43758e62015-05-04 21:09:462207 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032208 log.GetEntries(&entries);
2209 EXPECT_TRUE(LogContainsEntryWithType(
2210 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2211}
2212
2213// Make sure we cleanup old unused sockets when the cleanup timer is disabled.
2214TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerNoReuse) {
2215 // Disable cleanup timer.
2216 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false);
2217
2218 CreatePoolWithIdleTimeouts(
2219 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2220 base::TimeDelta(), // Time out unused sockets immediately
2221 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412222
2223 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2224
2225 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2226
2227 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522228 TestCompletionCallback callback;
[email protected]64770b7d2011-11-16 04:30:412229 int rv = handle.Init("a",
2230 params_,
2231 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522232 callback.callback(),
[email protected]64770b7d2011-11-16 04:30:412233 pool_.get(),
2234 BoundNetLog());
[email protected]e7b1c6d2c2012-05-05 00:54:032235 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]64770b7d2011-11-16 04:30:412236 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2237
2238 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522239 TestCompletionCallback callback2;
[email protected]64770b7d2011-11-16 04:30:412240 rv = handle2.Init("a",
2241 params_,
2242 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522243 callback2.callback(),
[email protected]64770b7d2011-11-16 04:30:412244 pool_.get(),
2245 BoundNetLog());
[email protected]e7b1c6d2c2012-05-05 00:54:032246 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]64770b7d2011-11-16 04:30:412247 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2248
2249 // Cancel one of the requests. Wait for the other, which will get the first
2250 // job. Release the socket. Run the loop again to make sure the second
2251 // socket is sitting idle and the first one is released (since ReleaseSocket()
2252 // just posts a DoReleaseSocket() task).
2253
2254 handle.Reset();
[email protected]e7b1c6d2c2012-05-05 00:54:032255 ASSERT_EQ(OK, callback2.WaitForResult());
[email protected]64770b7d2011-11-16 04:30:412256 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552257 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412258 handle2.Reset();
2259
[email protected]e7b1c6d2c2012-05-05 00:54:032260 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2261 // actually become pending until 2ms after they have been created. In order
2262 // to flush all tasks, we need to wait so that we know there are no
2263 // soon-to-be-pending tasks waiting.
2264 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
[email protected]2da659e2013-05-23 20:51:342265 base::MessageLoop::current()->RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412266
[email protected]e7b1c6d2c2012-05-05 00:54:032267 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412268 ASSERT_EQ(2, pool_->IdleSocketCount());
2269
2270 // Request a new socket. This should cleanup the unused and timed out ones.
2271 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512272 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522273 TestCompletionCallback callback3;
[email protected]64770b7d2011-11-16 04:30:412274 rv = handle.Init("a",
2275 params_,
2276 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522277 callback3.callback(),
[email protected]64770b7d2011-11-16 04:30:412278 pool_.get(),
2279 log.bound());
[email protected]e7b1c6d2c2012-05-05 00:54:032280 ASSERT_EQ(ERR_IO_PENDING, rv);
2281 ASSERT_EQ(OK, callback3.WaitForResult());
[email protected]64770b7d2011-11-16 04:30:412282 EXPECT_FALSE(handle.is_reused());
2283
[email protected]e7b1c6d2c2012-05-05 00:54:032284 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412285 ASSERT_TRUE(pool_->HasGroup("a"));
2286 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2287 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2288
mmenke43758e62015-05-04 21:09:462289 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412290 log.GetEntries(&entries);
2291 EXPECT_FALSE(LogContainsEntryWithType(
2292 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2293}
2294
[email protected]4d3b05d2010-01-27 21:27:292295TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) {
[email protected]9bf28db2009-08-29 01:35:162296 CreatePoolWithIdleTimeouts(
2297 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2298 base::TimeDelta(), // Time out unused sockets immediately.
2299 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2300
2301 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2302
2303 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2304
[email protected]2431756e2010-09-29 20:26:132305 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522306 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132307 int rv = handle.Init("a",
2308 params_,
2309 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522310 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132311 pool_.get(),
2312 BoundNetLog());
[email protected]9bf28db2009-08-29 01:35:162313 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]2431756e2010-09-29 20:26:132314 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]9bf28db2009-08-29 01:35:162315
[email protected]2431756e2010-09-29 20:26:132316 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522317 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:132318 rv = handle2.Init("a",
2319 params_,
2320 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522321 callback2.callback(),
[email protected]2431756e2010-09-29 20:26:132322 pool_.get(),
2323 BoundNetLog());
[email protected]9bf28db2009-08-29 01:35:162324 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]2431756e2010-09-29 20:26:132325 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
[email protected]9bf28db2009-08-29 01:35:162326
2327 // Cancel one of the requests. Wait for the other, which will get the first
2328 // job. Release the socket. Run the loop again to make sure the second
2329 // socket is sitting idle and the first one is released (since ReleaseSocket()
2330 // just posts a DoReleaseSocket() task).
2331
[email protected]2431756e2010-09-29 20:26:132332 handle.Reset();
2333 EXPECT_EQ(OK, callback2.WaitForResult());
[email protected]0f873e82010-09-02 16:09:012334 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552335 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]2431756e2010-09-29 20:26:132336 handle2.Reset();
[email protected]6b175382009-10-13 06:47:472337
2338 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2339 // actually become pending until 2ms after they have been created. In order
2340 // to flush all tasks, we need to wait so that we know there are no
2341 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:002342 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
[email protected]2da659e2013-05-23 20:51:342343 base::MessageLoop::current()->RunUntilIdle();
[email protected]9bf28db2009-08-29 01:35:162344
2345 ASSERT_EQ(2, pool_->IdleSocketCount());
[email protected]d3f66572009-09-09 22:38:042346
[email protected]9bf28db2009-08-29 01:35:162347 // Invoke the idle socket cleanup check. Only one socket should be left, the
2348 // used socket. Request it to make sure that it's used.
2349
2350 pool_->CleanupTimedOutIdleSockets();
vishal.b62985ca92015-04-17 08:45:512351 BoundTestNetLog log;
[email protected]2431756e2010-09-29 20:26:132352 rv = handle.Init("a",
2353 params_,
2354 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522355 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132356 pool_.get(),
2357 log.bound());
[email protected]9bf28db2009-08-29 01:35:162358 EXPECT_EQ(OK, rv);
[email protected]2431756e2010-09-29 20:26:132359 EXPECT_TRUE(handle.is_reused());
[email protected]b2fcd0e2010-12-01 15:19:402360
mmenke43758e62015-05-04 21:09:462361 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:402362 log.GetEntries(&entries);
[email protected]fd4fe0b2010-02-08 23:02:152363 EXPECT_TRUE(LogContainsEntryWithType(
[email protected]b2fcd0e2010-12-01 15:19:402364 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]9bf28db2009-08-29 01:35:162365}
2366
[email protected]2041cf342010-02-19 03:15:592367// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162368// because of multiple releasing disconnected sockets.
2369TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2370 CreatePoolWithIdleTimeouts(
2371 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2372 base::TimeDelta(), // Time out unused sockets immediately.
2373 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2374
2375 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2376
2377 // Startup 4 connect jobs. Two of them will be pending.
2378
[email protected]2431756e2010-09-29 20:26:132379 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522380 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132381 int rv = handle.Init("a",
2382 params_,
2383 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522384 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132385 pool_.get(),
2386 BoundNetLog());
[email protected]4f2abec2010-02-03 18:10:162387 EXPECT_EQ(OK, rv);
2388
[email protected]2431756e2010-09-29 20:26:132389 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522390 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:132391 rv = handle2.Init("a",
2392 params_,
2393 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522394 callback2.callback(),
[email protected]2431756e2010-09-29 20:26:132395 pool_.get(),
2396 BoundNetLog());
[email protected]4f2abec2010-02-03 18:10:162397 EXPECT_EQ(OK, rv);
2398
[email protected]2431756e2010-09-29 20:26:132399 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522400 TestCompletionCallback callback3;
[email protected]2431756e2010-09-29 20:26:132401 rv = handle3.Init("a",
2402 params_,
2403 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522404 callback3.callback(),
[email protected]2431756e2010-09-29 20:26:132405 pool_.get(),
2406 BoundNetLog());
[email protected]4f2abec2010-02-03 18:10:162407 EXPECT_EQ(ERR_IO_PENDING, rv);
2408
[email protected]2431756e2010-09-29 20:26:132409 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522410 TestCompletionCallback callback4;
[email protected]2431756e2010-09-29 20:26:132411 rv = handle4.Init("a",
2412 params_,
2413 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522414 callback4.callback(),
[email protected]2431756e2010-09-29 20:26:132415 pool_.get(),
2416 BoundNetLog());
[email protected]4f2abec2010-02-03 18:10:162417 EXPECT_EQ(ERR_IO_PENDING, rv);
2418
2419 // Release two disconnected sockets.
2420
[email protected]2431756e2010-09-29 20:26:132421 handle.socket()->Disconnect();
2422 handle.Reset();
2423 handle2.socket()->Disconnect();
2424 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162425
[email protected]2431756e2010-09-29 20:26:132426 EXPECT_EQ(OK, callback3.WaitForResult());
2427 EXPECT_FALSE(handle3.is_reused());
2428 EXPECT_EQ(OK, callback4.WaitForResult());
2429 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162430}
2431
[email protected]d7027bb2010-05-10 18:58:542432// Regression test for http://crbug.com/42267.
2433// When DoReleaseSocket() is processed for one socket, it is blocked because the
2434// other stalled groups all have releasing sockets, so no progress can be made.
2435TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2436 CreatePoolWithIdleTimeouts(
2437 4 /* socket limit */, 4 /* socket limit per group */,
2438 base::TimeDelta(), // Time out unused sockets immediately.
2439 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2440
2441 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2442
2443 // Max out the socket limit with 2 per group.
2444
[email protected]2431756e2010-09-29 20:26:132445 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522446 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132447 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522448 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542449
2450 for (int i = 0; i < 2; ++i) {
[email protected]2431756e2010-09-29 20:26:132451 EXPECT_EQ(OK, handle_a[i].Init("a",
2452 params_,
2453 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522454 callback_a[i].callback(),
[email protected]2431756e2010-09-29 20:26:132455 pool_.get(),
2456 BoundNetLog()));
2457 EXPECT_EQ(OK, handle_b[i].Init("b",
2458 params_,
2459 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522460 callback_b[i].callback(),
[email protected]2431756e2010-09-29 20:26:132461 pool_.get(),
2462 BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:542463 }
[email protected]b89f7e42010-05-20 20:37:002464
[email protected]d7027bb2010-05-10 18:58:542465 // Make 4 pending requests, 2 per group.
2466
2467 for (int i = 2; i < 4; ++i) {
[email protected]2431756e2010-09-29 20:26:132468 EXPECT_EQ(ERR_IO_PENDING,
2469 handle_a[i].Init("a",
2470 params_,
2471 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522472 callback_a[i].callback(),
[email protected]2431756e2010-09-29 20:26:132473 pool_.get(),
2474 BoundNetLog()));
2475 EXPECT_EQ(ERR_IO_PENDING,
2476 handle_b[i].Init("b",
2477 params_,
2478 LOWEST,
[email protected]6ecf2b92011-12-15 01:14:522479 callback_b[i].callback(),
[email protected]2431756e2010-09-29 20:26:132480 pool_.get(),
2481 BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:542482 }
2483
2484 // Release b's socket first. The order is important, because in
2485 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2486 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2487 // first, which has a releasing socket, so it refuses to start up another
2488 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132489 handle_b[0].socket()->Disconnect();
2490 handle_b[0].Reset();
2491 handle_a[0].socket()->Disconnect();
2492 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542493
2494 // Used to get stuck here.
[email protected]2da659e2013-05-23 20:51:342495 base::MessageLoop::current()->RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542496
[email protected]2431756e2010-09-29 20:26:132497 handle_b[1].socket()->Disconnect();
2498 handle_b[1].Reset();
2499 handle_a[1].socket()->Disconnect();
2500 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542501
2502 for (int i = 2; i < 4; ++i) {
[email protected]2431756e2010-09-29 20:26:132503 EXPECT_EQ(OK, callback_b[i].WaitForResult());
2504 EXPECT_EQ(OK, callback_a[i].WaitForResult());
[email protected]d7027bb2010-05-10 18:58:542505 }
2506}
2507
[email protected]fd4fe0b2010-02-08 23:02:152508TEST_F(ClientSocketPoolBaseTest,
2509 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2510 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2511
2512 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2513
[email protected]bb1c4662013-11-14 00:00:072514 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2515 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2516 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2517 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
[email protected]fd4fe0b2010-02-08 23:02:152518
[email protected]2431756e2010-09-29 20:26:132519 EXPECT_EQ(OK, (*requests())[0]->WaitForResult());
2520 EXPECT_EQ(OK, (*requests())[1]->WaitForResult());
2521 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152522
2523 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132524 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
2525 EXPECT_EQ(OK, (*requests())[2]->WaitForResult());
[email protected]fd4fe0b2010-02-08 23:02:152526
[email protected]2431756e2010-09-29 20:26:132527 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
2528 EXPECT_EQ(OK, (*requests())[3]->WaitForResult());
2529 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152530
2531 EXPECT_EQ(1, GetOrderOfRequest(1));
2532 EXPECT_EQ(2, GetOrderOfRequest(2));
2533 EXPECT_EQ(3, GetOrderOfRequest(3));
2534 EXPECT_EQ(4, GetOrderOfRequest(4));
2535
2536 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132537 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152538}
2539
[email protected]6ecf2b92011-12-15 01:14:522540class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042541 public:
[email protected]2431756e2010-09-29 20:26:132542 TestReleasingSocketRequest(TestClientSocketPool* pool,
2543 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182544 bool reset_releasing_handle)
2545 : pool_(pool),
2546 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522547 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322548 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2549 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522550 }
2551
dchengb03027d2014-10-21 12:00:202552 ~TestReleasingSocketRequest() override {}
[email protected]4f1e4982010-03-02 18:31:042553
2554 ClientSocketHandle* handle() { return &handle_; }
2555
[email protected]6ecf2b92011-12-15 01:14:522556 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042557
2558 private:
[email protected]6ecf2b92011-12-15 01:14:522559 void OnComplete(int result) {
2560 SetResult(result);
2561 if (reset_releasing_handle_)
2562 handle_.Reset();
2563
[email protected]bb1c4662013-11-14 00:00:072564 scoped_refptr<TestSocketParams> con_params(
2565 new TestSocketParams(false /* ignore_limits */));
[email protected]6ecf2b92011-12-15 01:14:522566 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072567 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522568 callback2_.callback(), pool_, BoundNetLog()));
2569 }
2570
[email protected]2431756e2010-09-29 20:26:132571 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182572 int expected_result_;
2573 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042574 ClientSocketHandle handle_;
2575 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522576 CompletionCallback callback_;
2577 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042578};
2579
[email protected]e60e47a2010-07-14 03:37:182580
2581TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2582 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2583
[email protected]bb1c4662013-11-14 00:00:072584 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
2585 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
2586 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
[email protected]e60e47a2010-07-14 03:37:182587
[email protected]2431756e2010-09-29 20:26:132588 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182589 client_socket_factory_.allocation_count());
2590
2591 connect_job_factory_->set_job_type(
2592 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2593 TestReleasingSocketRequest req(pool_.get(), OK, false);
[email protected]2431756e2010-09-29 20:26:132594 EXPECT_EQ(ERR_IO_PENDING,
[email protected]bb1c4662013-11-14 00:00:072595 req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(),
[email protected]6ecf2b92011-12-15 01:14:522596 pool_.get(), BoundNetLog()));
[email protected]e60e47a2010-07-14 03:37:182597 // The next job should complete synchronously
2598 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2599
2600 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
2601 EXPECT_FALSE(req.handle()->is_initialized());
2602 EXPECT_FALSE(req.handle()->socket());
2603 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432604 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182605}
2606
[email protected]b6501d3d2010-06-03 23:53:342607// http://crbug.com/44724 regression test.
2608// We start releasing the pool when we flush on network change. When that
2609// happens, the only active references are in the ClientSocketHandles. When a
2610// ConnectJob completes and calls back into the last ClientSocketHandle, that
2611// callback can release the last reference and delete the pool. After the
2612// callback finishes, we go back to the stack frame within the now-deleted pool.
2613// Executing any code that refers to members of the now-deleted pool can cause
2614// crashes.
2615TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2616 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2617 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2618
2619 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522620 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132621 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2622 params_,
[email protected]bb1c4662013-11-14 00:00:072623 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522624 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132625 pool_.get(),
2626 BoundNetLog()));
[email protected]b6501d3d2010-06-03 23:53:342627
[email protected]7af985a2012-12-14 22:40:422628 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342629
2630 // We'll call back into this now.
2631 callback.WaitForResult();
2632}
2633
[email protected]a7e38572010-06-07 18:22:242634TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2635 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2636 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2637
2638 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522639 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132640 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2641 params_,
[email protected]bb1c4662013-11-14 00:00:072642 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522643 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132644 pool_.get(),
2645 BoundNetLog()));
[email protected]a7e38572010-06-07 18:22:242646 EXPECT_EQ(OK, callback.WaitForResult());
2647 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2648
[email protected]7af985a2012-12-14 22:40:422649 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242650
2651 handle.Reset();
[email protected]2da659e2013-05-23 20:51:342652 base::MessageLoop::current()->RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242653
[email protected]2431756e2010-09-29 20:26:132654 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2655 params_,
[email protected]bb1c4662013-11-14 00:00:072656 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522657 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132658 pool_.get(),
2659 BoundNetLog()));
[email protected]a7e38572010-06-07 18:22:242660 EXPECT_EQ(OK, callback.WaitForResult());
2661 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2662}
2663
[email protected]6ecf2b92011-12-15 01:14:522664class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142665 public:
2666 ConnectWithinCallback(
2667 const std::string& group_name,
2668 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132669 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522670 : group_name_(group_name),
2671 params_(params),
2672 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322673 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2674 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142675 }
2676
dchengb03027d2014-10-21 12:00:202677 ~ConnectWithinCallback() override {}
[email protected]06f92462010-08-31 19:24:142678
2679 int WaitForNestedResult() {
2680 return nested_callback_.WaitForResult();
2681 }
2682
[email protected]6ecf2b92011-12-15 01:14:522683 const CompletionCallback& callback() const { return callback_; }
2684
[email protected]06f92462010-08-31 19:24:142685 private:
[email protected]6ecf2b92011-12-15 01:14:522686 void OnComplete(int result) {
2687 SetResult(result);
2688 EXPECT_EQ(ERR_IO_PENDING,
2689 handle_.Init(group_name_,
2690 params_,
[email protected]bb1c4662013-11-14 00:00:072691 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522692 nested_callback_.callback(),
2693 pool_,
2694 BoundNetLog()));
2695 }
2696
[email protected]06f92462010-08-31 19:24:142697 const std::string group_name_;
2698 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132699 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142700 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522701 CompletionCallback callback_;
2702 TestCompletionCallback nested_callback_;
2703
2704 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142705};
2706
2707TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2708 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2709
2710 // First job will be waiting until it gets aborted.
2711 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2712
2713 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132714 ConnectWithinCallback callback("a", params_, pool_.get());
2715 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2716 params_,
[email protected]bb1c4662013-11-14 00:00:072717 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522718 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132719 pool_.get(),
2720 BoundNetLog()));
[email protected]06f92462010-08-31 19:24:142721
2722 // Second job will be started during the first callback, and will
2723 // asynchronously complete with OK.
2724 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422725 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2726 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult());
[email protected]06f92462010-08-31 19:24:142727 EXPECT_EQ(OK, callback.WaitForNestedResult());
2728}
2729
[email protected]25eea382010-07-10 23:55:262730// Cancel a pending socket request while we're at max sockets,
2731// and verify that the backup socket firing doesn't cause a crash.
2732TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2733 // Max 4 sockets globally, max 4 sockets per group.
2734 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222735 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262736
[email protected]4baaf9d2010-08-31 15:15:442737 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2738 // timer.
[email protected]25eea382010-07-10 23:55:262739 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2740 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522741 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132742 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar",
2743 params_,
[email protected]bb1c4662013-11-14 00:00:072744 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522745 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132746 pool_.get(),
2747 BoundNetLog()));
[email protected]25eea382010-07-10 23:55:262748
2749 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2750 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2751 ClientSocketHandle handles[kDefaultMaxSockets];
2752 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522753 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132754 EXPECT_EQ(OK, handles[i].Init("bar",
2755 params_,
[email protected]bb1c4662013-11-14 00:00:072756 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522757 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132758 pool_.get(),
2759 BoundNetLog()));
[email protected]25eea382010-07-10 23:55:262760 }
2761
[email protected]2da659e2013-05-23 20:51:342762 base::MessageLoop::current()->RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262763
2764 // Cancel the pending request.
2765 handle.Reset();
2766
2767 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002768 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2769 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262770
[email protected]2da659e2013-05-23 20:51:342771 base::MessageLoop::current()->RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262772 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2773}
2774
[email protected]3f00be82010-09-27 19:50:022775TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442776 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2777 pool_->EnableConnectBackupJobs();
2778
2779 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2780 // timer.
2781 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2782 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522783 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132784 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar",
2785 params_,
[email protected]bb1c4662013-11-14 00:00:072786 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522787 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132788 pool_.get(),
2789 BoundNetLog()));
[email protected]4baaf9d2010-08-31 15:15:442790 ASSERT_TRUE(pool_->HasGroup("bar"));
2791 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102792 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442793
2794 // Cancel the socket request. This should cancel the backup timer. Wait for
2795 // the backup time to see if it indeed got canceled.
2796 handle.Reset();
2797 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002798 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2799 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]2da659e2013-05-23 20:51:342800 base::MessageLoop::current()->RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442801 ASSERT_TRUE(pool_->HasGroup("bar"));
2802 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2803}
2804
[email protected]3f00be82010-09-27 19:50:022805TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2806 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2807 pool_->EnableConnectBackupJobs();
2808
2809 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2810 // timer.
2811 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2812 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522813 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132814 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar",
2815 params_,
[email protected]bb1c4662013-11-14 00:00:072816 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522817 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132818 pool_.get(),
2819 BoundNetLog()));
[email protected]3f00be82010-09-27 19:50:022820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2821 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522822 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:132823 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar",
2824 params_,
[email protected]bb1c4662013-11-14 00:00:072825 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522826 callback2.callback(),
[email protected]2431756e2010-09-29 20:26:132827 pool_.get(),
2828 BoundNetLog()));
[email protected]3f00be82010-09-27 19:50:022829 ASSERT_TRUE(pool_->HasGroup("bar"));
2830 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2831
2832 // Cancel request 1 and then complete request 2. With the requests finished,
2833 // the backup timer should be cancelled.
2834 handle.Reset();
2835 EXPECT_EQ(OK, callback2.WaitForResult());
2836 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002837 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2838 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]2da659e2013-05-23 20:51:342839 base::MessageLoop::current()->RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022840}
2841
[email protected]eb5a99382010-07-11 03:18:262842// Test delayed socket binding for the case where we have two connects,
2843// and while one is waiting on a connect, the other frees up.
2844// The socket waiting on a connect should switch immediately to the freed
2845// up socket.
2846TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2847 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2848 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2849
2850 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522851 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132852 EXPECT_EQ(ERR_IO_PENDING,
2853 handle1.Init("a",
2854 params_,
[email protected]bb1c4662013-11-14 00:00:072855 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522856 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132857 pool_.get(),
2858 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262859 EXPECT_EQ(OK, callback.WaitForResult());
2860
2861 // No idle sockets, no pending jobs.
2862 EXPECT_EQ(0, pool_->IdleSocketCount());
2863 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2864
2865 // Create a second socket to the same host, but this one will wait.
2866 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2867 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132868 EXPECT_EQ(ERR_IO_PENDING,
2869 handle2.Init("a",
2870 params_,
[email protected]bb1c4662013-11-14 00:00:072871 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522872 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132873 pool_.get(),
2874 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262875 // No idle sockets, and one connecting job.
2876 EXPECT_EQ(0, pool_->IdleSocketCount());
2877 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2878
2879 // Return the first handle to the pool. This will initiate the delayed
2880 // binding.
2881 handle1.Reset();
2882
[email protected]2da659e2013-05-23 20:51:342883 base::MessageLoop::current()->RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262884
2885 // Still no idle sockets, still one pending connect job.
2886 EXPECT_EQ(0, pool_->IdleSocketCount());
2887 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2888
2889 // The second socket connected, even though it was a Waiting Job.
2890 EXPECT_EQ(OK, callback.WaitForResult());
2891
2892 // And we can see there is still one job waiting.
2893 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2894
2895 // Finally, signal the waiting Connect.
2896 client_socket_factory_.SignalJobs();
2897 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2898
[email protected]2da659e2013-05-23 20:51:342899 base::MessageLoop::current()->RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262900}
2901
2902// Test delayed socket binding when a group is at capacity and one
2903// of the group's sockets frees up.
2904TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2906 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2907
2908 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522909 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132910 EXPECT_EQ(ERR_IO_PENDING,
2911 handle1.Init("a",
2912 params_,
[email protected]bb1c4662013-11-14 00:00:072913 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522914 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132915 pool_.get(),
2916 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262917 EXPECT_EQ(OK, callback.WaitForResult());
2918
2919 // No idle sockets, no pending jobs.
2920 EXPECT_EQ(0, pool_->IdleSocketCount());
2921 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2922
2923 // Create a second socket to the same host, but this one will wait.
2924 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2925 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132926 EXPECT_EQ(ERR_IO_PENDING,
2927 handle2.Init("a",
2928 params_,
[email protected]bb1c4662013-11-14 00:00:072929 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522930 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132931 pool_.get(),
2932 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262933 // No idle sockets, and one connecting job.
2934 EXPECT_EQ(0, pool_->IdleSocketCount());
2935 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2936
2937 // Return the first handle to the pool. This will initiate the delayed
2938 // binding.
2939 handle1.Reset();
2940
[email protected]2da659e2013-05-23 20:51:342941 base::MessageLoop::current()->RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262942
2943 // Still no idle sockets, still one pending connect job.
2944 EXPECT_EQ(0, pool_->IdleSocketCount());
2945 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2946
2947 // The second socket connected, even though it was a Waiting Job.
2948 EXPECT_EQ(OK, callback.WaitForResult());
2949
2950 // And we can see there is still one job waiting.
2951 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2952
2953 // Finally, signal the waiting Connect.
2954 client_socket_factory_.SignalJobs();
2955 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2956
[email protected]2da659e2013-05-23 20:51:342957 base::MessageLoop::current()->RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262958}
2959
2960// Test out the case where we have one socket connected, one
2961// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512962// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262963// should complete, by taking the first socket's idle socket.
2964TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2966 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2967
2968 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522969 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132970 EXPECT_EQ(ERR_IO_PENDING,
2971 handle1.Init("a",
2972 params_,
[email protected]bb1c4662013-11-14 00:00:072973 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522974 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132975 pool_.get(),
2976 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262977 EXPECT_EQ(OK, callback.WaitForResult());
2978
2979 // No idle sockets, no pending jobs.
2980 EXPECT_EQ(0, pool_->IdleSocketCount());
2981 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2982
2983 // Create a second socket to the same host, but this one will wait.
2984 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2985 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132986 EXPECT_EQ(ERR_IO_PENDING,
2987 handle2.Init("a",
2988 params_,
[email protected]bb1c4662013-11-14 00:00:072989 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:522990 callback.callback(),
[email protected]2431756e2010-09-29 20:26:132991 pool_.get(),
2992 BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262993 // No idle sockets, and one connecting job.
2994 EXPECT_EQ(0, pool_->IdleSocketCount());
2995 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2996
2997 // Return the first handle to the pool. This will initiate the delayed
2998 // binding.
2999 handle1.Reset();
3000
[email protected]2da659e2013-05-23 20:51:343001 base::MessageLoop::current()->RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263002
3003 // Still no idle sockets, still one pending connect job.
3004 EXPECT_EQ(0, pool_->IdleSocketCount());
3005 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3006
3007 // The second socket connected, even though it was a Waiting Job.
3008 EXPECT_EQ(OK, callback.WaitForResult());
3009
3010 // And we can see there is still one job waiting.
3011 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3012
3013 // Finally, signal the waiting Connect.
3014 client_socket_factory_.SignalJobs();
3015 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3016
[email protected]2da659e2013-05-23 20:51:343017 base::MessageLoop::current()->RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263018}
3019
[email protected]2abfe90a2010-08-25 17:49:513020// Cover the case where on an available socket slot, we have one pending
3021// request that completes synchronously, thereby making the Group empty.
3022TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3023 const int kUnlimitedSockets = 100;
3024 const int kOneSocketPerGroup = 1;
3025 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3026
3027 // Make the first request asynchronous fail.
3028 // This will free up a socket slot later.
3029 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3030
3031 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523032 TestCompletionCallback callback1;
[email protected]2431756e2010-09-29 20:26:133033 EXPECT_EQ(ERR_IO_PENDING,
3034 handle1.Init("a",
3035 params_,
[email protected]bb1c4662013-11-14 00:00:073036 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523037 callback1.callback(),
[email protected]2431756e2010-09-29 20:26:133038 pool_.get(),
3039 BoundNetLog()));
[email protected]2abfe90a2010-08-25 17:49:513040 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3041
3042 // Make the second request synchronously fail. This should make the Group
3043 // empty.
3044 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3045 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523046 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513047 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3048 // when created.
[email protected]2431756e2010-09-29 20:26:133049 EXPECT_EQ(ERR_IO_PENDING,
3050 handle2.Init("a",
3051 params_,
[email protected]bb1c4662013-11-14 00:00:073052 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523053 callback2.callback(),
[email protected]2431756e2010-09-29 20:26:133054 pool_.get(),
3055 BoundNetLog()));
[email protected]2abfe90a2010-08-25 17:49:513056
3057 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3058
3059 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult());
3060 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult());
3061 EXPECT_FALSE(pool_->HasGroup("a"));
3062}
3063
[email protected]e1b54dc2010-10-06 21:27:223064TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3065 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3066
3067 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3068
3069 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523070 TestCompletionCallback callback1;
[email protected]e1b54dc2010-10-06 21:27:223071 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3072 params_,
[email protected]bb1c4662013-11-14 00:00:073073 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523074 callback1.callback(),
[email protected]e1b54dc2010-10-06 21:27:223075 pool_.get(),
3076 BoundNetLog()));
3077
3078 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523079 TestCompletionCallback callback2;
[email protected]e1b54dc2010-10-06 21:27:223080 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3081 params_,
[email protected]bb1c4662013-11-14 00:00:073082 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523083 callback2.callback(),
[email protected]e1b54dc2010-10-06 21:27:223084 pool_.get(),
3085 BoundNetLog()));
3086 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523087 TestCompletionCallback callback3;
[email protected]e1b54dc2010-10-06 21:27:223088 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a",
3089 params_,
[email protected]bb1c4662013-11-14 00:00:073090 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523091 callback3.callback(),
[email protected]e1b54dc2010-10-06 21:27:223092 pool_.get(),
3093 BoundNetLog()));
3094
3095 EXPECT_EQ(OK, callback1.WaitForResult());
3096 EXPECT_EQ(OK, callback2.WaitForResult());
3097 EXPECT_EQ(OK, callback3.WaitForResult());
3098
3099 // Use the socket.
[email protected]83039bb2011-12-09 18:43:553100 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
3101 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:223102
3103 handle1.Reset();
3104 handle2.Reset();
3105 handle3.Reset();
3106
3107 EXPECT_EQ(OK, handle1.Init("a",
3108 params_,
[email protected]bb1c4662013-11-14 00:00:073109 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523110 callback1.callback(),
[email protected]e1b54dc2010-10-06 21:27:223111 pool_.get(),
3112 BoundNetLog()));
3113 EXPECT_EQ(OK, handle2.Init("a",
3114 params_,
[email protected]bb1c4662013-11-14 00:00:073115 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523116 callback2.callback(),
[email protected]e1b54dc2010-10-06 21:27:223117 pool_.get(),
3118 BoundNetLog()));
3119 EXPECT_EQ(OK, handle3.Init("a",
3120 params_,
[email protected]bb1c4662013-11-14 00:00:073121 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523122 callback3.callback(),
[email protected]e1b54dc2010-10-06 21:27:223123 pool_.get(),
3124 BoundNetLog()));
3125
3126 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3127 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3128 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3129}
3130
[email protected]2c2bef152010-10-13 00:55:033131TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3132 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3133 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3134
3135 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3136
3137 ASSERT_TRUE(pool_->HasGroup("a"));
3138 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103139 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033140 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3141
3142 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523143 TestCompletionCallback callback1;
[email protected]2c2bef152010-10-13 00:55:033144 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3145 params_,
[email protected]bb1c4662013-11-14 00:00:073146 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523147 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033148 pool_.get(),
3149 BoundNetLog()));
3150
3151 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523152 TestCompletionCallback callback2;
[email protected]2c2bef152010-10-13 00:55:033153 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3154 params_,
[email protected]bb1c4662013-11-14 00:00:073155 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523156 callback2.callback(),
[email protected]2c2bef152010-10-13 00:55:033157 pool_.get(),
3158 BoundNetLog()));
3159
3160 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103161 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033162 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3163
3164 EXPECT_EQ(OK, callback1.WaitForResult());
3165 EXPECT_EQ(OK, callback2.WaitForResult());
3166 handle1.Reset();
3167 handle2.Reset();
3168
3169 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103170 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033171 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3172}
3173
3174TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3175 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3176 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3177
3178 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523179 TestCompletionCallback callback1;
[email protected]2c2bef152010-10-13 00:55:033180 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3181 params_,
[email protected]bb1c4662013-11-14 00:00:073182 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523183 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033184 pool_.get(),
3185 BoundNetLog()));
3186
3187 ASSERT_TRUE(pool_->HasGroup("a"));
3188 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103189 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033190 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3191
3192 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3193
3194 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103195 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033196 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3197
3198 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523199 TestCompletionCallback callback2;
[email protected]2c2bef152010-10-13 00:55:033200 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3201 params_,
[email protected]bb1c4662013-11-14 00:00:073202 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523203 callback2.callback(),
[email protected]2c2bef152010-10-13 00:55:033204 pool_.get(),
3205 BoundNetLog()));
3206
3207 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103208 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033209 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3210
3211 EXPECT_EQ(OK, callback1.WaitForResult());
3212 EXPECT_EQ(OK, callback2.WaitForResult());
3213 handle1.Reset();
3214 handle2.Reset();
3215
3216 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103217 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033218 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3219}
3220
3221TEST_F(ClientSocketPoolBaseTest,
3222 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
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;
[email protected]2c2bef152010-10-13 00:55:033228 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3229 params_,
[email protected]bb1c4662013-11-14 00:00:073230 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523231 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033232 pool_.get(),
3233 BoundNetLog()));
3234
3235 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523236 TestCompletionCallback callback2;
[email protected]2c2bef152010-10-13 00:55:033237 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3238 params_,
[email protected]bb1c4662013-11-14 00:00:073239 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523240 callback2.callback(),
[email protected]2c2bef152010-10-13 00:55:033241 pool_.get(),
3242 BoundNetLog()));
3243
3244 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523245 TestCompletionCallback callback3;
[email protected]2c2bef152010-10-13 00:55:033246 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a",
3247 params_,
[email protected]bb1c4662013-11-14 00:00:073248 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523249 callback3.callback(),
[email protected]2c2bef152010-10-13 00:55:033250 pool_.get(),
3251 BoundNetLog()));
3252
3253 ASSERT_TRUE(pool_->HasGroup("a"));
3254 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103255 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033256 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3257
3258 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3259
3260 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103261 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033262 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3263
3264 EXPECT_EQ(OK, callback1.WaitForResult());
3265 EXPECT_EQ(OK, callback2.WaitForResult());
3266 EXPECT_EQ(OK, callback3.WaitForResult());
3267 handle1.Reset();
3268 handle2.Reset();
3269 handle3.Reset();
3270
3271 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103272 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033273 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3274}
3275
3276TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3277 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3278 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3279
3280 ASSERT_FALSE(pool_->HasGroup("a"));
3281
3282 pool_->RequestSockets("a", &params_, kDefaultMaxSockets,
3283 BoundNetLog());
3284
3285 ASSERT_TRUE(pool_->HasGroup("a"));
3286 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103287 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033288
3289 ASSERT_FALSE(pool_->HasGroup("b"));
3290
3291 pool_->RequestSockets("b", &params_, kDefaultMaxSockets,
3292 BoundNetLog());
3293
3294 ASSERT_FALSE(pool_->HasGroup("b"));
3295}
3296
3297TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3298 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3299 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3300
3301 ASSERT_FALSE(pool_->HasGroup("a"));
3302
3303 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
3304 BoundNetLog());
3305
3306 ASSERT_TRUE(pool_->HasGroup("a"));
3307 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103308 EXPECT_EQ(kDefaultMaxSockets - 1,
3309 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483310 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033311
3312 ASSERT_FALSE(pool_->HasGroup("b"));
3313
3314 pool_->RequestSockets("b", &params_, kDefaultMaxSockets,
3315 BoundNetLog());
3316
3317 ASSERT_TRUE(pool_->HasGroup("b"));
3318 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483319 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033320}
3321
3322TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3323 CreatePool(4, 4);
3324 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3325
3326 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523327 TestCompletionCallback callback1;
[email protected]2c2bef152010-10-13 00:55:033328 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3329 params_,
[email protected]bb1c4662013-11-14 00:00:073330 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523331 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033332 pool_.get(),
3333 BoundNetLog()));
3334 ASSERT_EQ(OK, callback1.WaitForResult());
3335 handle1.Reset();
3336
3337 ASSERT_TRUE(pool_->HasGroup("a"));
3338 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103339 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033340 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3341
3342 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3343
3344 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103345 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033346 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3347}
3348
3349TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3350 CreatePool(4, 4);
3351 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3352
3353 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523354 TestCompletionCallback callback1;
[email protected]2c2bef152010-10-13 00:55:033355 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3356 params_,
[email protected]bb1c4662013-11-14 00:00:073357 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523358 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033359 pool_.get(),
3360 BoundNetLog()));
3361 ASSERT_EQ(OK, callback1.WaitForResult());
3362
3363 ASSERT_TRUE(pool_->HasGroup("a"));
3364 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103365 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033366 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3367 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3368
3369 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3370
3371 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103372 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033373 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3374 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3375}
3376
3377TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3378 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3379 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3380
3381 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
3382 BoundNetLog());
3383
3384 ASSERT_TRUE(pool_->HasGroup("a"));
3385 EXPECT_EQ(0, 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(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3388
3389 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
3390 BoundNetLog());
3391
3392 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103393 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033394 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3395}
3396
[email protected]3c819f522010-12-02 02:03:123397TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3398 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3399 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3400
3401 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
3402 BoundNetLog());
3403
3404 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523405
3406 connect_job_factory_->set_job_type(
3407 TestConnectJob::kMockAdditionalErrorStateJob);
3408 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
3409 BoundNetLog());
3410
3411 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123412}
3413
[email protected]8159a1c2012-06-07 00:00:103414TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033415 CreatePool(4, 4);
3416 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3417
3418 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3419
3420 ASSERT_TRUE(pool_->HasGroup("a"));
3421 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103422 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033423 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3424
3425 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3426 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103427 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033428 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3429
3430 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523431 TestCompletionCallback callback1;
[email protected]2c2bef152010-10-13 00:55:033432 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3433 params_,
[email protected]bb1c4662013-11-14 00:00:073434 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523435 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033436 pool_.get(),
3437 BoundNetLog()));
3438 ASSERT_EQ(OK, callback1.WaitForResult());
3439
3440 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523441 TestCompletionCallback callback2;
[email protected]2c2bef152010-10-13 00:55:033442 int rv = handle2.Init("a",
3443 params_,
[email protected]bb1c4662013-11-14 00:00:073444 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523445 callback2.callback(),
[email protected]2c2bef152010-10-13 00:55:033446 pool_.get(),
3447 BoundNetLog());
3448 if (rv != OK) {
3449 EXPECT_EQ(ERR_IO_PENDING, rv);
3450 EXPECT_EQ(OK, callback2.WaitForResult());
3451 }
3452
[email protected]8159a1c2012-06-07 00:00:103453 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3454 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3455 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3456 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3457
[email protected]2c2bef152010-10-13 00:55:033458 handle1.Reset();
3459 handle2.Reset();
3460
[email protected]8159a1c2012-06-07 00:00:103461 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3462 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033463 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3464
3465 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3466 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103467 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033468 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3469}
3470
3471TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3472 CreatePool(4, 4);
3473 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3474
3475 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3476
3477 ASSERT_TRUE(pool_->HasGroup("a"));
3478 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103479 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033480 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3481
3482 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3483 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103484 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033485 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3486
3487 pool_->RequestSockets("a", &params_, 3, BoundNetLog());
3488 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103489 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033490 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3491
3492 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3493 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103494 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033495 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3496}
3497
3498TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3499 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3500 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3501
3502 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3503
3504 ASSERT_TRUE(pool_->HasGroup("a"));
3505 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103506 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033507 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3508
3509 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523510 TestCompletionCallback callback1;
[email protected]2c2bef152010-10-13 00:55:033511 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3512 params_,
[email protected]bb1c4662013-11-14 00:00:073513 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523514 callback1.callback(),
[email protected]2c2bef152010-10-13 00:55:033515 pool_.get(),
3516 BoundNetLog()));
3517
3518 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103519 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033520 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3521
3522 ASSERT_EQ(OK, callback1.WaitForResult());
3523
[email protected]0dc88b32014-03-26 20:12:283524 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483525 // starts, it has a connect start time.
3526 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033527 handle1.Reset();
3528
3529 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3530}
3531
[email protected]034df0f32013-01-07 23:17:483532// Checks that fully connected preconnect jobs have no connect times, and are
3533// marked as reused.
3534TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3535 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3536 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3537 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3538
3539 ASSERT_TRUE(pool_->HasGroup("a"));
3540 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3541 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3542 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3543
3544 ClientSocketHandle handle;
3545 TestCompletionCallback callback;
3546 EXPECT_EQ(OK, handle.Init("a",
3547 params_,
[email protected]bb1c4662013-11-14 00:00:073548 DEFAULT_PRIORITY,
[email protected]034df0f32013-01-07 23:17:483549 callback.callback(),
3550 pool_.get(),
3551 BoundNetLog()));
3552
3553 // Make sure the idle socket was used.
3554 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3555
3556 TestLoadTimingInfoConnectedReused(handle);
3557 handle.Reset();
3558 TestLoadTimingInfoNotConnected(handle);
3559}
3560
[email protected]dcbe168a2010-12-02 03:14:463561// http://crbug.com/64940 regression test.
3562TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3563 const int kMaxTotalSockets = 3;
3564 const int kMaxSocketsPerGroup = 2;
3565 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3566 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3567
3568 // Note that group name ordering matters here. "a" comes before "b", so
3569 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3570
3571 // Set up one idle socket in "a".
3572 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523573 TestCompletionCallback callback1;
[email protected]dcbe168a2010-12-02 03:14:463574 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3575 params_,
[email protected]bb1c4662013-11-14 00:00:073576 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523577 callback1.callback(),
[email protected]dcbe168a2010-12-02 03:14:463578 pool_.get(),
3579 BoundNetLog()));
3580
3581 ASSERT_EQ(OK, callback1.WaitForResult());
3582 handle1.Reset();
3583 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3584
3585 // Set up two active sockets in "b".
3586 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523587 TestCompletionCallback callback2;
[email protected]dcbe168a2010-12-02 03:14:463588 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b",
3589 params_,
[email protected]bb1c4662013-11-14 00:00:073590 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523591 callback1.callback(),
[email protected]dcbe168a2010-12-02 03:14:463592 pool_.get(),
3593 BoundNetLog()));
3594 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b",
3595 params_,
[email protected]bb1c4662013-11-14 00:00:073596 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523597 callback2.callback(),
[email protected]dcbe168a2010-12-02 03:14:463598 pool_.get(),
3599 BoundNetLog()));
3600
3601 ASSERT_EQ(OK, callback1.WaitForResult());
3602 ASSERT_EQ(OK, callback2.WaitForResult());
3603 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103604 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463605 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3606
3607 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3608 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3609 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3610 // sockets for "a", and "b" should still have 2 active sockets.
3611
3612 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3613 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103614 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463615 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3616 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3617 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103618 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463619 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3620 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3621
3622 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3623 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3624 // "a" should result in closing 1 for "b".
3625 handle1.Reset();
3626 handle2.Reset();
3627 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3628 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3629
3630 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3631 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103632 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463633 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3634 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3635 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103636 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463637 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3638 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3639}
3640
[email protected]b7b8be42011-07-12 12:46:413641TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073642 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3643 pool_->EnableConnectBackupJobs();
3644
3645 // Make the ConnectJob hang until it times out, shorten the timeout.
3646 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3647 connect_job_factory_->set_timeout_duration(
3648 base::TimeDelta::FromMilliseconds(500));
3649 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3650 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103651 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073652 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073653
[email protected]b7b8be42011-07-12 12:46:413654 // Verify the backup timer doesn't create a backup job, by making
3655 // the backup job a pending job instead of a waiting job, so it
3656 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073657 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2da659e2013-05-23 20:51:343658 base::MessageLoop::current()->PostDelayedTask(
3659 FROM_HERE,
3660 base::MessageLoop::QuitClosure(),
3661 base::TimeDelta::FromSeconds(1));
3662 base::MessageLoop::current()->Run();
[email protected]a9fc8fc2011-05-10 02:41:073663 EXPECT_FALSE(pool_->HasGroup("a"));
3664}
3665
[email protected]b7b8be42011-07-12 12:46:413666TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073667 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3668 pool_->EnableConnectBackupJobs();
3669
3670 // Make the ConnectJob hang forever.
3671 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3672 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3673 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103674 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073675 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]2da659e2013-05-23 20:51:343676 base::MessageLoop::current()->RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073677
3678 // Make the backup job be a pending job, so it completes normally.
3679 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3680 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523681 TestCompletionCallback callback;
[email protected]a9fc8fc2011-05-10 02:41:073682 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
3683 params_,
[email protected]bb1c4662013-11-14 00:00:073684 DEFAULT_PRIORITY,
[email protected]6ecf2b92011-12-15 01:14:523685 callback.callback(),
[email protected]a9fc8fc2011-05-10 02:41:073686 pool_.get(),
3687 BoundNetLog()));
[email protected]b7b8be42011-07-12 12:46:413688 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073689 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103690 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073691 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3692 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3693 ASSERT_EQ(OK, callback.WaitForResult());
3694
3695 // The hung connect job should still be there, but everything else should be
3696 // complete.
3697 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103698 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073699 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3700 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3701}
3702
[email protected]0dc88b32014-03-26 20:12:283703// Tests that a preconnect that starts out with unread data can still be used.
3704// http://crbug.com/334467
3705TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3706 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3707 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3708
3709 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3710
3711 ASSERT_TRUE(pool_->HasGroup("a"));
3712 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3713 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3714 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3715
3716 // Fail future jobs to be sure that handle receives the preconnected socket
3717 // rather than closing it and making a new one.
3718 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3719 ClientSocketHandle handle;
3720 TestCompletionCallback callback;
3721 EXPECT_EQ(OK, handle.Init("a",
3722 params_,
3723 DEFAULT_PRIORITY,
3724 callback.callback(),
3725 pool_.get(),
3726 BoundNetLog()));
3727
3728 ASSERT_TRUE(pool_->HasGroup("a"));
3729 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3730 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3731 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3732
3733 // Drain the pending read.
3734 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3735
3736 TestLoadTimingInfoConnectedReused(handle);
3737 handle.Reset();
3738
3739 // The socket should be usable now that it's idle again.
3740 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3741}
3742
[email protected]043b68c82013-08-22 23:41:523743class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203744 public:
3745 MockLayeredPool(TestClientSocketPool* pool,
3746 const std::string& group_name)
3747 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203748 group_name_(group_name),
3749 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523750 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203751 }
3752
3753 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523754 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203755 }
3756
3757 int RequestSocket(TestClientSocketPool* pool) {
[email protected]bb1c4662013-11-14 00:00:073758 scoped_refptr<TestSocketParams> params(
3759 new TestSocketParams(false /* ignore_limits */));
3760 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203761 callback_.callback(), pool, BoundNetLog());
3762 }
3763
3764 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
[email protected]bb1c4662013-11-14 00:00:073765 scoped_refptr<TestSocketParams> params(
3766 new TestSocketParams(true /* ignore_limits */));
3767 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203768 callback_.callback(), pool, BoundNetLog());
3769 }
3770
3771 bool ReleaseOneConnection() {
3772 if (!handle_.is_initialized() || !can_release_connection_) {
3773 return false;
3774 }
3775 handle_.socket()->Disconnect();
3776 handle_.Reset();
3777 return true;
3778 }
3779
3780 void set_can_release_connection(bool can_release_connection) {
3781 can_release_connection_ = can_release_connection;
3782 }
3783
3784 MOCK_METHOD0(CloseOneIdleConnection, bool());
3785
3786 private:
3787 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203788 ClientSocketHandle handle_;
3789 TestCompletionCallback callback_;
3790 const std::string group_name_;
3791 bool can_release_connection_;
3792};
3793
3794TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3795 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3796 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3797
3798 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
3799 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3800 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3801 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523802 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203803}
3804
3805TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3806 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3807 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3808
3809 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
3810 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3811 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3812 .WillOnce(Invoke(&mock_layered_pool,
3813 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523814 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203815}
3816
3817// Tests the basic case of closing an idle socket in a higher layered pool when
3818// a new request is issued and the lower layer pool is stalled.
3819TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3820 CreatePool(1, 1);
3821 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3822
3823 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
3824 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3825 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3826 .WillOnce(Invoke(&mock_layered_pool,
3827 &MockLayeredPool::ReleaseOneConnection));
3828 ClientSocketHandle handle;
3829 TestCompletionCallback callback;
3830 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
3831 params_,
[email protected]bb1c4662013-11-14 00:00:073832 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203833 callback.callback(),
3834 pool_.get(),
3835 BoundNetLog()));
3836 EXPECT_EQ(OK, callback.WaitForResult());
3837}
3838
3839// Same as above, but the idle socket is in the same group as the stalled
3840// socket, and closes the only other request in its group when closing requests
3841// in higher layered pools. This generally shouldn't happen, but it may be
3842// possible if a higher level pool issues a request and the request is
3843// subsequently cancelled. Even if it's not possible, best not to crash.
3844TEST_F(ClientSocketPoolBaseTest,
3845 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3846 CreatePool(2, 2);
3847 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3848
3849 // Need a socket in another group for the pool to be stalled (If a group
3850 // has the maximum number of connections already, it's not stalled).
3851 ClientSocketHandle handle1;
3852 TestCompletionCallback callback1;
3853 EXPECT_EQ(OK, handle1.Init("group1",
3854 params_,
[email protected]bb1c4662013-11-14 00:00:073855 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203856 callback1.callback(),
3857 pool_.get(),
3858 BoundNetLog()));
3859
3860 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3861 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3862 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3863 .WillOnce(Invoke(&mock_layered_pool,
3864 &MockLayeredPool::ReleaseOneConnection));
3865 ClientSocketHandle handle;
3866 TestCompletionCallback callback2;
3867 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2",
3868 params_,
[email protected]bb1c4662013-11-14 00:00:073869 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203870 callback2.callback(),
3871 pool_.get(),
3872 BoundNetLog()));
3873 EXPECT_EQ(OK, callback2.WaitForResult());
3874}
3875
3876// Tests the case when an idle socket can be closed when a new request is
3877// issued, and the new request belongs to a group that was previously stalled.
3878TEST_F(ClientSocketPoolBaseTest,
3879 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3880 CreatePool(2, 2);
3881 std::list<TestConnectJob::JobType> job_types;
3882 job_types.push_back(TestConnectJob::kMockJob);
3883 job_types.push_back(TestConnectJob::kMockJob);
3884 job_types.push_back(TestConnectJob::kMockJob);
3885 job_types.push_back(TestConnectJob::kMockJob);
3886 connect_job_factory_->set_job_types(&job_types);
3887
3888 ClientSocketHandle handle1;
3889 TestCompletionCallback callback1;
3890 EXPECT_EQ(OK, handle1.Init("group1",
3891 params_,
[email protected]bb1c4662013-11-14 00:00:073892 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203893 callback1.callback(),
3894 pool_.get(),
3895 BoundNetLog()));
3896
3897 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3898 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3899 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3900 .WillRepeatedly(Invoke(&mock_layered_pool,
3901 &MockLayeredPool::ReleaseOneConnection));
3902 mock_layered_pool.set_can_release_connection(false);
3903
3904 // The third request is made when the socket pool is in a stalled state.
3905 ClientSocketHandle handle3;
3906 TestCompletionCallback callback3;
3907 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3",
3908 params_,
[email protected]bb1c4662013-11-14 00:00:073909 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203910 callback3.callback(),
3911 pool_.get(),
3912 BoundNetLog()));
3913
3914 base::RunLoop().RunUntilIdle();
3915 EXPECT_FALSE(callback3.have_result());
3916
3917 // The fourth request is made when the pool is no longer stalled. The third
3918 // request should be serviced first, since it was issued first and has the
3919 // same priority.
3920 mock_layered_pool.set_can_release_connection(true);
3921 ClientSocketHandle handle4;
3922 TestCompletionCallback callback4;
3923 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3",
3924 params_,
[email protected]bb1c4662013-11-14 00:00:073925 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203926 callback4.callback(),
3927 pool_.get(),
3928 BoundNetLog()));
3929 EXPECT_EQ(OK, callback3.WaitForResult());
3930 EXPECT_FALSE(callback4.have_result());
3931
3932 // Closing a handle should free up another socket slot.
3933 handle1.Reset();
3934 EXPECT_EQ(OK, callback4.WaitForResult());
3935}
3936
3937// Tests the case when an idle socket can be closed when a new request is
3938// issued, and the new request belongs to a group that was previously stalled.
3939//
3940// The two differences from the above test are that the stalled requests are not
3941// in the same group as the layered pool's request, and the the fourth request
3942// has a higher priority than the third one, so gets a socket first.
3943TEST_F(ClientSocketPoolBaseTest,
3944 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3945 CreatePool(2, 2);
3946 std::list<TestConnectJob::JobType> job_types;
3947 job_types.push_back(TestConnectJob::kMockJob);
3948 job_types.push_back(TestConnectJob::kMockJob);
3949 job_types.push_back(TestConnectJob::kMockJob);
3950 job_types.push_back(TestConnectJob::kMockJob);
3951 connect_job_factory_->set_job_types(&job_types);
3952
3953 ClientSocketHandle handle1;
3954 TestCompletionCallback callback1;
3955 EXPECT_EQ(OK, handle1.Init("group1",
3956 params_,
[email protected]bb1c4662013-11-14 00:00:073957 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:203958 callback1.callback(),
3959 pool_.get(),
3960 BoundNetLog()));
3961
3962 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3963 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3964 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3965 .WillRepeatedly(Invoke(&mock_layered_pool,
3966 &MockLayeredPool::ReleaseOneConnection));
3967 mock_layered_pool.set_can_release_connection(false);
3968
3969 // The third request is made when the socket pool is in a stalled state.
3970 ClientSocketHandle handle3;
3971 TestCompletionCallback callback3;
3972 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3",
3973 params_,
3974 MEDIUM,
3975 callback3.callback(),
3976 pool_.get(),
3977 BoundNetLog()));
3978
3979 base::RunLoop().RunUntilIdle();
3980 EXPECT_FALSE(callback3.have_result());
3981
3982 // The fourth request is made when the pool is no longer stalled. This
3983 // request has a higher priority than the third request, so is serviced first.
3984 mock_layered_pool.set_can_release_connection(true);
3985 ClientSocketHandle handle4;
3986 TestCompletionCallback callback4;
3987 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3",
3988 params_,
3989 HIGHEST,
3990 callback4.callback(),
3991 pool_.get(),
3992 BoundNetLog()));
3993 EXPECT_EQ(OK, callback4.WaitForResult());
3994 EXPECT_FALSE(callback3.have_result());
3995
3996 // Closing a handle should free up another socket slot.
3997 handle1.Reset();
3998 EXPECT_EQ(OK, callback3.WaitForResult());
3999}
4000
4001TEST_F(ClientSocketPoolBaseTest,
4002 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4003 CreatePool(1, 1);
4004 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4005
4006 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
4007 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get()));
4008 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4009 .WillRepeatedly(Invoke(&mock_layered_pool1,
4010 &MockLayeredPool::ReleaseOneConnection));
4011 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
4012 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()));
4013 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4014 .WillRepeatedly(Invoke(&mock_layered_pool2,
4015 &MockLayeredPool::ReleaseOneConnection));
4016 ClientSocketHandle handle;
4017 TestCompletionCallback callback;
4018 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
4019 params_,
[email protected]bb1c4662013-11-14 00:00:074020 DEFAULT_PRIORITY,
[email protected]58e562f2013-04-22 17:32:204021 callback.callback(),
4022 pool_.get(),
4023 BoundNetLog()));
4024 EXPECT_EQ(OK, callback.WaitForResult());
4025}
4026
[email protected]b021ece62013-06-11 11:06:334027// Test that when a socket pool and group are at their limits, a request
4028// with |ignore_limits| triggers creation of a new socket, and gets the socket
4029// instead of a request with the same priority that was issued earlier, but
4030// that does not have |ignore_limits| set.
4031TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]bb1c4662013-11-14 00:00:074032 scoped_refptr<TestSocketParams> params_ignore_limits(
4033 new TestSocketParams(true /* ignore_limits */));
[email protected]b021ece62013-06-11 11:06:334034 CreatePool(1, 1);
4035
4036 // Issue a request to reach the socket pool limit.
[email protected]bb1c4662013-11-14 00:00:074037 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
[email protected]b021ece62013-06-11 11:06:334038 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4039
4040 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4041
[email protected]bb1c4662013-11-14 00:00:074042 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
[email protected]b021ece62013-06-11 11:06:334043 params_));
4044 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4045
[email protected]bb1c4662013-11-14 00:00:074046 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
[email protected]b021ece62013-06-11 11:06:334047 params_ignore_limits));
4048 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4049
4050 EXPECT_EQ(OK, request(2)->WaitForResult());
4051 EXPECT_FALSE(request(1)->have_result());
4052}
4053
[email protected]c55fabd2013-11-04 23:26:564054// Test that when a socket pool and group are at their limits, a ConnectJob
4055// issued for a request with |ignore_limits| set is not cancelled when a request
4056// without |ignore_limits| issued to the same group is cancelled.
4057TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]bb1c4662013-11-14 00:00:074058 scoped_refptr<TestSocketParams> params_ignore_limits(
4059 new TestSocketParams(true /* ignore_limits */));
[email protected]c55fabd2013-11-04 23:26:564060 CreatePool(1, 1);
4061
4062 // Issue a request to reach the socket pool limit.
[email protected]bb1c4662013-11-14 00:00:074063 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
[email protected]c55fabd2013-11-04 23:26:564064 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4065
4066 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4067
[email protected]bb1c4662013-11-14 00:00:074068 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
4069 params_));
[email protected]c55fabd2013-11-04 23:26:564070 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4071
[email protected]bb1c4662013-11-14 00:00:074072 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
[email protected]b021ece62013-06-11 11:06:334073 params_ignore_limits));
4074 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4075
4076 // Cancel the pending request without ignore_limits set. The ConnectJob
4077 // should not be cancelled.
4078 request(1)->handle()->Reset();
4079 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4080
4081 EXPECT_EQ(OK, request(2)->WaitForResult());
4082 EXPECT_FALSE(request(1)->have_result());
4083}
4084
[email protected]f6d1d6eb2009-06-24 20:16:094085} // namespace
4086
4087} // namespace net