blob: 7ece03768d45a6f02f3d6e70d5be4ec48c568455 [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
Matt Menke9fa17d52019-03-25 19:12:265#include "net/socket/transport_client_socket_pool.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
tbansalf82cc8e2015-10-14 20:05:497#include <stdint.h>
dchengc7eeda422015-12-26 03:56:488#include <utility>
[email protected]51fdc7c2012-04-10 19:19:489#include <vector>
10
[email protected]6ecf2b92011-12-15 01:14:5211#include "base/bind.h"
12#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5913#include "base/callback.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
mmenke33d24423d2015-05-19 19:41:0915#include "base/logging.h"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1317#include "base/memory/weak_ptr.h"
Alexander Timin4f9c35c2018-11-01 20:15:2018#include "base/message_loop/message_loop.h"
Matt Menkef09e64c2019-04-23 22:16:2819#include "base/optional.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
Avi Drissman4365a4782018-12-28 19:26:2422#include "base/stl_util.h"
[email protected]fc9be5802013-06-11 10:56:5123#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1524#include "base/strings/stringprintf.h"
Matt Menke166443c2019-05-24 18:45:5925#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0826#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3527#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0328#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5929#include "net/base/features.h"
[email protected]034df0f32013-01-07 23:17:4830#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5931#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0632#include "net/base/net_errors.h"
Matt Menke166443c2019-05-24 18:45:5933#include "net/base/network_isolation_key.h"
Matt Menkebdf777802019-04-22 19:38:5934#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3635#include "net/base/proxy_server.h"
[email protected]ac790b42009-12-02 04:31:3136#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0937#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3538#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5139#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0740#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0041#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1942#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0043#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5644#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4645#include "net/log/test_net_log_entry.h"
46#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0947#include "net/socket/client_socket_factory.h"
48#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2649#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2850#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5451#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1752#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4453#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1054#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2655#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5156#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0157#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0158#include "net/test/test_with_scoped_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2859#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3860#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4861#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0962#include "testing/gtest/include/gtest/gtest.h"
63
robpercival214763f2016-07-01 23:27:0164using net::test::IsError;
65using net::test::IsOk;
66
[email protected]51fdc7c2012-04-10 19:19:4867using ::testing::Invoke;
68using ::testing::Return;
69
[email protected]f6d1d6eb2009-06-24 20:16:0970namespace net {
71
72namespace {
73
[email protected]211d21722009-07-22 15:48:5374const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2075const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5976constexpr base::TimeDelta kUnusedIdleSocketTimeout =
77 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0178
Matt Menkebdf777802019-04-22 19:38:5979ClientSocketPool::GroupId TestGroupId(
80 const std::string& host,
81 int port = 80,
82 ClientSocketPool::SocketType socket_type =
83 ClientSocketPool::SocketType::kHttp,
Matt Menke166443c2019-05-24 18:45:5984 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
85 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Matt Menkec6b3edf72019-03-19 17:00:3986 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
Matt Menke166443c2019-05-24 18:45:5987 privacy_mode, network_isolation_key);
Matt Menkec6b3edf72019-03-19 17:00:3988}
89
[email protected]034df0f32013-01-07 23:17:4890// Make sure |handle| sets load times correctly when it has been assigned a
91// reused socket.
92void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
93 LoadTimingInfo load_timing_info;
94 // Only pass true in as |is_reused|, as in general, HttpStream types should
95 // have stricter concepts of reuse than socket pools.
96 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
97
98 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1999 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48100
[email protected]b258e0792013-01-12 07:11:59101 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
102 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48103}
104
105// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33106// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48107// of a connection where |is_reused| is false may consider the connection
108// reused.
109void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
110 EXPECT_FALSE(handle.is_reused());
111
112 LoadTimingInfo load_timing_info;
113 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
114
115 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19116 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48117
[email protected]b258e0792013-01-12 07:11:59118 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
119 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
120 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48121
122 TestLoadTimingInfoConnectedReused(handle);
123}
124
125// Make sure |handle| sets load times correctly, in the case that it does not
126// currently have a socket.
127void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
128 // Should only be set to true once a socket is assigned, if at all.
129 EXPECT_FALSE(handle.is_reused());
130
131 LoadTimingInfo load_timing_info;
132 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
133
134 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19135 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48136
[email protected]b258e0792013-01-12 07:11:59137 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
138 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48139}
140
[email protected]3268023f2011-05-05 00:08:10141class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09142 public:
[email protected]034df0f32013-01-07 23:17:48143 explicit MockClientSocket(net::NetLog* net_log)
144 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28145 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20146 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30147 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09148
[email protected]0dc88b32014-03-26 20:12:28149 // Sets whether the socket has unread data. If true, the next call to Read()
150 // will return 1 byte and IsConnectedAndIdle() will return false.
151 void set_has_unread_data(bool has_unread_data) {
152 has_unread_data_ = has_unread_data;
153 }
154
[email protected]3f55aa12011-12-07 02:03:33155 // Socket implementation.
dchengb03027d2014-10-21 12:00:20156 int Read(IOBuffer* /* buf */,
157 int len,
Brad Lassey3a814172018-04-26 03:30:21158 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28159 if (has_unread_data_ && len > 0) {
160 has_unread_data_ = false;
161 was_used_to_convey_data_ = true;
162 return 1;
163 }
[email protected]e86df8dc2013-03-30 13:18:28164 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33165 }
[email protected]ab838892009-06-30 18:49:05166
[email protected]a2b2cfc2017-12-06 09:06:08167 int Write(
168 IOBuffer* /* buf */,
169 int len,
Brad Lassey3a814172018-04-26 03:30:21170 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08171 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01172 was_used_to_convey_data_ = true;
173 return len;
[email protected]ab838892009-06-30 18:49:05174 }
Avi Drissman13fc8932015-12-20 04:40:46175 int SetReceiveBufferSize(int32_t size) override { return OK; }
176 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05177
[email protected]dbf036f2011-12-06 23:33:24178 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21179 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24180 connected_ = true;
181 return OK;
182 }
[email protected]f6d1d6eb2009-06-24 20:16:09183
dchengb03027d2014-10-21 12:00:20184 void Disconnect() override { connected_ = false; }
185 bool IsConnected() const override { return connected_; }
186 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28187 return connected_ && !has_unread_data_;
188 }
[email protected]0b7648c2009-07-06 20:14:01189
dchengb03027d2014-10-21 12:00:20190 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16191 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09192 }
[email protected]f6d1d6eb2009-06-24 20:16:09193
dchengb03027d2014-10-21 12:00:20194 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35195 return ERR_UNEXPECTED;
196 }
197
tfarina428341112016-09-22 13:38:20198 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02199
dchengb03027d2014-10-21 12:00:20200 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37201 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20202 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
203 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03204 void GetConnectionAttempts(ConnectionAttempts* out) const override {
205 out->clear();
206 }
207 void ClearConnectionAttempts() override {}
208 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49209 int64_t GetTotalReceivedBytes() const override {
210 NOTIMPLEMENTED();
211 return 0;
212 }
Paul Jensen0f49dec2017-12-12 23:39:58213 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45214
[email protected]f6d1d6eb2009-06-24 20:16:09215 private:
216 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28217 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20218 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01219 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09220
[email protected]ab838892009-06-30 18:49:05221 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09222};
223
[email protected]5fc08e32009-07-15 17:09:57224class TestConnectJob;
225
[email protected]f6d1d6eb2009-06-24 20:16:09226class MockClientSocketFactory : public ClientSocketFactory {
227 public:
[email protected]ab838892009-06-30 18:49:05228 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09229
danakj655b66c2016-04-16 00:51:38230 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04231 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41232 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19233 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41234 NOTREACHED();
danakj655b66c2016-04-16 00:51:38235 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41236 }
237
Helen Lid5bb9222018-04-12 15:33:09238 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07239 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38240 std::unique_ptr<
241 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07242 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19243 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09244 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09245 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09246 }
247
danakj655b66c2016-04-16 00:51:38248 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
Matt Menke841fc412019-03-05 23:20:12249 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27250 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21251 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13252 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09253 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38254 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09255 }
Matt Menkefd956922019-02-04 23:44:03256
Matt Menke52cd95a2019-02-08 06:16:27257 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
258 std::unique_ptr<StreamSocket> stream_socket,
259 const std::string& user_agent,
260 const HostPortPair& endpoint,
261 const ProxyServer& proxy_server,
262 HttpAuthController* http_auth_controller,
263 bool tunnel,
264 bool using_spdy,
265 NextProto negotiated_protocol,
266 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27267 const NetworkTrafficAnnotationTag& traffic_annotation) override {
268 NOTIMPLEMENTED();
269 return nullptr;
270 }
271
[email protected]5fc08e32009-07-15 17:09:57272 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55273
[email protected]5fc08e32009-07-15 17:09:57274 void SignalJobs();
275
[email protected]03b7c8c2013-07-20 04:38:55276 void SignalJob(size_t job);
277
278 void SetJobLoadState(size_t job, LoadState load_state);
279
Matt Menke141b87f22019-01-30 02:43:03280 // Sets the HasConnectionEstablished value of the specified job to true,
281 // without invoking the callback.
282 void SetJobHasEstablishedConnection(size_t job);
283
[email protected]f6d1d6eb2009-06-24 20:16:09284 int allocation_count() const { return allocation_count_; }
285
[email protected]f6d1d6eb2009-06-24 20:16:09286 private:
287 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57288 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09289};
290
[email protected]ab838892009-06-30 18:49:05291class TestConnectJob : public ConnectJob {
292 public:
293 enum JobType {
294 kMockJob,
295 kMockFailingJob,
296 kMockPendingJob,
297 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57298 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10299
300 // Certificate errors return a socket in addition to an error code.
301 kMockCertErrorJob,
302 kMockPendingCertErrorJob,
303
[email protected]e60e47a2010-07-14 03:37:18304 kMockAdditionalErrorStateJob,
305 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28306 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10307
308 kMockAuthChallengeOnceJob,
309 kMockAuthChallengeTwiceJob,
310 kMockAuthChallengeOnceFailingJob,
311 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05312 };
313
[email protected]994d4932010-07-12 17:55:13314 // The kMockPendingJob uses a slight delay before allowing the connect
315 // to complete.
316 static const int kPendingConnectDelay = 2;
317
[email protected]ab838892009-06-30 18:49:05318 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40319 RequestPriority request_priority,
320 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34321 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43322 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05323 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43324 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40325 : ConnectJob(request_priority,
326 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38327 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43328 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38329 delegate,
330 nullptr /* net_log */,
331 NetLogSourceType::TRANSPORT_CONNECT_JOB,
332 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58333 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05334 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18335 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03336 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16337 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05338
[email protected]974ebd62009-08-03 23:14:34339 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13340 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34341 }
342
[email protected]03b7c8c2013-07-20 04:38:55343 void set_load_state(LoadState load_state) { load_state_ = load_state; }
344
Matt Menke141b87f22019-01-30 02:43:03345 void set_has_established_connection() {
346 DCHECK(!has_established_connection_);
347 has_established_connection_ = true;
348 }
349
[email protected]03b7c8c2013-07-20 04:38:55350 // From ConnectJob:
351
dchengb03027d2014-10-21 12:00:20352 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21353
Matt Menke141b87f22019-01-30 02:43:03354 bool HasEstablishedConnection() const override {
355 return has_established_connection_;
356 }
357
Matt Menke6f84d1f12019-04-11 19:26:47358 bool IsSSLError() const override { return store_additional_error_state_; }
359
360 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
361 if (store_additional_error_state_)
362 return base::MakeRefCounted<SSLCertRequestInfo>();
363 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18364 }
365
[email protected]974ebd62009-08-03 23:14:34366 private:
[email protected]03b7c8c2013-07-20 04:38:55367 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05368
dchengb03027d2014-10-21 12:00:20369 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05370 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35371 client_socket_factory_->CreateTransportClientSocket(
372 ignored, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05373 switch (job_type_) {
374 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13375 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10376 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05377 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13378 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10379 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05380 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57381 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47382
383 // Depending on execution timings, posting a delayed task can result
384 // in the task getting executed the at the earliest possible
385 // opportunity or only after returning once from the message loop and
386 // then a second call into the message loop. In order to make behavior
387 // more deterministic, we change the default delay to 2ms. This should
388 // always require us to wait for the second call into the message loop.
389 //
390 // N.B. The correct fix for this and similar timing problems is to
391 // abstract time for the purpose of unittests. Unfortunately, we have
392 // a lot of third-party components that directly call the various
393 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45394 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05395 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49396 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
397 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10398 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53399 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05400 return ERR_IO_PENDING;
401 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57402 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45403 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05404 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49405 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
406 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10407 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53408 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05409 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57410 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55411 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57412 client_socket_factory_->WaitForSignal(this);
413 waiting_success_ = true;
414 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10415 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13416 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10417 true /* cert_error */);
418 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13419 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45420 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13421 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49422 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
423 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10424 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53425 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13426 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18427 case kMockAdditionalErrorStateJob:
428 store_additional_error_state_ = true;
429 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10430 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18431 case kMockPendingAdditionalErrorStateJob:
432 set_load_state(LOAD_STATE_CONNECTING);
433 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45434 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18435 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49436 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
437 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10438 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53439 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18440 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28441 case kMockUnreadDataJob: {
442 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10443 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28444 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
445 return ret;
446 }
Matt Menkeb57663b32019-03-01 17:17:10447 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01448 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10449 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
450 return ERR_IO_PENDING;
451 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01452 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10453 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
454 return ERR_IO_PENDING;
455 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01456 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10457 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
458 return ERR_IO_PENDING;
459 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01460 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10461 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
462 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05463 default:
464 NOTREACHED();
danakj655b66c2016-04-16 00:51:38465 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05466 return ERR_FAILED;
467 }
468 }
469
Lily Chen02ef29a2018-11-30 16:31:43470 void ChangePriorityInternal(RequestPriority priority) override {}
471
Matt Menkeb57663b32019-03-01 17:17:10472 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13473 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03474 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05475 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10476 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59477 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10478 } else if (cert_error) {
479 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
480 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40481 } else {
[email protected]e772db3f2010-07-12 18:11:13482 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38483 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05484 }
[email protected]2ab05b52009-07-01 23:57:58485
486 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30487 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05488 return result;
489 }
490
Matt Menkeb57663b32019-03-01 17:17:10491 void DoAdvanceAuthChallenge(int remaining_challenges,
492 bool succeed_after_last_challenge) {
493 base::ThreadTaskRunnerHandle::Get()->PostTask(
494 FROM_HERE,
495 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
496 weak_factory_.GetWeakPtr(), remaining_challenges,
497 succeed_after_last_challenge));
498 }
499
500 void InvokeNextProxyAuthCallback(int remaining_challenges,
501 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01502 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10503 if (remaining_challenges == 0) {
504 DoConnect(succeed_after_last_challenge, true /* was_async */,
505 false /* cert_error */);
506 return;
507 }
508
509 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
510 // The auth tests here are just focused on ConnectJob bookkeeping.
511 HttpResponseInfo info;
512 NotifyDelegateOfProxyAuth(
513 info, nullptr /* http_auth_controller */,
514 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
515 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
516 succeed_after_last_challenge));
517 }
518
[email protected]5fc08e32009-07-15 17:09:57519 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05520 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57521 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21522 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03523 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18524 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05525
Jeremy Romand54000b22019-07-08 18:40:16526 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]d5492c52013-11-10 20:44:39527
[email protected]ab838892009-06-30 18:49:05528 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
529};
530
[email protected]d80a4322009-08-14 07:07:49531class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40532 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05533 public:
[email protected]034df0f32013-01-07 23:17:48534 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
535 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43536 : common_connect_job_params_(
537 nullptr /* client_socket_factory */,
538 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40539 nullptr /* http_auth_cache */,
540 nullptr /* http_auth_handler_factory */,
541 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13542 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40543 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43544 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00545 nullptr /* http_user_agent_settings */,
Matt Menkea6f99ad2019-03-08 02:26:43546 SSLClientSocketContext(),
547 SSLClientSocketContext(),
548 nullptr /* socket_performance_watcher_factory */,
549 nullptr /* network_quality_estimator */,
550 net_log,
551 nullptr /* websocket_endpoint_lock_manager */),
552 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35553 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43554 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05555
Chris Watkins7a41d3552017-12-01 02:13:27556 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05557
558 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
559
[email protected]51fdc7c2012-04-10 19:19:48560 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
561 job_types_ = job_types;
562 CHECK(!job_types_->empty());
563 }
564
[email protected]974ebd62009-08-03 23:14:34565 void set_timeout_duration(base::TimeDelta timeout_duration) {
566 timeout_duration_ = timeout_duration;
567 }
568
[email protected]3f55aa12011-12-07 02:03:33569 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55570
danakj655b66c2016-04-16 00:51:38571 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36572 ClientSocketPool::GroupId group_id,
573 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menkef09e64c2019-04-23 22:16:28574 const base::Optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Matt Menke16f5c2e52019-03-25 21:50:40575 RequestPriority request_priority,
576 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13577 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48578 EXPECT_TRUE(!job_types_ || !job_types_->empty());
579 TestConnectJob::JobType job_type = job_type_;
580 if (job_types_ && !job_types_->empty()) {
581 job_type = job_types_->front();
582 job_types_->pop_front();
583 }
Matt Menkea6f99ad2019-03-08 02:26:43584 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40585 job_type, request_priority, socket_tag, timeout_duration_,
586 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05587 }
588
589 private:
Matt Menkea6f99ad2019-03-08 02:26:43590 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05591 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48592 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34593 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57594 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05595
596 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
597};
598
[email protected]a937a06d2009-08-19 21:19:24599} // namespace
600
[email protected]a937a06d2009-08-19 21:19:24601namespace {
602
[email protected]5fc08e32009-07-15 17:09:57603void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26604 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57605 (*it)->Signal();
606 }
607 waiting_jobs_.clear();
608}
609
[email protected]03b7c8c2013-07-20 04:38:55610void MockClientSocketFactory::SignalJob(size_t job) {
611 ASSERT_LT(job, waiting_jobs_.size());
612 waiting_jobs_[job]->Signal();
613 waiting_jobs_.erase(waiting_jobs_.begin() + job);
614}
615
616void MockClientSocketFactory::SetJobLoadState(size_t job,
617 LoadState load_state) {
618 ASSERT_LT(job, waiting_jobs_.size());
619 waiting_jobs_[job]->set_load_state(load_state);
620}
621
Matt Menke141b87f22019-01-30 02:43:03622void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
623 ASSERT_LT(job, waiting_jobs_.size());
624 waiting_jobs_[job]->set_has_established_connection();
625}
626
Bence Béky98447b12018-05-08 03:14:01627class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09628 protected:
Alex Clarke0def2092018-12-10 12:01:45629 ClientSocketPoolBaseTest()
630 : TestWithScopedTaskEnvironment(
631 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03632 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54633 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40634 TransportClientSocketPool::connect_backup_jobs_enabled();
635 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54636 }
[email protected]2431756e2010-09-29 20:26:13637
dcheng67be2b1f2014-10-27 21:47:29638 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40639 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54640 connect_backup_jobs_enabled_);
641 }
[email protected]c9d6a1d2009-07-14 16:15:20642
Matt Menke9fa17d52019-03-25 19:12:26643 void CreatePool(int max_sockets,
644 int max_sockets_per_group,
645 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59646 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
647 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26648 ClientSocketPool::used_idle_socket_timeout(),
649 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16650 }
651
Matt Menke9fa17d52019-03-25 19:12:26652 void CreatePoolWithIdleTimeouts(int max_sockets,
653 int max_sockets_per_group,
654 base::TimeDelta unused_idle_socket_timeout,
655 base::TimeDelta used_idle_socket_timeout,
656 bool enable_backup_connect_jobs = false) {
[email protected]c9d6a1d2009-07-14 16:15:20657 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26658 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
659 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
660 &net_log_);
661 connect_job_factory_ = connect_job_factory.get();
662 pool_ = TransportClientSocketPool::CreateForTesting(
663 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
664 used_idle_socket_timeout, std::move(connect_job_factory),
665 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20666 }
[email protected]f6d1d6eb2009-06-24 20:16:09667
mmenked3641e12016-01-28 16:06:15668 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39669 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33670 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15671 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39672 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15673 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33674 }
675
Matt Menkec6b3edf72019-03-19 17:00:39676 int StartRequest(const ClientSocketPool::GroupId& group_id,
677 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15678 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39679 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09680 }
681
[email protected]2431756e2010-09-29 20:26:13682 int GetOrderOfRequest(size_t index) const {
683 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09684 }
685
[email protected]2431756e2010-09-29 20:26:13686 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
687 return test_base_.ReleaseOneConnection(keep_alive);
688 }
689
690 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
691 test_base_.ReleaseAllConnections(keep_alive);
692 }
693
694 TestSocketRequest* request(int i) { return test_base_.request(i); }
695 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38696 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42697 return test_base_.requests();
698 }
rdsmith29dbad12017-02-17 02:22:18699 // Only counts the requests that get sockets asynchronously;
700 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13701 size_t completion_count() const { return test_base_.completion_count(); }
702
vishal.b62985ca92015-04-17 08:45:51703 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54704 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09705 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04706 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26707 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19708 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26709 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13710 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09711};
712
[email protected]5fc08e32009-07-15 17:09:57713TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53714 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20715
[email protected]6ecf2b92011-12-15 01:14:52716 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06717 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51718 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48719 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53720
Matt Menkef09e64c2019-04-23 22:16:28721 EXPECT_EQ(OK, handle.Init(
722 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
723 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
724 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
725 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09726 EXPECT_TRUE(handle.is_initialized());
727 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48728 TestLoadTimingInfoConnectedNotReused(handle);
729
[email protected]f6d1d6eb2009-06-24 20:16:09730 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48731 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30732
mmenke43758e62015-05-04 21:09:46733 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40734 log.GetEntries(&entries);
735
Matt Menke9fa17d52019-03-25 19:12:26736 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53737 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26738 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00739 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26740 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
741 EXPECT_TRUE(LogContainsEvent(
742 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
743 NetLogEventPhase::NONE));
744 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00745 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
746 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26747 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09748}
749
[email protected]ab838892009-06-30 18:49:05750TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53751 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20752
[email protected]ab838892009-06-30 18:49:05753 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51754 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53755
[email protected]2431756e2010-09-29 20:26:13756 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52757 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18758 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13759 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51760 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50761 EXPECT_EQ(
762 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:28763 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
764 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
765 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
766 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13767 EXPECT_FALSE(handle.socket());
768 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51769 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48770 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30771
mmenke43758e62015-05-04 21:09:46772 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40773 log.GetEntries(&entries);
774
Matt Menke9fa17d52019-03-25 19:12:26775 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17776 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26777 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00778 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26779 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
780 EXPECT_TRUE(LogContainsEvent(
781 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
782 NetLogEventPhase::NONE));
783 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09784}
785
Matt Menkef6edce752019-03-19 17:21:56786// Make sure different groups do not share sockets.
787TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59788 base::test::ScopedFeatureList feature_list;
789 feature_list.InitAndEnableFeature(
790 features::kPartitionConnectionsByNetworkIsolationKey);
791
Matt Menkef6edce752019-03-19 17:21:56792 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
793
794 const HostPortPair kHostPortPairs[] = {
795 {"a", 80},
796 {"a", 443},
797 {"b", 80},
798 };
799
800 const ClientSocketPool::SocketType kSocketTypes[] = {
801 ClientSocketPool::SocketType::kHttp,
802 ClientSocketPool::SocketType::kSsl,
Matt Menkef6edce752019-03-19 17:21:56803 };
804
Matt Menkebdf777802019-04-22 19:38:59805 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
806 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56807
Matt Menke166443c2019-05-24 18:45:59808 const NetworkIsolationKey kNetworkIsolationKeys[] = {
809 NetworkIsolationKey(url::Origin::Create(GURL("http://a.test/"))),
810 NetworkIsolationKey(url::Origin::Create(GURL("http://b.test/"))),
811 };
812
Matt Menkef6edce752019-03-19 17:21:56813 int total_idle_sockets = 0;
814
815 // Walk through each GroupId, making sure that requesting a socket for one
816 // group does not return a previously connected socket for another group.
817 for (const auto& host_port_pair : kHostPortPairs) {
818 SCOPED_TRACE(host_port_pair.ToString());
819 for (const auto& socket_type : kSocketTypes) {
820 SCOPED_TRACE(static_cast<int>(socket_type));
821 for (const auto& privacy_mode : kPrivacyModes) {
822 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59823 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
824 SCOPED_TRACE(network_isolation_key.ToString());
Matt Menkef6edce752019-03-19 17:21:56825
Matt Menke166443c2019-05-24 18:45:59826 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56827
Matt Menke166443c2019-05-24 18:45:59828 ClientSocketPool::GroupId group_id(
829 host_port_pair, socket_type, privacy_mode, network_isolation_key);
Matt Menkef6edce752019-03-19 17:21:56830
Matt Menke166443c2019-05-24 18:45:59831 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56832
Matt Menke166443c2019-05-24 18:45:59833 TestCompletionCallback callback;
834 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56835
Matt Menke166443c2019-05-24 18:45:59836 // Since the group is empty, requesting a socket should not complete
837 // synchronously.
838 EXPECT_THAT(
839 handle.Init(group_id, params_, base::nullopt, DEFAULT_PRIORITY,
840 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
841 callback.callback(),
842 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
843 NetLogWithSource()),
844 IsError(ERR_IO_PENDING));
845 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
846 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56847
Matt Menke166443c2019-05-24 18:45:59848 EXPECT_THAT(callback.WaitForResult(), IsOk());
849 EXPECT_TRUE(handle.socket());
850 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
851 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56852
Matt Menke166443c2019-05-24 18:45:59853 // Return socket to pool.
854 handle.Reset();
855 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56856
Matt Menke166443c2019-05-24 18:45:59857 // Requesting a socket again should return the same socket as before,
858 // so should complete synchronously.
859 EXPECT_THAT(
860 handle.Init(group_id, params_, base::nullopt, DEFAULT_PRIORITY,
861 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
862 callback.callback(),
863 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
864 NetLogWithSource()),
865 IsOk());
866 EXPECT_TRUE(handle.socket());
867 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56868
Matt Menke166443c2019-05-24 18:45:59869 // Return socket to pool again.
870 handle.Reset();
871 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56872
Matt Menke166443c2019-05-24 18:45:59873 ++total_idle_sockets;
874 }
Matt Menkef6edce752019-03-19 17:21:56875 }
876 }
877 }
878}
879
[email protected]211d21722009-07-22 15:48:53880TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
881 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
882
[email protected]9e743cd2010-03-16 07:03:53883 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30884
Matt Menkec6b3edf72019-03-19 17:00:39885 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
886 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
887 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
888 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53889
[email protected]2431756e2010-09-29 20:26:13890 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53891 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13892 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53893
Matt Menkec6b3edf72019-03-19 17:00:39894 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
895 IsError(ERR_IO_PENDING));
896 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
897 IsError(ERR_IO_PENDING));
898 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
899 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53900
[email protected]2431756e2010-09-29 20:26:13901 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53902
[email protected]2431756e2010-09-29 20:26:13903 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53904 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13905 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53906
907 EXPECT_EQ(1, GetOrderOfRequest(1));
908 EXPECT_EQ(2, GetOrderOfRequest(2));
909 EXPECT_EQ(3, GetOrderOfRequest(3));
910 EXPECT_EQ(4, GetOrderOfRequest(4));
911 EXPECT_EQ(5, GetOrderOfRequest(5));
912 EXPECT_EQ(6, GetOrderOfRequest(6));
913 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17914
915 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13916 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53917}
918
919TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
920 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
921
[email protected]9e743cd2010-03-16 07:03:53922 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30923
[email protected]211d21722009-07-22 15:48:53924 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39925 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
926 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
927 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
928 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53929
[email protected]2431756e2010-09-29 20:26:13930 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53931 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13932 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53933
934 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39935 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
936 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53937
[email protected]2431756e2010-09-29 20:26:13938 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53939
[email protected]2431756e2010-09-29 20:26:13940 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53941 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13942 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53943
944 EXPECT_EQ(1, GetOrderOfRequest(1));
945 EXPECT_EQ(2, GetOrderOfRequest(2));
946 EXPECT_EQ(3, GetOrderOfRequest(3));
947 EXPECT_EQ(4, GetOrderOfRequest(4));
948 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17949
950 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13951 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53952}
953
954TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
955 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
956
Matt Menkec6b3edf72019-03-19 17:00:39957 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
958 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
959 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
960 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53961
[email protected]2431756e2010-09-29 20:26:13962 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53963 client_socket_factory_.allocation_count());
964
Matt Menkec6b3edf72019-03-19 17:00:39965 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
966 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
967 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53968
[email protected]2431756e2010-09-29 20:26:13969 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53970
[email protected]2431756e2010-09-29 20:26:13971 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53972
973 // First 4 requests don't have to wait, and finish in order.
974 EXPECT_EQ(1, GetOrderOfRequest(1));
975 EXPECT_EQ(2, GetOrderOfRequest(2));
976 EXPECT_EQ(3, GetOrderOfRequest(3));
977 EXPECT_EQ(4, GetOrderOfRequest(4));
978
Matt Menkec6b3edf72019-03-19 17:00:39979 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
980 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53981 EXPECT_EQ(7, GetOrderOfRequest(5));
982 EXPECT_EQ(6, GetOrderOfRequest(6));
983 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17984
985 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13986 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53987}
988
rdsmith29dbad12017-02-17 02:22:18989// Test reprioritizing a request before completion doesn't interfere with
990// its completion.
991TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
992 CreatePool(kDefaultMaxSockets, 1);
993
Matt Menkec6b3edf72019-03-19 17:00:39994 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
995 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:18996 EXPECT_TRUE(request(0)->handle()->socket());
997 EXPECT_FALSE(request(1)->handle()->socket());
998
Lily Chenecebf932018-11-02 17:15:43999 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181000
1001 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1002
1003 EXPECT_TRUE(request(1)->handle()->socket());
1004}
1005
1006// Reprioritize a request up past another one and make sure that changes the
1007// completion order.
1008TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1009 CreatePool(kDefaultMaxSockets, 1);
1010
Matt Menkec6b3edf72019-03-19 17:00:391011 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1012 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1013 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181014 EXPECT_TRUE(request(0)->handle()->socket());
1015 EXPECT_FALSE(request(1)->handle()->socket());
1016 EXPECT_FALSE(request(2)->handle()->socket());
1017
1018 request(2)->handle()->SetPriority(HIGHEST);
1019
1020 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1021
1022 EXPECT_EQ(1, GetOrderOfRequest(1));
1023 EXPECT_EQ(3, GetOrderOfRequest(2));
1024 EXPECT_EQ(2, GetOrderOfRequest(3));
1025}
1026
1027// Reprioritize a request without changing relative priorities and check
1028// that the order doesn't change.
1029TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1030 CreatePool(kDefaultMaxSockets, 1);
1031
Matt Menkec6b3edf72019-03-19 17:00:391032 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1033 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1034 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181035 EXPECT_TRUE(request(0)->handle()->socket());
1036 EXPECT_FALSE(request(1)->handle()->socket());
1037 EXPECT_FALSE(request(2)->handle()->socket());
1038
1039 request(2)->handle()->SetPriority(MEDIUM);
1040
1041 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1042
1043 EXPECT_EQ(1, GetOrderOfRequest(1));
1044 EXPECT_EQ(2, GetOrderOfRequest(2));
1045 EXPECT_EQ(3, GetOrderOfRequest(3));
1046}
1047
1048// Reprioritize a request past down another one and make sure that changes the
1049// completion order.
1050TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1051 CreatePool(kDefaultMaxSockets, 1);
1052
Matt Menkec6b3edf72019-03-19 17:00:391053 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1054 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1055 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181056 EXPECT_TRUE(request(0)->handle()->socket());
1057 EXPECT_FALSE(request(1)->handle()->socket());
1058 EXPECT_FALSE(request(2)->handle()->socket());
1059
1060 request(1)->handle()->SetPriority(LOW);
1061
1062 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1063
1064 EXPECT_EQ(1, GetOrderOfRequest(1));
1065 EXPECT_EQ(3, GetOrderOfRequest(2));
1066 EXPECT_EQ(2, GetOrderOfRequest(3));
1067}
1068
1069// Reprioritize a request to the same level as another and confirm it is
1070// put after the old request.
1071TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1072 CreatePool(kDefaultMaxSockets, 1);
1073
Matt Menkec6b3edf72019-03-19 17:00:391074 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1075 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1076 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181077 EXPECT_TRUE(request(0)->handle()->socket());
1078 EXPECT_FALSE(request(1)->handle()->socket());
1079 EXPECT_FALSE(request(2)->handle()->socket());
1080
1081 request(1)->handle()->SetPriority(MEDIUM);
1082
1083 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1084
1085 EXPECT_EQ(1, GetOrderOfRequest(1));
1086 EXPECT_EQ(3, GetOrderOfRequest(2));
1087 EXPECT_EQ(2, GetOrderOfRequest(3));
1088}
1089
[email protected]211d21722009-07-22 15:48:531090TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1091 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1092
Matt Menkec6b3edf72019-03-19 17:00:391093 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1094 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1095 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1096 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531097
[email protected]2431756e2010-09-29 20:26:131098 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531099 client_socket_factory_.allocation_count());
1100
Matt Menkec6b3edf72019-03-19 17:00:391101 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1102 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1103 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531104
[email protected]2431756e2010-09-29 20:26:131105 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531106
[email protected]2431756e2010-09-29 20:26:131107 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531108 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131109 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531110
1111 // First 4 requests don't have to wait, and finish in order.
1112 EXPECT_EQ(1, GetOrderOfRequest(1));
1113 EXPECT_EQ(2, GetOrderOfRequest(2));
1114 EXPECT_EQ(3, GetOrderOfRequest(3));
1115 EXPECT_EQ(4, GetOrderOfRequest(4));
1116
1117 // Request ("b", 7) has the highest priority, but we can't make new socket for
1118 // group "b", because it has reached the per-group limit. Then we make
1119 // socket for ("c", 6), because it has higher priority than ("a", 4),
1120 // and we still can't make a socket for group "b".
1121 EXPECT_EQ(5, GetOrderOfRequest(5));
1122 EXPECT_EQ(6, GetOrderOfRequest(6));
1123 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171124
1125 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131126 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531127}
1128
1129// Make sure that we count connecting sockets against the total limit.
1130TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1131 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1132
Matt Menkec6b3edf72019-03-19 17:00:391133 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1134 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1135 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531136
1137 // Create one asynchronous request.
1138 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391139 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1140 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531141
[email protected]6b175382009-10-13 06:47:471142 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1143 // actually become pending until 2ms after they have been created. In order
1144 // to flush all tasks, we need to wait so that we know there are no
1145 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451146 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471147
[email protected]211d21722009-07-22 15:48:531148 // The next synchronous request should wait for its turn.
1149 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391150 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1151 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531152
[email protected]2431756e2010-09-29 20:26:131153 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531154
[email protected]2431756e2010-09-29 20:26:131155 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531156 client_socket_factory_.allocation_count());
1157
1158 EXPECT_EQ(1, GetOrderOfRequest(1));
1159 EXPECT_EQ(2, GetOrderOfRequest(2));
1160 EXPECT_EQ(3, GetOrderOfRequest(3));
1161 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171162 EXPECT_EQ(5, GetOrderOfRequest(5));
1163
1164 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131165 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531166}
1167
[email protected]6427fe22010-04-16 22:27:411168TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1169 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1170 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1171
Matt Menkec6b3edf72019-03-19 17:00:391172 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1173 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1174 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1175 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411176
1177 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1178
1179 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1180
Matt Menkec6b3edf72019-03-19 17:00:391181 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1182 IsError(ERR_IO_PENDING));
1183 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1184 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411185
1186 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1187
[email protected]2431756e2010-09-29 20:26:131188 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411189 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131190 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411191 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131192 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1193 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411194 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1195}
1196
[email protected]d7027bb2010-05-10 18:58:541197TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1198 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1199 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1200
1201 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521202 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501203 EXPECT_EQ(
1204 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281205 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1206 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1207 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1208 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541209
1210 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241211 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521212 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501213 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391214 handles[i].Init(
Matt Menkef09e64c2019-04-23 22:16:281215 TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
1216 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1217 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1218 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541219 }
1220
1221 // One will be stalled, cancel all the handles now.
1222 // This should hit the OnAvailableSocketSlot() code where we previously had
1223 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241224 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541225 handles[i].Reset();
1226}
1227
[email protected]eb5a99382010-07-11 03:18:261228TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541229 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1230 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1231
[email protected]eb5a99382010-07-11 03:18:261232 {
1233 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521234 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261235 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkef09e64c2019-04-23 22:16:281236 EXPECT_EQ(OK,
1237 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1238 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1239 ClientSocketPool::RespectLimits::ENABLED,
1240 callbacks[i].callback(),
1241 ClientSocketPool::ProxyAuthCallback(),
1242 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261243 }
1244
1245 // Force a stalled group.
1246 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521247 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201248 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391249 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281250 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1251 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1252 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1253 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261254
1255 // Cancel the stalled request.
1256 stalled_handle.Reset();
1257
1258 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1259 EXPECT_EQ(0, pool_->IdleSocketCount());
1260
1261 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541262 }
1263
[email protected]43a21b82010-06-10 21:30:541264 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1265 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261266}
[email protected]43a21b82010-06-10 21:30:541267
[email protected]eb5a99382010-07-11 03:18:261268TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1269 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1270 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1271
1272 {
1273 ClientSocketHandle handles[kDefaultMaxSockets];
1274 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521275 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201276 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391277 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281278 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391279 ClientSocketPool::RespectLimits::ENABLED,
1280 callback.callback(),
1281 ClientSocketPool::ProxyAuthCallback(),
1282 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261283 }
1284
1285 // Force a stalled group.
1286 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1287 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521288 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201289 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391290 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281291 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1292 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1293 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1294 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261295
1296 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261297 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1298 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1299 TestGroupId("foo")));
1300 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1301 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261302
1303 // Cancel the stalled request.
1304 handles[0].Reset();
1305
[email protected]eb5a99382010-07-11 03:18:261306 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261307 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1308 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1309 TestGroupId("foo")));
1310 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1311 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261312
1313 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011314 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261315
1316 EXPECT_EQ(kDefaultMaxSockets + 1,
1317 client_socket_factory_.allocation_count());
1318 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261319 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1320 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1321 TestGroupId("foo")));
1322 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1323 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261324
1325 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541326 }
1327
[email protected]eb5a99382010-07-11 03:18:261328 EXPECT_EQ(1, pool_->IdleSocketCount());
1329}
[email protected]43a21b82010-06-10 21:30:541330
[email protected]eb5a99382010-07-11 03:18:261331TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1332 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1333 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541334
[email protected]eb5a99382010-07-11 03:18:261335 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521336 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261337 {
[email protected]51fdc7c2012-04-10 19:19:481338 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261339 ClientSocketHandle handles[kDefaultMaxSockets];
1340 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521341 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391342 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281343 OK, handles[i].Init(
1344 TestGroupId(base::StringPrintf("Take 2: %d", i)), params_,
1345 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1346 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1347 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1348 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261349 }
1350
1351 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1352 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481353 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261354
1355 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201356 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391357 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281358 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1359 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1360 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1361 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481362 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261363
1364 // Dropping out of scope will close all handles and return them to idle.
1365 }
[email protected]43a21b82010-06-10 21:30:541366
1367 // But if we wait for it, the released idle sockets will be closed in
1368 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011369 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261370
1371 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1372 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541373}
1374
1375// Regression test for http://crbug.com/40952.
1376TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261377 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1378 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541379 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1380
1381 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1382 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521383 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391384 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281385 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391386 ClientSocketPool::RespectLimits::ENABLED,
1387 callback.callback(),
1388 ClientSocketPool::ProxyAuthCallback(),
1389 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541390 }
1391
1392 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281393 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541394
1395 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1396 // reuse a socket.
1397 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1398 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521399 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541400
1401 // "0" is special here, since it should be the first entry in the sorted map,
1402 // which is the one which we would close an idle socket for. We shouldn't
1403 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391404 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281405 TestGroupId("0"), params_, base::nullopt, DEFAULT_PRIORITY,
1406 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391407 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1408 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541409
1410 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1411 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1412}
1413
[email protected]ab838892009-06-30 18:49:051414TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531415 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091416
Matt Menkec6b3edf72019-03-19 17:00:391417 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1418 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1419 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1420 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1421 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1422 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1423 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1424 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091425
[email protected]2431756e2010-09-29 20:26:131426 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201427 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1428 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131429 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1430 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091431
[email protected]c9d6a1d2009-07-14 16:15:201432 EXPECT_EQ(1, GetOrderOfRequest(1));
1433 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031434 EXPECT_EQ(8, GetOrderOfRequest(3));
1435 EXPECT_EQ(6, GetOrderOfRequest(4));
1436 EXPECT_EQ(4, GetOrderOfRequest(5));
1437 EXPECT_EQ(3, GetOrderOfRequest(6));
1438 EXPECT_EQ(5, GetOrderOfRequest(7));
1439 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171440
1441 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131442 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091443}
1444
[email protected]ab838892009-06-30 18:49:051445TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531446 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091447
Matt Menkec6b3edf72019-03-19 17:00:391448 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1449 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1450 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1451 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1452 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1453 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1454 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091455
[email protected]2431756e2010-09-29 20:26:131456 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091457
[email protected]2431756e2010-09-29 20:26:131458 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011459 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201460
[email protected]2431756e2010-09-29 20:26:131461 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201462 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131463 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1464 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091465}
1466
Matt Menke7eb405e2019-04-25 20:48:211467TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1468 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1469
1470 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1471 ClientSocketHandle handle;
1472 TestCompletionCallback callback;
1473 EXPECT_EQ(
1474 ERR_IO_PENDING,
1475 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1476 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1477 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1478 pool_.get(), NetLogWithSource()));
1479
1480 EXPECT_THAT(callback.WaitForResult(), IsOk());
1481 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1482 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1483 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1484 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1485
1486 handle.ResetAndCloseSocket();
1487 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1488}
1489
Matt Menke99251ea42019-04-25 22:59:021490// This test will start up a socket request and then call Reset() on the handle.
1491// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211492TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531493 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201494
[email protected]ab838892009-06-30 18:49:051495 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131496 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521497 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501498 EXPECT_EQ(
1499 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281500 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1501 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1502 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1503 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131504 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211505 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1506 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1507}
1508
Matt Menke99251ea42019-04-25 22:59:021509// This test will start up a socket request and then call ResetAndCloseSocket()
1510// on the handle. The pending ConnectJob or connected socket should be
1511// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211512TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1513 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1514
Matt Menke99251ea42019-04-25 22:59:021515 // When true, the socket connects before it's canceled.
1516 for (bool cancel_when_callback_pending : {false, true}) {
1517 if (cancel_when_callback_pending) {
1518 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1519 } else {
1520 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1521 }
1522 ClientSocketHandle handle;
1523 TestCompletionCallback callback;
1524 EXPECT_EQ(
1525 ERR_IO_PENDING,
1526 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1527 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1528 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1529 pool_.get(), NetLogWithSource()));
1530 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1531 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1532
1533 if (cancel_when_callback_pending) {
1534 client_socket_factory_.SignalJobs();
1535 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1536 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1537 }
1538
1539 handle.ResetAndCloseSocket();
1540 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1541 }
Matt Menke7eb405e2019-04-25 20:48:211542}
1543
1544TEST_F(ClientSocketPoolBaseTest,
1545 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1546 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1547
Matt Menke99251ea42019-04-25 22:59:021548 // When true, the sockets connect before they're canceled.
1549 for (bool cancel_when_callback_pending : {false, true}) {
1550 if (cancel_when_callback_pending) {
1551 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1552 } else {
1553 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1554 }
Matt Menke7eb405e2019-04-25 20:48:211555
Matt Menke99251ea42019-04-25 22:59:021556 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1557 TestCompletionCallback callback;
1558 // Make |kDefaultMaxSockets + 1| socket requests.
1559 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1560 std::unique_ptr<ClientSocketHandle> handle =
1561 std::make_unique<ClientSocketHandle>();
1562 EXPECT_EQ(ERR_IO_PENDING,
1563 handle->Init(
1564 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1565 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1566 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1567 pool_.get(), NetLogWithSource()));
1568 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211569 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021570 EXPECT_EQ(
1571 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1572 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1573 }
1574
1575 if (cancel_when_callback_pending) {
1576 client_socket_factory_.SignalJobs();
1577 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1578 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1579 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1580 }
1581
1582 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1583 // or close a socket, since there are more requests than ConnectJobs or
1584 // sockets.
1585 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1586 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1587 if (cancel_when_callback_pending) {
1588 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1589 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1590 } else {
1591 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211592 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1593 }
Matt Menke99251ea42019-04-25 22:59:021594
1595 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1596 // or close a socket.
1597 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1598 handles[i]->ResetAndCloseSocket();
1599 if (i > 0) {
1600 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1601 if (cancel_when_callback_pending) {
1602 EXPECT_EQ(i,
1603 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1604 } else {
1605 EXPECT_EQ(static_cast<size_t>(i),
1606 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1607 }
1608 } else {
1609 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1610 }
1611 }
Matt Menke7eb405e2019-04-25 20:48:211612 }
[email protected]f6d1d6eb2009-06-24 20:16:091613}
1614
[email protected]ab838892009-06-30 18:49:051615TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531616 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201617
[email protected]ab838892009-06-30 18:49:051618 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061619 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521620 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091621
Matt Menke28ac03e2019-02-25 22:25:501622 EXPECT_EQ(
1623 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281624 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1625 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1626 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1627 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091628
1629 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211630 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1631 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091632
Matt Menke7eb405e2019-04-25 20:48:211633 // This will create a second ConnectJob, since the other ConnectJob was
1634 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521635 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501636 EXPECT_EQ(
1637 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281638 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1639 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501640 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1641 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091642
Matt Menke7eb405e2019-04-25 20:48:211643 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1644 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1645
robpercival214763f2016-07-01 23:27:011646 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091647 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211648 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1649 // One ConnectJob completed, and its socket is now assigned to |handle|.
1650 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1651 // The other ConnectJob should have either completed, or still be connecting.
1652 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1653 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091654
1655 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211656 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1657 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1658 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1659 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091660}
1661
[email protected]ab838892009-06-30 18:49:051662TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531663 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091664
Matt Menkec6b3edf72019-03-19 17:00:391665 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1666 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1667 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1668 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1669 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1670 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1671 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091672
1673 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201674 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131675 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1676 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091677
[email protected]2431756e2010-09-29 20:26:131678 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091679
[email protected]c9d6a1d2009-07-14 16:15:201680 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1681 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131682 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1683 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091684
[email protected]c9d6a1d2009-07-14 16:15:201685 EXPECT_EQ(1, GetOrderOfRequest(1));
1686 EXPECT_EQ(2, GetOrderOfRequest(2));
1687 EXPECT_EQ(5, GetOrderOfRequest(3));
1688 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131689 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1690 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201691 EXPECT_EQ(4, GetOrderOfRequest(6));
1692 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171693
1694 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131695 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091696}
1697
mmenke33d24423d2015-05-19 19:41:091698// Function to be used as a callback on socket request completion. It first
1699// disconnects the successfully connected socket from the first request, and
1700// then reuses the ClientSocketHandle to request another socket.
1701//
1702// |nested_callback| is called with the result of the second socket request.
1703void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261704 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091705 TestConnectJobFactory* test_connect_job_factory,
1706 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411707 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091708 int first_request_result) {
robpercival214763f2016-07-01 23:27:011709 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091710
1711 test_connect_job_factory->set_job_type(next_job_type);
1712
1713 // Don't allow reuse of the socket. Disconnect it and then release it.
1714 if (handle->socket())
1715 handle->socket()->Disconnect();
1716 handle->Reset();
1717
mmenke33d24423d2015-05-19 19:41:091718 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501719 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031720 TestGroupId("a"),
Matt Menkef09e64c2019-04-23 22:16:281721 ClientSocketPool::SocketParams::CreateForHttpForTesting(), base::nullopt,
1722 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031723 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1724 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091725 if (rv != ERR_IO_PENDING) {
1726 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411727 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091728 } else {
1729 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521730 }
mmenke33d24423d2015-05-19 19:41:091731}
[email protected]f6d1d6eb2009-06-24 20:16:091732
mmenke33d24423d2015-05-19 19:41:091733// Tests the case where a second socket is requested in a completion callback,
1734// and the second socket connects asynchronously. Reuses the same
1735// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581736TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531737 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201738
[email protected]0b7648c2009-07-06 20:14:011739 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061740 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091741 TestCompletionCallback second_result_callback;
1742 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281743 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541744 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501745 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1746 connect_job_factory_, TestConnectJob::kMockPendingJob,
1747 &second_result_callback),
1748 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011749 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091750
robpercival214763f2016-07-01 23:27:011751 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581752}
[email protected]f6d1d6eb2009-06-24 20:16:091753
mmenke33d24423d2015-05-19 19:41:091754// Tests the case where a second socket is requested in a completion callback,
1755// and the second socket connects synchronously. Reuses the same
1756// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581757TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531758 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201759
[email protected]0b7648c2009-07-06 20:14:011760 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061761 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091762 TestCompletionCallback second_result_callback;
1763 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281764 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541765 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501766 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1767 connect_job_factory_, TestConnectJob::kMockPendingJob,
1768 &second_result_callback),
1769 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011770 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581771
robpercival214763f2016-07-01 23:27:011772 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091773}
1774
1775// Make sure that pending requests get serviced after active requests get
1776// cancelled.
[email protected]ab838892009-06-30 18:49:051777TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531778 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201779
[email protected]0b7648c2009-07-06 20:14:011780 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091781
Matt Menkec6b3edf72019-03-19 17:00:391782 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1783 IsError(ERR_IO_PENDING));
1784 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1785 IsError(ERR_IO_PENDING));
1786 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1787 IsError(ERR_IO_PENDING));
1788 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1789 IsError(ERR_IO_PENDING));
1790 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1791 IsError(ERR_IO_PENDING));
1792 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1793 IsError(ERR_IO_PENDING));
1794 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1795 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091796
[email protected]c9d6a1d2009-07-14 16:15:201797 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1798 // Let's cancel them.
1799 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131800 ASSERT_FALSE(request(i)->handle()->is_initialized());
1801 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091802 }
1803
[email protected]f6d1d6eb2009-06-24 20:16:091804 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131805 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011806 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131807 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091808 }
1809
[email protected]2431756e2010-09-29 20:26:131810 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1811 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091812}
1813
1814// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051815TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531816 const size_t kMaxSockets = 5;
1817 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201818
[email protected]0b7648c2009-07-06 20:14:011819 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091820
[email protected]211d21722009-07-22 15:48:531821 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1822 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091823
1824 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531825 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391826 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1827 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091828
[email protected]211d21722009-07-22 15:48:531829 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011830 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091831}
1832
mmenke9d72fe42017-05-18 22:36:071833// Make sure that pending requests that complete synchronously get serviced
1834// after active requests fail. See https://crbug.com/723748
1835TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1836 const size_t kNumberOfRequests = 10;
1837 const size_t kMaxSockets = 1;
1838 CreatePool(kMaxSockets, kMaxSockets);
1839
1840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1841
Matt Menkec6b3edf72019-03-19 17:00:391842 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1843 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071844
1845 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1846
1847 // Queue up all the other requests
1848 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391849 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1850 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071851
1852 // Make sure all requests fail, instead of hanging.
1853 for (size_t i = 0; i < kNumberOfRequests; ++i)
1854 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1855}
1856
[email protected]5fc08e32009-07-15 17:09:571857TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531858 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571859
1860 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1861
[email protected]2431756e2010-09-29 20:26:131862 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521863 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501864 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281865 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501866 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1867 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011868 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571869
1870 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131871 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571872
Matt Menkef09e64c2019-04-23 22:16:281873 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1874 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501875 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1876 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011877 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1878 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571879
[email protected]2431756e2010-09-29 20:26:131880 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481881 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571882 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1883}
1884
xunjieli26619e72016-11-23 19:39:551885TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551886 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1887 ClientSocketHandle handle;
1888 TestCompletionCallback callback;
1889 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501890 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281891 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501892 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1893 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551894 EXPECT_THAT(rv, IsOk());
1895 handle.Reset();
1896 EXPECT_EQ(1, pool_->IdleSocketCount());
1897 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551898}
1899
xunjieli92feb332017-03-03 17:19:231900TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231901 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1902 TestCompletionCallback callback;
1903 BoundTestNetLog log;
1904 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501905 int rv = handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:281906 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501907 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1908 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231909 EXPECT_THAT(rv, IsOk());
1910 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281911 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1912 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501913 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1914 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231915 ClientSocketHandle handle3;
Matt Menkef09e64c2019-04-23 22:16:281916 rv = handle3.Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
1917 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501918 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1919 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231920 EXPECT_THAT(rv, IsOk());
1921 handle1.Reset();
1922 handle2.Reset();
1923 handle3.Reset();
1924 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391925 pool_->CloseIdleSocketsInGroup(TestGroupId("a"));
xunjieli92feb332017-03-03 17:19:231926 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231927}
1928
xunjieli26619e72016-11-23 19:39:551929TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551930 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1931 ClientSocketHandle handle;
1932 TestCompletionCallback callback;
1933 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501934 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281935 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501936 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1937 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551938 EXPECT_THAT(rv, IsOk());
1939 StreamSocket* socket = handle.socket();
1940 handle.Reset();
1941 EXPECT_EQ(1, pool_->IdleSocketCount());
1942
1943 // Disconnect socket now to make the socket unusable.
1944 socket->Disconnect();
1945 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281946 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1947 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501948 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1949 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551950 EXPECT_THAT(rv, IsOk());
1951 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551952}
1953
[email protected]2b7523d2009-07-29 20:29:231954// Regression test for http://crbug.com/17985.
1955TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1956 const int kMaxSockets = 3;
1957 const int kMaxSocketsPerGroup = 2;
1958 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1959
[email protected]ac790b42009-12-02 04:31:311960 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231961
Matt Menkec6b3edf72019-03-19 17:00:391962 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1963 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231964
1965 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:391966 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1967 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231968
1969 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:391970 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231971
1972 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:391973 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1974 IsError(ERR_IO_PENDING));
1975 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1976 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231977
Matt Menkec6b3edf72019-03-19 17:00:391978 // Release the first two sockets from TestGroupId("a"). Because this is a
1979 // keepalive, the first release will unblock the pending request for
1980 // TestGroupId("a"). The second release will unblock a request for "c",
1981 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:131982 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1983 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231984
1985 // Closing idle sockets should not get us into trouble, but in the bug
1986 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:391987 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]43a21b82010-06-10 21:30:541988 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261989
[email protected]2da659e2013-05-23 20:51:341990 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281991 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231992}
1993
[email protected]4d3b05d2010-01-27 21:27:291994TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531995 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571996
1997 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131998 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521999 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:512000 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502001 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282002 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502003 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2004 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012005 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392006 EXPECT_EQ(LOAD_STATE_CONNECTING,
2007 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482008 TestLoadTimingInfoNotConnected(handle);
2009
robpercival214763f2016-07-01 23:27:012010 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132011 EXPECT_TRUE(handle.is_initialized());
2012 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482013 TestLoadTimingInfoConnectedNotReused(handle);
2014
[email protected]2431756e2010-09-29 20:26:132015 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482016 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302017
mmenke43758e62015-05-04 21:09:462018 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:402019 log.GetEntries(&entries);
2020
Matt Menke9fa17d52019-03-25 19:12:262021 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172022 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262023 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002024 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262025 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2026 EXPECT_TRUE(LogContainsEvent(
2027 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2028 NetLogEventPhase::NONE));
2029 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002030 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2031 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262032 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572033}
2034
[email protected]4d3b05d2010-01-27 21:27:292035TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572036 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532037 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572038
2039 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132040 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522041 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:512042 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182043 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132044 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512045 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502046 EXPECT_EQ(
2047 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282048 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2049 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2050 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2051 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392052 EXPECT_EQ(LOAD_STATE_CONNECTING,
2053 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012054 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132055 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512056 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302057
mmenke43758e62015-05-04 21:09:462058 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:402059 log.GetEntries(&entries);
2060
Matt Menke9fa17d52019-03-25 19:12:262061 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172062 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262063 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002064 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262065 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2066 EXPECT_TRUE(LogContainsEvent(
2067 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2068 NetLogEventPhase::NONE));
2069 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572070}
2071
mmenke6be122f2015-03-09 22:22:472072// Check that an async ConnectJob failure does not result in creation of a new
2073// ConnectJob when there's another pending request also waiting on its own
2074// ConnectJob. See http://crbug.com/463960.
2075TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2076 CreatePool(2, 2);
2077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2078
Matt Menkec6b3edf72019-03-19 17:00:392079 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2080 IsError(ERR_IO_PENDING));
2081 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2082 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472083
robpercival214763f2016-07-01 23:27:012084 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2085 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472086
2087 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2088}
2089
[email protected]4d3b05d2010-01-27 21:27:292090TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102091 // TODO(eroman): Add back the log expectations! Removed them because the
2092 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532093 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572094
2095 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132096 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522097 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132098 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522099 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572100
Matt Menke28ac03e2019-02-25 22:25:502101 EXPECT_EQ(
2102 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282103 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2104 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2105 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2106 pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:512107 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202108 EXPECT_EQ(
2109 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282110 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2111 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502112 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2113 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572114
[email protected]2431756e2010-09-29 20:26:132115 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572116
[email protected]fd7b7c92009-08-20 19:38:302117
2118 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302119
robpercival214763f2016-07-01 23:27:012120 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132121 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302122
2123 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532124 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572125}
2126
[email protected]4d3b05d2010-01-27 21:27:292127TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342128 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2129
[email protected]17a0c6c2009-08-04 00:07:042130 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2131
Matt Menkec6b3edf72019-03-19 17:00:392132 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2133 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2134 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2135 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342136
Raul Tambre8335a6d2019-02-21 16:57:432137 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262138 static_cast<int>(
2139 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132140 (*requests())[2]->handle()->Reset();
2141 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432142 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262143 static_cast<int>(
2144 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342145
[email protected]2431756e2010-09-29 20:26:132146 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432147 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262148 static_cast<int>(
2149 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342150
[email protected]2431756e2010-09-29 20:26:132151 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432152 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262153 static_cast<int>(
2154 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342155}
2156
[email protected]5fc08e32009-07-15 17:09:572157// When requests and ConnectJobs are not coupled, the request will get serviced
2158// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292159TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532160 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572161
2162 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322163 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572164
[email protected]2431756e2010-09-29 20:26:132165 std::vector<TestSocketRequest*> request_order;
2166 size_t completion_count; // unused
2167 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502168 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282169 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502170 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2171 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012172 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2173 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572174
2175 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2176 // without a job.
2177 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2178
[email protected]2431756e2010-09-29 20:26:132179 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502180 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282181 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502182 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2183 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012184 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132185 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502186 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282187 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502188 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2189 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012190 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572191
2192 // Both Requests 2 and 3 are pending. We release socket 1 which should
2193 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332194 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342195 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282196 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332197 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012198 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332199 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572200
2201 // Signal job 2, which should service request 3.
2202
2203 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012204 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572205
Raul Tambre8335a6d2019-02-21 16:57:432206 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132207 EXPECT_EQ(&req1, request_order[0]);
2208 EXPECT_EQ(&req2, request_order[1]);
2209 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392210 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572211}
2212
2213// The requests are not coupled to the jobs. So, the requests should finish in
2214// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292215TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532216 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572217 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322218 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572219
[email protected]2431756e2010-09-29 20:26:132220 std::vector<TestSocketRequest*> request_order;
2221 size_t completion_count; // unused
2222 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502223 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282224 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502225 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2226 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012227 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572228
[email protected]2431756e2010-09-29 20:26:132229 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502230 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282231 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502232 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2233 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012234 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572235
2236 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322237 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572238
[email protected]2431756e2010-09-29 20:26:132239 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502240 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282241 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502242 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2243 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012244 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572245
robpercival214763f2016-07-01 23:27:012246 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2247 EXPECT_THAT(req2.WaitForResult(), IsOk());
2248 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572249
Raul Tambre8335a6d2019-02-21 16:57:432250 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132251 EXPECT_EQ(&req1, request_order[0]);
2252 EXPECT_EQ(&req2, request_order[1]);
2253 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572254}
2255
[email protected]03b7c8c2013-07-20 04:38:552256// Test GetLoadState in the case there's only one socket request.
2257TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532258 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552259 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572260
[email protected]2431756e2010-09-29 20:26:132261 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522262 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502263 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282264 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502265 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2266 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012267 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552268 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572269
[email protected]03b7c8c2013-07-20 04:38:552270 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2271 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2272
2273 // No point in completing the connection, since ClientSocketHandles only
2274 // expect the LoadState to be checked while connecting.
2275}
2276
2277// Test GetLoadState in the case there are two socket requests.
2278TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2279 CreatePool(2, 2);
2280 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2281
2282 ClientSocketHandle handle;
2283 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502284 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282285 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502286 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2287 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012288 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002289 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2290
2291 ClientSocketHandle handle2;
2292 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282293 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2294 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502295 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2296 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012297 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002298 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2299
Matt Menke4b69f932019-03-04 16:20:012300 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002301 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2302 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2303
Matt Menke4b69f932019-03-04 16:20:012304 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002305 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2306
Matt Menke4b69f932019-03-04 16:20:012307 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002308 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002309 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012310
2311 // Update the state of the second job.
2312 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2313
2314 // Only the state of the second request should have changed.
2315 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2316 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2317
2318 // Second job connects and the first request gets the socket. The
2319 // second handle switches to the state of the remaining ConnectJob.
2320 client_socket_factory_.SignalJob(1);
2321 EXPECT_THAT(callback.WaitForResult(), IsOk());
2322 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552323}
2324
2325// Test GetLoadState in the case the per-group limit is reached.
2326TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2327 CreatePool(2, 1);
2328 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2329
2330 ClientSocketHandle handle;
2331 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502332 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282333 TestGroupId("a"), params_, base::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502334 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2335 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012336 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552337 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2338
2339 // Request another socket from the same pool, buth with a higher priority.
2340 // The first request should now be stalled at the socket group limit.
2341 ClientSocketHandle handle2;
2342 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282343 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
2344 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502345 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2346 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012347 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552348 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2349 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2350
2351 // The first handle should remain stalled as the other socket goes through
2352 // the connect process.
2353
2354 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2355 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2356 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2357
2358 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012359 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552360 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2361
2362 // Closing the second socket should cause the stalled handle to finally get a
2363 // ConnectJob.
2364 handle2.socket()->Disconnect();
2365 handle2.Reset();
2366 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2367}
2368
2369// Test GetLoadState in the case the per-pool limit is reached.
2370TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2371 CreatePool(2, 2);
2372 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2373
2374 ClientSocketHandle handle;
2375 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502376 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282377 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502378 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2379 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012380 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552381
2382 // Request for socket from another pool.
2383 ClientSocketHandle handle2;
2384 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282385 rv = handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
2386 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502387 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2388 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012389 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552390
2391 // Request another socket from the first pool. Request should stall at the
2392 // socket pool limit.
2393 ClientSocketHandle handle3;
2394 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282395 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2396 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502397 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2398 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012399 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552400
2401 // The third handle should remain stalled as the other sockets in its group
2402 // goes through the connect process.
2403
2404 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2405 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2406
2407 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2408 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2409 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2410
2411 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012412 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552413 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2414
2415 // Closing a socket should allow the stalled handle to finally get a new
2416 // ConnectJob.
2417 handle.socket()->Disconnect();
2418 handle.Reset();
2419 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572420}
2421
Matt Menkeb57663b32019-03-01 17:17:102422TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132423 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102424 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132425
[email protected]2431756e2010-09-29 20:26:132426 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522427 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502428 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102429 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkef09e64c2019-04-23 22:16:282430 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2431 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2432 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2433 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132434 EXPECT_TRUE(handle.is_initialized());
2435 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132436}
2437
Matt Menkeb57663b32019-03-01 17:17:102438TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132439 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2440
Matt Menkeb57663b32019-03-01 17:17:102441 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132442 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522443 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502444 EXPECT_EQ(
2445 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282446 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2447 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2448 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2449 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392450 EXPECT_EQ(LOAD_STATE_CONNECTING,
2451 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102452 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132453 EXPECT_TRUE(handle.is_initialized());
2454 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132455}
2456
[email protected]e60e47a2010-07-14 03:37:182457TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2458 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2459 connect_job_factory_->set_job_type(
2460 TestConnectJob::kMockAdditionalErrorStateJob);
2461
[email protected]2431756e2010-09-29 20:26:132462 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522463 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502464 EXPECT_EQ(
2465 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:282466 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2467 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2468 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2469 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132470 EXPECT_FALSE(handle.is_initialized());
2471 EXPECT_FALSE(handle.socket());
2472 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512473 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182474}
2475
2476TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2477 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2478
2479 connect_job_factory_->set_job_type(
2480 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132481 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522482 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502483 EXPECT_EQ(
2484 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282485 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2486 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2487 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2488 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392489 EXPECT_EQ(LOAD_STATE_CONNECTING,
2490 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012491 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132492 EXPECT_FALSE(handle.is_initialized());
2493 EXPECT_FALSE(handle.socket());
2494 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512495 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182496}
2497
martijn003cd612016-05-19 22:24:382498// Make sure we can reuse sockets.
2499TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412500 CreatePoolWithIdleTimeouts(
2501 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032502 base::TimeDelta(), // Time out unused sockets immediately.
2503 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2504
2505 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2506
2507 ClientSocketHandle handle;
2508 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502509 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282510 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502511 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2512 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012513 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392514 EXPECT_EQ(LOAD_STATE_CONNECTING,
2515 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012516 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032517
2518 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352519 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382520 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482521 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032522 handle.Reset();
2523
2524 // Should now have one idle socket.
2525 ASSERT_EQ(1, pool_->IdleSocketCount());
2526
2527 // Request a new socket. This should reuse the old socket and complete
2528 // synchronously.
vishal.b62985ca92015-04-17 08:45:512529 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502530 rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282531 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502532 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2533 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012534 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032535 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482536 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032537
Matt Menke9fa17d52019-03-25 19:12:262538 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392539 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262540 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032541
mmenke43758e62015-05-04 21:09:462542 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032543 log.GetEntries(&entries);
Matt Menke9fa17d52019-03-25 19:12:262544 EXPECT_TRUE(LogContainsEvent(
2545 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2546 NetLogEventPhase::NONE));
2547 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032548 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262549 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032550}
2551
martijn003cd612016-05-19 22:24:382552// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172553TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032554 CreatePoolWithIdleTimeouts(
2555 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2556 base::TimeDelta(), // Time out unused sockets immediately
2557 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412558
2559 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2560
2561 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2562
2563 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522564 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502565 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282566 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502567 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2568 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012569 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392570 EXPECT_EQ(LOAD_STATE_CONNECTING,
2571 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412572
2573 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522574 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282575 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2576 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502577 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2578 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012579 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392580 EXPECT_EQ(LOAD_STATE_CONNECTING,
2581 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412582
2583 // Cancel one of the requests. Wait for the other, which will get the first
2584 // job. Release the socket. Run the loop again to make sure the second
2585 // socket is sitting idle and the first one is released (since ReleaseSocket()
2586 // just posts a DoReleaseSocket() task).
2587
2588 handle.Reset();
robpercival214763f2016-07-01 23:27:012589 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412590 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352591 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382592 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412593 handle2.Reset();
2594
[email protected]e7b1c6d2c2012-05-05 00:54:032595 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2596 // actually become pending until 2ms after they have been created. In order
2597 // to flush all tasks, we need to wait so that we know there are no
2598 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452599 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412600
[email protected]e7b1c6d2c2012-05-05 00:54:032601 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412602 ASSERT_EQ(2, pool_->IdleSocketCount());
2603
2604 // Request a new socket. This should cleanup the unused and timed out ones.
2605 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512606 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522607 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282608 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2609 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502610 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2611 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012612 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2613 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412614 EXPECT_FALSE(handle.is_reused());
2615
[email protected]e7b1c6d2c2012-05-05 00:54:032616 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262617 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392618 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262619 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412620
mmenke43758e62015-05-04 21:09:462621 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412622 log.GetEntries(&entries);
2623 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002624 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412625}
2626
[email protected]2041cf342010-02-19 03:15:592627// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162628// because of multiple releasing disconnected sockets.
2629TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2630 CreatePoolWithIdleTimeouts(
2631 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2632 base::TimeDelta(), // Time out unused sockets immediately.
2633 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2634
2635 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2636
2637 // Startup 4 connect jobs. Two of them will be pending.
2638
[email protected]2431756e2010-09-29 20:26:132639 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522640 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502641 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282642 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502643 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2644 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012645 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162646
[email protected]2431756e2010-09-29 20:26:132647 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522648 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282649 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2650 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502651 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2652 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012653 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162654
[email protected]2431756e2010-09-29 20:26:132655 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522656 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282657 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2658 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502659 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2660 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012661 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162662
[email protected]2431756e2010-09-29 20:26:132663 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522664 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:282665 rv = handle4.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2666 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502667 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2668 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012669 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162670
2671 // Release two disconnected sockets.
2672
[email protected]2431756e2010-09-29 20:26:132673 handle.socket()->Disconnect();
2674 handle.Reset();
2675 handle2.socket()->Disconnect();
2676 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162677
robpercival214763f2016-07-01 23:27:012678 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132679 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012680 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132681 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162682}
2683
[email protected]d7027bb2010-05-10 18:58:542684// Regression test for http://crbug.com/42267.
2685// When DoReleaseSocket() is processed for one socket, it is blocked because the
2686// other stalled groups all have releasing sockets, so no progress can be made.
2687TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2688 CreatePoolWithIdleTimeouts(
2689 4 /* socket limit */, 4 /* socket limit per group */,
2690 base::TimeDelta(), // Time out unused sockets immediately.
2691 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2692
2693 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2694
2695 // Max out the socket limit with 2 per group.
2696
[email protected]2431756e2010-09-29 20:26:132697 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522698 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132699 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522700 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542701
2702 for (int i = 0; i < 2; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282703 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, base::nullopt,
2704 LOWEST, SocketTag(),
2705 ClientSocketPool::RespectLimits::ENABLED,
2706 callback_a[i].callback(),
2707 ClientSocketPool::ProxyAuthCallback(),
2708 pool_.get(), NetLogWithSource()));
2709 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, base::nullopt,
2710 LOWEST, SocketTag(),
2711 ClientSocketPool::RespectLimits::ENABLED,
2712 callback_b[i].callback(),
2713 ClientSocketPool::ProxyAuthCallback(),
2714 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542715 }
[email protected]b89f7e42010-05-20 20:37:002716
[email protected]d7027bb2010-05-10 18:58:542717 // Make 4 pending requests, 2 per group.
2718
2719 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282720 EXPECT_EQ(
2721 ERR_IO_PENDING,
2722 handle_a[i].Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2723 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2724 callback_a[i].callback(),
2725 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2726 NetLogWithSource()));
2727 EXPECT_EQ(
2728 ERR_IO_PENDING,
2729 handle_b[i].Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
2730 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2731 callback_b[i].callback(),
2732 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2733 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542734 }
2735
2736 // Release b's socket first. The order is important, because in
2737 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2738 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2739 // first, which has a releasing socket, so it refuses to start up another
2740 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132741 handle_b[0].socket()->Disconnect();
2742 handle_b[0].Reset();
2743 handle_a[0].socket()->Disconnect();
2744 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542745
2746 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282747 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542748
[email protected]2431756e2010-09-29 20:26:132749 handle_b[1].socket()->Disconnect();
2750 handle_b[1].Reset();
2751 handle_a[1].socket()->Disconnect();
2752 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542753
2754 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012755 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2756 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542757 }
2758}
2759
[email protected]fd4fe0b2010-02-08 23:02:152760TEST_F(ClientSocketPoolBaseTest,
2761 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2762 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2763
2764 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2765
Matt Menkec6b3edf72019-03-19 17:00:392766 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2767 IsError(ERR_IO_PENDING));
2768 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2769 IsError(ERR_IO_PENDING));
2770 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2771 IsError(ERR_IO_PENDING));
2772 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2773 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152774
robpercival214763f2016-07-01 23:27:012775 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2776 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132777 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152778
2779 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132780 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012781 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152782
[email protected]2431756e2010-09-29 20:26:132783 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012784 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132785 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152786
2787 EXPECT_EQ(1, GetOrderOfRequest(1));
2788 EXPECT_EQ(2, GetOrderOfRequest(2));
2789 EXPECT_EQ(3, GetOrderOfRequest(3));
2790 EXPECT_EQ(4, GetOrderOfRequest(4));
2791
2792 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132793 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152794}
2795
[email protected]6ecf2b92011-12-15 01:14:522796class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042797 public:
Matt Menke9fa17d52019-03-25 19:12:262798 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132799 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182800 bool reset_releasing_handle)
2801 : pool_(pool),
2802 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042803 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522804
Chris Watkins7a41d3552017-12-01 02:13:272805 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042806
2807 ClientSocketHandle* handle() { return &handle_; }
2808
Bence Béky8ddc2492018-06-13 01:02:042809 CompletionOnceCallback callback() {
2810 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2811 base::Unretained(this));
2812 }
[email protected]4f1e4982010-03-02 18:31:042813
2814 private:
[email protected]6ecf2b92011-12-15 01:14:522815 void OnComplete(int result) {
2816 SetResult(result);
2817 if (reset_releasing_handle_)
2818 handle_.Reset();
2819
Matt Menkec6b3edf72019-03-19 17:00:392820 EXPECT_EQ(
2821 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032822 handle2_.Init(
2823 TestGroupId("a"),
2824 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:282825 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032826 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2827 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522828 }
2829
Matt Menke9fa17d52019-03-25 19:12:262830 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182831 int expected_result_;
2832 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042833 ClientSocketHandle handle_;
2834 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042835};
2836
[email protected]e60e47a2010-07-14 03:37:182837
2838TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2839 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2840
Matt Menkec6b3edf72019-03-19 17:00:392841 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2842 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2843 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182844
[email protected]2431756e2010-09-29 20:26:132845 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182846 client_socket_factory_.allocation_count());
2847
2848 connect_job_factory_->set_job_type(
2849 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2850 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282851 EXPECT_EQ(ERR_IO_PENDING,
2852 req.handle()->Init(
2853 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2854 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2855 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2856 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182857 // The next job should complete synchronously
2858 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2859
robpercival214763f2016-07-01 23:27:012860 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182861 EXPECT_FALSE(req.handle()->is_initialized());
2862 EXPECT_FALSE(req.handle()->socket());
2863 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512864 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182865}
2866
[email protected]b6501d3d2010-06-03 23:53:342867// http://crbug.com/44724 regression test.
2868// We start releasing the pool when we flush on network change. When that
2869// happens, the only active references are in the ClientSocketHandles. When a
2870// ConnectJob completes and calls back into the last ClientSocketHandle, that
2871// callback can release the last reference and delete the pool. After the
2872// callback finishes, we go back to the stack frame within the now-deleted pool.
2873// Executing any code that refers to members of the now-deleted pool can cause
2874// crashes.
2875TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2876 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2877 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2878
2879 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522880 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502881 EXPECT_EQ(
2882 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282883 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2884 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2885 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2886 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342887
[email protected]7af985a2012-12-14 22:40:422888 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342889
2890 // We'll call back into this now.
2891 callback.WaitForResult();
2892}
2893
[email protected]a7e38572010-06-07 18:22:242894TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2895 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2896 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2897
2898 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522899 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502900 EXPECT_EQ(
2901 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282902 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2903 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2904 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2905 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012906 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242907 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2908
[email protected]7af985a2012-12-14 22:40:422909 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242910
2911 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282912 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242913
Matt Menke28ac03e2019-02-25 22:25:502914 EXPECT_EQ(
2915 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282916 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2917 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2918 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2919 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012920 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242921 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2922}
2923
[email protected]6ecf2b92011-12-15 01:14:522924class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142925 public:
Matt Menke9fa17d52019-03-25 19:12:262926 ConnectWithinCallback(
2927 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:192928 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:262929 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:392930 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142931
Chris Watkins7a41d3552017-12-01 02:13:272932 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142933
2934 int WaitForNestedResult() {
2935 return nested_callback_.WaitForResult();
2936 }
2937
Bence Béky8ddc2492018-06-13 01:02:042938 CompletionOnceCallback callback() {
2939 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2940 base::Unretained(this));
2941 }
[email protected]6ecf2b92011-12-15 01:14:522942
[email protected]06f92462010-08-31 19:24:142943 private:
[email protected]6ecf2b92011-12-15 01:14:522944 void OnComplete(int result) {
2945 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:282946 EXPECT_EQ(
2947 ERR_IO_PENDING,
2948 handle_.Init(group_id_, params_, base::nullopt, DEFAULT_PRIORITY,
2949 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2950 nested_callback_.callback(),
2951 ClientSocketPool::ProxyAuthCallback(), pool_,
2952 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522953 }
2954
Matt Menkec6b3edf72019-03-19 17:00:392955 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:192956 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:262957 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142958 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522959 TestCompletionCallback nested_callback_;
2960
2961 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142962};
2963
2964TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2966
2967 // First job will be waiting until it gets aborted.
2968 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2969
2970 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:392971 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502972 EXPECT_EQ(
2973 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282974 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2975 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2976 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2977 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142978
2979 // Second job will be started during the first callback, and will
2980 // asynchronously complete with OK.
2981 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422982 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012983 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2984 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142985}
2986
Matt Menke141b87f22019-01-30 02:43:032987TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:262988 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2989 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032990
2991 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2992 ClientSocketHandle handle;
2993 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502994 EXPECT_EQ(
2995 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282996 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
2997 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2998 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2999 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033000 // The backup timer fires but doesn't start a new ConnectJob while resolving
3001 // the hostname.
3002 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3003 FastForwardBy(base::TimeDelta::FromMilliseconds(
3004 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3005 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3006
3007 // Once the ConnectJob has finished resolving the hostname, the backup timer
3008 // will create a ConnectJob when it fires.
3009 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3010 FastForwardBy(base::TimeDelta::FromMilliseconds(
3011 ClientSocketPool::kMaxConnectRetryIntervalMs));
3012 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3013}
3014
3015// Test that no backup socket is created when a ConnectJob connects before it
3016// completes.
3017TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263018 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3019 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033020
3021 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3022 ClientSocketHandle handle;
3023 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503024 EXPECT_EQ(
3025 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283026 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3027 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3028 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3029 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033030 // The backup timer fires but doesn't start a new ConnectJob while resolving
3031 // the hostname.
3032 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3033 FastForwardBy(base::TimeDelta::FromMilliseconds(
3034 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3035 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3036
3037 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3038 client_socket_factory_.SetJobHasEstablishedConnection(0);
3039 FastForwardBy(base::TimeDelta::FromMilliseconds(
3040 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3041 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3042}
3043
[email protected]25eea382010-07-10 23:55:263044// Cancel a pending socket request while we're at max sockets,
3045// and verify that the backup socket firing doesn't cause a crash.
3046TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3047 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263048 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3049 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263050
[email protected]4baaf9d2010-08-31 15:15:443051 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3052 // timer.
[email protected]25eea382010-07-10 23:55:263053 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3054 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523055 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503056 EXPECT_EQ(
3057 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283058 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3059 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3060 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3061 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263062
3063 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3064 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3065 ClientSocketHandle handles[kDefaultMaxSockets];
3066 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:523067 TestCompletionCallback callback;
Matt Menkef09e64c2019-04-23 22:16:283068 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, base::nullopt,
3069 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203070 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503071 callback.callback(),
3072 ClientSocketPool::ProxyAuthCallback(),
3073 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263074 }
3075
fdoray5eeb7642016-06-22 16:11:283076 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263077
3078 // Cancel the pending request.
3079 handle.Reset();
3080
3081 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453082 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003083 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263084
[email protected]25eea382010-07-10 23:55:263085 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3086}
3087
[email protected]3f00be82010-09-27 19:50:023088TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263089 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3090 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443091
3092 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3093 // timer.
3094 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3095 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523096 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503097 EXPECT_EQ(
3098 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283099 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3100 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3101 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3102 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263103 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3104 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3105 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3106 TestGroupId("bar")));
3107 EXPECT_EQ(
3108 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443109
3110 // Cancel the socket request. This should cancel the backup timer. Wait for
3111 // the backup time to see if it indeed got canceled.
3112 handle.Reset();
3113 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453114 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003115 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263116 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3117 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443118}
3119
[email protected]3f00be82010-09-27 19:50:023120TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263121 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3122 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023123
3124 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3125 // timer.
3126 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3127 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523128 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503129 EXPECT_EQ(
3130 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283131 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3132 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3133 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3134 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023135 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3136 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523137 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203138 EXPECT_EQ(
3139 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283140 handle2.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3141 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503142 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3143 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263144 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3145 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023146
3147 // Cancel request 1 and then complete request 2. With the requests finished,
3148 // the backup timer should be cancelled.
3149 handle.Reset();
robpercival214763f2016-07-01 23:27:013150 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023151 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453152 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003153 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023154}
3155
[email protected]eb5a99382010-07-11 03:18:263156// Test delayed socket binding for the case where we have two connects,
3157// and while one is waiting on a connect, the other frees up.
3158// The socket waiting on a connect should switch immediately to the freed
3159// up socket.
3160TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3161 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3162 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3163
3164 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523165 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503166 EXPECT_EQ(
3167 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283168 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3169 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503170 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3171 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013172 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263173
3174 // No idle sockets, no pending jobs.
3175 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263176 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263177
3178 // Create a second socket to the same host, but this one will wait.
3179 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3180 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503181 EXPECT_EQ(
3182 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283183 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3184 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503185 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3186 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263187 // No idle sockets, and one connecting job.
3188 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263189 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263190
3191 // Return the first handle to the pool. This will initiate the delayed
3192 // binding.
3193 handle1.Reset();
3194
fdoray5eeb7642016-06-22 16:11:283195 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263196
3197 // Still no idle sockets, still one pending connect job.
3198 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263199 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263200
3201 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013202 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263203
3204 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263205 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263206
3207 // Finally, signal the waiting Connect.
3208 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263209 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263210
fdoray5eeb7642016-06-22 16:11:283211 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263212}
3213
3214// Test delayed socket binding when a group is at capacity and one
3215// of the group's sockets frees up.
3216TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3217 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3218 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3219
3220 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523221 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503222 EXPECT_EQ(
3223 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283224 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3225 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503226 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3227 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013228 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263229
3230 // No idle sockets, no pending jobs.
3231 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263232 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263233
3234 // Create a second socket to the same host, but this one will wait.
3235 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3236 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503237 EXPECT_EQ(
3238 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283239 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3240 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503241 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3242 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263243 // No idle sockets, and one connecting job.
3244 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263245 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263246
3247 // Return the first handle to the pool. This will initiate the delayed
3248 // binding.
3249 handle1.Reset();
3250
fdoray5eeb7642016-06-22 16:11:283251 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263252
3253 // Still no idle sockets, still one pending connect job.
3254 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263255 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263256
3257 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013258 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263259
3260 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263261 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263262
3263 // Finally, signal the waiting Connect.
3264 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263265 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263266
fdoray5eeb7642016-06-22 16:11:283267 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263268}
3269
3270// Test out the case where we have one socket connected, one
3271// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513272// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263273// should complete, by taking the first socket's idle socket.
3274TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3275 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3276 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3277
3278 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523279 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503280 EXPECT_EQ(
3281 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283282 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3283 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503284 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3285 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013286 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263287
3288 // No idle sockets, no pending jobs.
3289 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263290 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263291
3292 // Create a second socket to the same host, but this one will wait.
3293 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3294 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503295 EXPECT_EQ(
3296 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283297 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3298 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503299 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3300 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263301 // No idle sockets, and one connecting job.
3302 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263303 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263304
3305 // Return the first handle to the pool. This will initiate the delayed
3306 // binding.
3307 handle1.Reset();
3308
fdoray5eeb7642016-06-22 16:11:283309 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263310
3311 // Still no idle sockets, still one pending connect job.
3312 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263313 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263314
3315 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013316 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263317
3318 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263319 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263320
3321 // Finally, signal the waiting Connect.
3322 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263323 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263324
fdoray5eeb7642016-06-22 16:11:283325 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263326}
3327
[email protected]2abfe90a2010-08-25 17:49:513328// Cover the case where on an available socket slot, we have one pending
3329// request that completes synchronously, thereby making the Group empty.
3330TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3331 const int kUnlimitedSockets = 100;
3332 const int kOneSocketPerGroup = 1;
3333 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3334
3335 // Make the first request asynchronous fail.
3336 // This will free up a socket slot later.
3337 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3338
3339 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523340 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203341 EXPECT_EQ(
3342 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283343 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3344 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503345 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3346 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263347 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513348
3349 // Make the second request synchronously fail. This should make the Group
3350 // empty.
3351 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3352 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523353 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513354 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3355 // when created.
tfarina428341112016-09-22 13:38:203356 EXPECT_EQ(
3357 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283358 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3359 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503360 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3361 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513362
Matt Menke9fa17d52019-03-25 19:12:263363 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513364
robpercival214763f2016-07-01 23:27:013365 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3366 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263367 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513368}
3369
[email protected]e1b54dc2010-10-06 21:27:223370TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3371 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3372
3373 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3374
3375 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523376 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203377 EXPECT_EQ(
3378 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283379 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3380 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503381 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3382 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223383
3384 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523385 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203386 EXPECT_EQ(
3387 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283388 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3389 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503390 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3391 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223392 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523393 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203394 EXPECT_EQ(
3395 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283396 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3397 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503398 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3399 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223400
robpercival214763f2016-07-01 23:27:013401 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3402 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3403 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223404
3405 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353406 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383407 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353408 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383409 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223410
3411 handle1.Reset();
3412 handle2.Reset();
3413 handle3.Reset();
3414
Matt Menkec6b3edf72019-03-19 17:00:393415 EXPECT_EQ(OK, handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:283416 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3417 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393418 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3419 pool_.get(), NetLogWithSource()));
3420 EXPECT_EQ(OK, handle2.Init(
Matt Menkef09e64c2019-04-23 22:16:283421 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3422 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393423 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3424 pool_.get(), NetLogWithSource()));
3425 EXPECT_EQ(OK, handle3.Init(
Matt Menkef09e64c2019-04-23 22:16:283426 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3427 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393428 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3429 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223430
3431 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3432 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3433 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3434}
3435
[email protected]2c2bef152010-10-13 00:55:033436TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3437 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3438 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3439
Matt Menkef09e64c2019-04-23 22:16:283440 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3441 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033442
Matt Menke9fa17d52019-03-25 19:12:263443 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3444 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3445 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3446 TestGroupId("a")));
3447 EXPECT_EQ(2u,
3448 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393449 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033450
3451 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523452 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203453 EXPECT_EQ(
3454 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283455 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3456 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503457 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3458 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033459
3460 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523461 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203462 EXPECT_EQ(
3463 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283464 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3465 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503466 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3467 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033468
Matt Menke9fa17d52019-03-25 19:12:263469 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3470 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3471 TestGroupId("a")));
3472 EXPECT_EQ(0u,
3473 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393474 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033475
robpercival214763f2016-07-01 23:27:013476 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3477 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033478 handle1.Reset();
3479 handle2.Reset();
3480
Matt Menke9fa17d52019-03-25 19:12:263481 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3482 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3483 TestGroupId("a")));
3484 EXPECT_EQ(0u,
3485 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393486 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033487}
3488
3489TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3490 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3491 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3492
3493 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523494 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203495 EXPECT_EQ(
3496 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283497 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3498 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503499 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3500 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033501
Matt Menke9fa17d52019-03-25 19:12:263502 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3503 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3504 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3505 TestGroupId("a")));
3506 EXPECT_EQ(0u,
3507 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393508 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033509
Matt Menkef09e64c2019-04-23 22:16:283510 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3511 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033512
Matt Menke9fa17d52019-03-25 19:12:263513 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3514 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3515 TestGroupId("a")));
3516 EXPECT_EQ(1u,
3517 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393518 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033519
3520 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523521 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203522 EXPECT_EQ(
3523 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283524 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3525 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503526 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3527 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033528
Matt Menke9fa17d52019-03-25 19:12:263529 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3530 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3531 TestGroupId("a")));
3532 EXPECT_EQ(0u,
3533 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393534 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033535
robpercival214763f2016-07-01 23:27:013536 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3537 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033538 handle1.Reset();
3539 handle2.Reset();
3540
Matt Menke9fa17d52019-03-25 19:12:263541 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3542 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3543 TestGroupId("a")));
3544 EXPECT_EQ(0u,
3545 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393546 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033547}
3548
3549TEST_F(ClientSocketPoolBaseTest,
3550 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3551 CreatePool(4, 4);
3552 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3553
3554 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523555 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203556 EXPECT_EQ(
3557 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283558 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3559 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503560 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3561 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033562
3563 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523564 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203565 EXPECT_EQ(
3566 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283567 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3568 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503569 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3570 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033571
3572 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523573 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203574 EXPECT_EQ(
3575 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283576 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3577 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503578 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3579 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033580
Matt Menke9fa17d52019-03-25 19:12:263581 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3582 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3583 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3584 TestGroupId("a")));
3585 EXPECT_EQ(0u,
3586 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393587 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033588
Matt Menkef09e64c2019-04-23 22:16:283589 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3590 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033591
Matt Menke9fa17d52019-03-25 19:12:263592 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3593 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3594 TestGroupId("a")));
3595 EXPECT_EQ(0u,
3596 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393597 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033598
robpercival214763f2016-07-01 23:27:013599 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3600 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3601 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033602 handle1.Reset();
3603 handle2.Reset();
3604 handle3.Reset();
3605
Matt Menke9fa17d52019-03-25 19:12:263606 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3607 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3608 TestGroupId("a")));
3609 EXPECT_EQ(0u,
3610 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393611 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033612}
3613
3614TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3615 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3616 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3617
Matt Menke9fa17d52019-03-25 19:12:263618 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033619
Matt Menkef09e64c2019-04-23 22:16:283620 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3621 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033622
Matt Menke9fa17d52019-03-25 19:12:263623 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433624 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393625 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263626 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3627 EXPECT_EQ(
3628 kDefaultMaxSockets,
3629 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3630 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433631 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263632 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3633 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033634
Matt Menke9fa17d52019-03-25 19:12:263635 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033636
Matt Menkef09e64c2019-04-23 22:16:283637 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3638 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033639
Matt Menke9fa17d52019-03-25 19:12:263640 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033641}
3642
3643TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3644 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3645 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3646
Matt Menke9fa17d52019-03-25 19:12:263647 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033648
Matt Menkef09e64c2019-04-23 22:16:283649 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3650 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033651
Matt Menke9fa17d52019-03-25 19:12:263652 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433653 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393654 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263655 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3656 EXPECT_EQ(
3657 kDefaultMaxSockets - 1,
3658 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3659 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433660 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263661 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3662 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483663 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033664
Matt Menke9fa17d52019-03-25 19:12:263665 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033666
Matt Menkef09e64c2019-04-23 22:16:283667 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3668 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033669
Matt Menke9fa17d52019-03-25 19:12:263670 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3671 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483672 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033673}
3674
3675TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3676 CreatePool(4, 4);
3677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3678
3679 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523680 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203681 EXPECT_EQ(
3682 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283683 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3684 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503685 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3686 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013687 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033688 handle1.Reset();
3689
Matt Menke9fa17d52019-03-25 19:12:263690 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3691 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3692 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3693 TestGroupId("a")));
3694 EXPECT_EQ(0u,
3695 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393696 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033697
Matt Menkef09e64c2019-04-23 22:16:283698 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3699 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033700
Matt Menke9fa17d52019-03-25 19:12:263701 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3702 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3703 TestGroupId("a")));
3704 EXPECT_EQ(1u,
3705 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393706 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033707}
3708
3709TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3710 CreatePool(4, 4);
3711 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3712
3713 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523714 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203715 EXPECT_EQ(
3716 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283717 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3718 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503719 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3720 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013721 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033722
Matt Menke9fa17d52019-03-25 19:12:263723 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3724 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3725 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3726 TestGroupId("a")));
3727 EXPECT_EQ(0u,
3728 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393729 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263730 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033731
Matt Menkef09e64c2019-04-23 22:16:283732 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3733 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033734
Matt Menke9fa17d52019-03-25 19:12:263735 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3736 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3737 TestGroupId("a")));
3738 EXPECT_EQ(1u,
3739 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393740 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263741 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033742}
3743
3744TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3745 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3746 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3747
Matt Menkef09e64c2019-04-23 22:16:283748 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3749 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033750
Matt Menke9fa17d52019-03-25 19:12:263751 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3752 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3753 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3754 TestGroupId("a")));
3755 EXPECT_EQ(0u,
3756 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433757 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393758 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033759
Matt Menkef09e64c2019-04-23 22:16:283760 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3761 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033762
Matt Menke9fa17d52019-03-25 19:12:263763 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3764 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3765 TestGroupId("b")));
3766 EXPECT_EQ(0u,
3767 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433768 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393769 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033770}
3771
[email protected]3c819f522010-12-02 02:03:123772TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3773 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3774 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3775
Matt Menkef09e64c2019-04-23 22:16:283776 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3777 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123778
Matt Menke9fa17d52019-03-25 19:12:263779 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523780
3781 connect_job_factory_->set_job_type(
3782 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkef09e64c2019-04-23 22:16:283783 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3784 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523785
Matt Menke9fa17d52019-03-25 19:12:263786 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123787}
3788
[email protected]8159a1c2012-06-07 00:00:103789TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033790 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433791 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033792
Matt Menkef09e64c2019-04-23 22:16:283793 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3794 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033795
Matt Menke9fa17d52019-03-25 19:12:263796 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3797 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3798 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3799 TestGroupId("a")));
3800 EXPECT_EQ(2u,
3801 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3802 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393803 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033804
Matt Menkef09e64c2019-04-23 22:16:283805 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3806 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263807 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3808 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3809 TestGroupId("a")));
3810 EXPECT_EQ(2u,
3811 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3812 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393813 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033814
3815 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523816 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203817 EXPECT_EQ(
3818 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283819 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3820 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503821 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3822 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433823
3824 client_socket_factory_.SignalJob(0);
3825 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3826
Matt Menke9fa17d52019-03-25 19:12:263827 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3828 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3829 TestGroupId("a")));
3830 EXPECT_EQ(1u,
3831 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3832 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393833 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033834
3835 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523836 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433837 EXPECT_EQ(
3838 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283839 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3840 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503841 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3842 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433843 client_socket_factory_.SignalJob(0);
3844 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033845
Matt Menke9fa17d52019-03-25 19:12:263846 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3847 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3848 TestGroupId("a")));
3849 EXPECT_EQ(0u,
3850 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3851 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393852 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103853
[email protected]2c2bef152010-10-13 00:55:033854 handle1.Reset();
3855 handle2.Reset();
3856
Matt Menke9fa17d52019-03-25 19:12:263857 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3858 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3859 TestGroupId("a")));
3860 EXPECT_EQ(0u,
3861 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3862 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393863 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033864
Matt Menkef09e64c2019-04-23 22:16:283865 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3866 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263867 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3868 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3869 TestGroupId("a")));
3870 EXPECT_EQ(0u,
3871 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3872 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393873 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033874}
3875
3876TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3877 CreatePool(4, 4);
3878 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3879
Matt Menkef09e64c2019-04-23 22:16:283880 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3881 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033882
Matt Menke9fa17d52019-03-25 19:12:263883 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3884 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3885 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3886 TestGroupId("a")));
3887 EXPECT_EQ(1u,
3888 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393889 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033890
Matt Menkef09e64c2019-04-23 22:16:283891 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3892 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263893 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3894 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3895 TestGroupId("a")));
3896 EXPECT_EQ(2u,
3897 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393898 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033899
Matt Menkef09e64c2019-04-23 22:16:283900 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 3,
3901 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263902 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3903 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3904 TestGroupId("a")));
3905 EXPECT_EQ(3u,
3906 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393907 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033908
Matt Menkef09e64c2019-04-23 22:16:283909 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3910 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263911 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3912 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3913 TestGroupId("a")));
3914 EXPECT_EQ(3u,
3915 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393916 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033917}
3918
3919TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3920 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433921 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033922
Matt Menkef09e64c2019-04-23 22:16:283923 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3924 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033925
Matt Menke9fa17d52019-03-25 19:12:263926 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3927 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3928 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3929 TestGroupId("a")));
3930 EXPECT_EQ(1u,
3931 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393932 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033933
3934 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523935 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203936 EXPECT_EQ(
3937 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283938 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3939 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503940 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3941 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033942
Matt Menke9fa17d52019-03-25 19:12:263943 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3944 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3945 TestGroupId("a")));
3946 EXPECT_EQ(0u,
3947 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393948 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033949
Lily Chenecebf932018-11-02 17:15:433950 client_socket_factory_.SignalJobs();
3951 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3952
Matt Menke9fa17d52019-03-25 19:12:263953 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3954 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3955 TestGroupId("a")));
3956 EXPECT_EQ(0u,
3957 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393958 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263959 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033960
[email protected]0dc88b32014-03-26 20:12:283961 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483962 // starts, it has a connect start time.
3963 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033964 handle1.Reset();
3965
Matt Menkec6b3edf72019-03-19 17:00:393966 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033967}
3968
[email protected]034df0f32013-01-07 23:17:483969// Checks that fully connected preconnect jobs have no connect times, and are
3970// marked as reused.
3971TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3972 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3973 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkef09e64c2019-04-23 22:16:283974 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3975 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483976
Matt Menke9fa17d52019-03-25 19:12:263977 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3978 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3979 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3980 TestGroupId("a")));
3981 EXPECT_EQ(0u,
3982 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393983 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483984
3985 ClientSocketHandle handle;
3986 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393987 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:283988 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3989 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393990 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3991 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483992
3993 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:393994 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483995
3996 TestLoadTimingInfoConnectedReused(handle);
3997 handle.Reset();
3998 TestLoadTimingInfoNotConnected(handle);
3999}
4000
[email protected]dcbe168a2010-12-02 03:14:464001// http://crbug.com/64940 regression test.
4002TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4003 const int kMaxTotalSockets = 3;
4004 const int kMaxSocketsPerGroup = 2;
4005 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434006 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464007
Matt Menkef6edce752019-03-19 17:21:564008 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464009 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4010
4011 // Set up one idle socket in "a".
4012 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524013 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204014 EXPECT_EQ(
4015 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284016 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4017 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504018 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4019 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264020 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4021 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4022 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4023 TestGroupId("a")));
4024 EXPECT_EQ(0u,
4025 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394026 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464027
Lily Chenecebf932018-11-02 17:15:434028 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014029 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264030 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4031 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4032 TestGroupId("a")));
4033 EXPECT_EQ(0u,
4034 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4035 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434036
[email protected]dcbe168a2010-12-02 03:14:464037 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394038 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464039
4040 // Set up two active sockets in "b".
4041 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524042 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204043 EXPECT_EQ(
4044 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284045 handle1.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4046 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504047 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4048 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204049 EXPECT_EQ(
4050 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284051 handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4052 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504053 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4054 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464055
Matt Menke9fa17d52019-03-25 19:12:264056 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4057 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4058 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4059 TestGroupId("b")));
4060 EXPECT_EQ(0u,
4061 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394062 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434063
4064 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014065 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4066 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394067 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264068 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4069 TestGroupId("b")));
4070 EXPECT_EQ(0u,
4071 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4072 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464073
4074 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4075 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4076 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4077 // sockets for "a", and "b" should still have 2 active sockets.
4078
Matt Menkef09e64c2019-04-23 22:16:284079 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4080 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264081 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4082 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4083 TestGroupId("a")));
4084 EXPECT_EQ(0u,
4085 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394086 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264087 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4088 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4089 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4090 TestGroupId("b")));
4091 EXPECT_EQ(0u,
4092 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394093 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264094 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464095
4096 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4097 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4098 // "a" should result in closing 1 for "b".
4099 handle1.Reset();
4100 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394101 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264102 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464103
Matt Menkef09e64c2019-04-23 22:16:284104 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4105 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264106 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4107 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4108 TestGroupId("a")));
4109 EXPECT_EQ(1u,
4110 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394111 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264112 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4113 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4114 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4115 TestGroupId("b")));
4116 EXPECT_EQ(0u,
4117 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394118 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264119 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464120}
4121
[email protected]b7b8be42011-07-12 12:46:414122TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264123 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4124 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074125
4126 // Make the ConnectJob hang until it times out, shorten the timeout.
4127 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4128 connect_job_factory_->set_timeout_duration(
4129 base::TimeDelta::FromMilliseconds(500));
Matt Menkef09e64c2019-04-23 22:16:284130 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4131 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264132 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4133 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4134 TestGroupId("a")));
4135 EXPECT_EQ(1u,
4136 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394137 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074138
[email protected]b7b8be42011-07-12 12:46:414139 // Verify the backup timer doesn't create a backup job, by making
4140 // the backup job a pending job instead of a waiting job, so it
4141 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:074142 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454143 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:444144 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:344145 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:284146 base::RunLoop().Run();
Matt Menke9fa17d52019-03-25 19:12:264147 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074148}
4149
[email protected]b7b8be42011-07-12 12:46:414150TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264151 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4152 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074153
4154 // Make the ConnectJob hang forever.
4155 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkef09e64c2019-04-23 22:16:284156 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4157 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264158 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4159 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4160 TestGroupId("a")));
4161 EXPECT_EQ(1u,
4162 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394163 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284164 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074165
4166 // Make the backup job be a pending job, so it completes normally.
4167 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4168 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524169 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504170 EXPECT_EQ(
4171 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284172 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4173 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4174 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4175 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414176 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264177 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4178 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4179 TestGroupId("a")));
4180 EXPECT_EQ(0u,
4181 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394182 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264183 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014184 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074185
4186 // The hung connect job should still be there, but everything else should be
4187 // complete.
Matt Menke9fa17d52019-03-25 19:12:264188 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4189 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4190 TestGroupId("a")));
4191 EXPECT_EQ(1u,
4192 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394193 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264194 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074195}
4196
[email protected]0dc88b32014-03-26 20:12:284197// Tests that a preconnect that starts out with unread data can still be used.
4198// http://crbug.com/334467
4199TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4200 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4201 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4202
Matt Menkef09e64c2019-04-23 22:16:284203 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4204 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284205
Matt Menke9fa17d52019-03-25 19:12:264206 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4207 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4208 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4209 TestGroupId("a")));
4210 EXPECT_EQ(0u,
4211 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394212 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284213
4214 // Fail future jobs to be sure that handle receives the preconnected socket
4215 // rather than closing it and making a new one.
4216 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4217 ClientSocketHandle handle;
4218 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394219 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284220 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4221 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394222 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4223 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284224
Matt Menke9fa17d52019-03-25 19:12:264225 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4226 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4227 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4228 TestGroupId("a")));
4229 EXPECT_EQ(0u,
4230 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394231 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264232 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284233
4234 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354235 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284236
4237 TestLoadTimingInfoConnectedReused(handle);
4238 handle.Reset();
4239
4240 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394241 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284242}
4243
Lily Chenecebf932018-11-02 17:15:434244TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4245 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4246 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4247
4248 ClientSocketHandle handle1;
4249 TestCompletionCallback callback1;
4250 EXPECT_EQ(
4251 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284252 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4253 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504254 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4255 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434256
Matt Menke9fa17d52019-03-25 19:12:264257 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4258 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4259 TestGroupId("a")));
4260 EXPECT_EQ(0u,
4261 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394262 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434263
Matt Menkec6b3edf72019-03-19 17:00:394264 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4265 &handle1));
Lily Chenecebf932018-11-02 17:15:434266}
4267
4268TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4269 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4270 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4271
4272 ClientSocketHandle handle1;
4273 TestCompletionCallback callback1;
4274 EXPECT_EQ(
4275 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284276 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4277 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504278 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4279 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434280
Matt Menke9fa17d52019-03-25 19:12:264281 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4282 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4283 TestGroupId("a")));
4284 EXPECT_EQ(0u,
4285 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394286 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434287
4288 ClientSocketHandle handle2;
4289 TestCompletionCallback callback2;
4290 EXPECT_EQ(
4291 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284292 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4293 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504294 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4295 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434296
Matt Menke9fa17d52019-03-25 19:12:264297 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4298 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4299 TestGroupId("a")));
4300 EXPECT_EQ(0u,
4301 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394302 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434303
Matt Menkec6b3edf72019-03-19 17:00:394304 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4305 &handle1));
4306 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4307 &handle2));
Lily Chenecebf932018-11-02 17:15:434308
4309 // One job completes. The other request should still have its job.
4310 client_socket_factory_.SignalJob(0);
4311 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4312
Matt Menke9fa17d52019-03-25 19:12:264313 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4314 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4315 TestGroupId("a")));
4316 EXPECT_EQ(0u,
4317 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4318 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394319 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434320
Matt Menkec6b3edf72019-03-19 17:00:394321 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4322 &handle2));
Lily Chenecebf932018-11-02 17:15:434323}
4324
4325TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4326 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4327 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4328
Matt Menkef09e64c2019-04-23 22:16:284329 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4330 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434331
Matt Menke9fa17d52019-03-25 19:12:264332 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4333 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4334 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4335 TestGroupId("a")));
4336 EXPECT_EQ(1u,
4337 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394338 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434339
4340 ClientSocketHandle handle1;
4341 TestCompletionCallback callback1;
4342 EXPECT_EQ(
4343 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284344 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4345 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504346 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4347 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434348
Matt Menke9fa17d52019-03-25 19:12:264349 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4350 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4351 TestGroupId("a")));
4352 EXPECT_EQ(0u,
4353 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394354 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434355
Matt Menkec6b3edf72019-03-19 17:00:394356 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4357 &handle1));
Lily Chenecebf932018-11-02 17:15:434358}
4359
4360TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4361 CreatePool(kDefaultMaxSockets, 1);
4362 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4363
4364 ClientSocketHandle handle1;
4365 TestCompletionCallback callback1;
4366 EXPECT_EQ(
4367 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284368 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4369 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504370 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4371 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434372
Matt Menke9fa17d52019-03-25 19:12:264373 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4374 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4375 TestGroupId("a")));
4376 EXPECT_EQ(0u,
4377 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394378 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434379
Matt Menkec6b3edf72019-03-19 17:00:394380 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4381 &handle1));
Lily Chenecebf932018-11-02 17:15:434382
4383 // Insert a higher priority request
4384 ClientSocketHandle handle2;
4385 TestCompletionCallback callback2;
4386 EXPECT_EQ(
4387 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284388 handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4389 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504390 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4391 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434392
Matt Menke9fa17d52019-03-25 19:12:264393 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4394 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4395 TestGroupId("a")));
4396 EXPECT_EQ(0u,
4397 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394398 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434399
4400 // The highest priority request should steal the job from the default priority
4401 // request.
Matt Menkec6b3edf72019-03-19 17:00:394402 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4403 &handle2));
4404 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4405 &handle1));
Lily Chenecebf932018-11-02 17:15:434406}
4407
4408TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4409 CreatePool(3, 3);
4410 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4411
4412 ClientSocketHandle handle_lowest;
4413 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284414 EXPECT_EQ(
4415 ERR_IO_PENDING,
4416 handle_lowest.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4417 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4418 callback_lowest.callback(),
4419 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4420 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434421
Matt Menke9fa17d52019-03-25 19:12:264422 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4423 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4424 TestGroupId("a")));
4425 EXPECT_EQ(0u,
4426 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394427 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434428
4429 ClientSocketHandle handle_highest;
4430 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284431 EXPECT_EQ(
4432 ERR_IO_PENDING,
4433 handle_highest.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4434 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4435 callback_highest.callback(),
4436 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4437 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434438
Matt Menke9fa17d52019-03-25 19:12:264439 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4440 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4441 TestGroupId("a")));
4442 EXPECT_EQ(0u,
4443 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394444 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434445
4446 ClientSocketHandle handle_low;
4447 TestCompletionCallback callback_low;
4448 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284449 handle_low.Init(
4450 TestGroupId("a"), params_, base::nullopt, LOW, SocketTag(),
4451 ClientSocketPool::RespectLimits::ENABLED,
4452 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4453 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434454
Matt Menke9fa17d52019-03-25 19:12:264455 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4456 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4457 TestGroupId("a")));
4458 EXPECT_EQ(0u,
4459 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394460 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434461
4462 ClientSocketHandle handle_lowest2;
4463 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284464 EXPECT_EQ(
4465 ERR_IO_PENDING,
4466 handle_lowest2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4467 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4468 callback_lowest2.callback(),
4469 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4470 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434471
Matt Menke9fa17d52019-03-25 19:12:264472 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4473 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4474 TestGroupId("a")));
4475 EXPECT_EQ(0u,
4476 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394477 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434478
4479 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394480 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4481 &handle_highest));
4482 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4483 &handle_low));
4484 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4485 &handle_lowest));
4486 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4487 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434488
4489 // Add another request with medium priority. It should steal the job from the
4490 // lowest priority request with a job.
4491 ClientSocketHandle handle_medium;
4492 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284493 EXPECT_EQ(
4494 ERR_IO_PENDING,
4495 handle_medium.Init(TestGroupId("a"), params_, base::nullopt, MEDIUM,
4496 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4497 callback_medium.callback(),
4498 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4499 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434500
Matt Menke9fa17d52019-03-25 19:12:264501 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4502 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4503 TestGroupId("a")));
4504 EXPECT_EQ(0u,
4505 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394506 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4507 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4508 &handle_highest));
4509 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4510 &handle_medium));
4511 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4512 &handle_low));
4513 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4514 &handle_lowest));
4515 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4516 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434517}
4518
4519TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4520 CreatePool(kDefaultMaxSockets, 1);
4521 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4522
4523 ClientSocketHandle handle1;
4524 TestCompletionCallback callback1;
4525 EXPECT_EQ(
4526 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284527 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4528 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504529 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4530 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434531
Matt Menke9fa17d52019-03-25 19:12:264532 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4533 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4534 TestGroupId("a")));
4535 EXPECT_EQ(0u,
4536 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394537 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434538
4539 ClientSocketHandle handle2;
4540 TestCompletionCallback callback2;
4541 EXPECT_EQ(
4542 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284543 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4544 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504545 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4546 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434547
Matt Menke9fa17d52019-03-25 19:12:264548 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4549 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4550 TestGroupId("a")));
4551 EXPECT_EQ(0u,
4552 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394553 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434554
4555 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394556 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4557 &handle1));
4558 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4559 &handle2));
Lily Chenecebf932018-11-02 17:15:434560
4561 // Reprioritizing the second request places it above the first, and it steals
4562 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394563 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4564 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4565 &handle2));
4566 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4567 &handle1));
Lily Chenecebf932018-11-02 17:15:434568}
4569
4570TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4571 CreatePool(kDefaultMaxSockets, 1);
4572 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4573
4574 ClientSocketHandle handle1;
4575 TestCompletionCallback callback1;
4576 EXPECT_EQ(
4577 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284578 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4579 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504580 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4581 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434582
Matt Menke9fa17d52019-03-25 19:12:264583 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4584 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4585 TestGroupId("a")));
4586 EXPECT_EQ(0u,
4587 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394588 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434589
Matt Menkec6b3edf72019-03-19 17:00:394590 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4591 &handle1));
Lily Chenecebf932018-11-02 17:15:434592
4593 ClientSocketHandle handle2;
4594 TestCompletionCallback callback2;
4595 EXPECT_EQ(
4596 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284597 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4598 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504599 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4600 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434601
Matt Menke9fa17d52019-03-25 19:12:264602 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4603 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4604 TestGroupId("a")));
4605 EXPECT_EQ(0u,
4606 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394607 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434608
4609 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394610 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4611 &handle1));
4612 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4613 &handle2));
Lily Chenecebf932018-11-02 17:15:434614
4615 // The second request should get a job upon cancelling the first request.
4616 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264617 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4618 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4619 TestGroupId("a")));
4620 EXPECT_EQ(0u,
4621 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394622 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434623
Matt Menkec6b3edf72019-03-19 17:00:394624 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4625 &handle2));
Lily Chenecebf932018-11-02 17:15:434626}
4627
4628TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4629 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4630 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4631
4632 ClientSocketHandle handle1;
4633 TestCompletionCallback callback1;
4634 EXPECT_EQ(
4635 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284636 handle1.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4637 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504638 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4639 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434640
Matt Menke9fa17d52019-03-25 19:12:264641 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4642 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4643 TestGroupId("a")));
4644 EXPECT_EQ(0u,
4645 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394646 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434647
4648 ClientSocketHandle handle2;
4649 TestCompletionCallback callback2;
4650 EXPECT_EQ(
4651 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284652 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4653 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504654 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4655 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434656
Matt Menke9fa17d52019-03-25 19:12:264657 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4658 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4659 TestGroupId("a")));
4660 EXPECT_EQ(0u,
4661 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394662 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434663
Matt Menkec6b3edf72019-03-19 17:00:394664 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4665 &handle1));
4666 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4667 &handle2));
Lily Chenecebf932018-11-02 17:15:434668
4669 // The lower-priority job completes first. The higher-priority request should
4670 // get the socket, and the lower-priority request should get the remaining
4671 // job.
4672 client_socket_factory_.SignalJob(1);
4673 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264674 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4675 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4676 TestGroupId("a")));
4677 EXPECT_EQ(0u,
4678 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4679 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394680 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434681 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394682 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4683 &handle2));
Lily Chenecebf932018-11-02 17:15:434684}
4685
[email protected]043b68c82013-08-22 23:41:524686class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204687 public:
Matt Menke9fa17d52019-03-25 19:12:264688 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394689 const ClientSocketPool::GroupId& group_id)
4690 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524691 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204692 }
4693
Daniel Cheng4496d0822018-04-26 21:52:154694 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204695
Matt Menke9fa17d52019-03-25 19:12:264696 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504697 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034698 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284699 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
4700 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4701 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204702 }
4703
Matt Menke9fa17d52019-03-25 19:12:264704 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504705 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034706 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284707 base::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504708 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4709 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204710 }
4711
4712 bool ReleaseOneConnection() {
4713 if (!handle_.is_initialized() || !can_release_connection_) {
4714 return false;
4715 }
4716 handle_.socket()->Disconnect();
4717 handle_.Reset();
4718 return true;
4719 }
4720
4721 void set_can_release_connection(bool can_release_connection) {
4722 can_release_connection_ = can_release_connection;
4723 }
4724
4725 MOCK_METHOD0(CloseOneIdleConnection, bool());
4726
4727 private:
Matt Menke9fa17d52019-03-25 19:12:264728 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204729 ClientSocketHandle handle_;
4730 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394731 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204732 bool can_release_connection_;
4733};
4734
[email protected]58e562f2013-04-22 17:32:204735// Tests the basic case of closing an idle socket in a higher layered pool when
4736// a new request is issued and the lower layer pool is stalled.
4737TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4738 CreatePool(1, 1);
4739 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4740
Matt Menkec6b3edf72019-03-19 17:00:394741 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014742 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204743 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4744 .WillOnce(Invoke(&mock_layered_pool,
4745 &MockLayeredPool::ReleaseOneConnection));
4746 ClientSocketHandle handle;
4747 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504748 EXPECT_EQ(
4749 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284750 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4751 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4752 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4753 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014754 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204755}
4756
Matt Menke833678642019-03-05 22:05:514757// Tests the case that trying to close an idle socket in a higher layered pool
4758// fails.
4759TEST_F(ClientSocketPoolBaseTest,
4760 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4761 CreatePool(1, 1);
4762 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4763
Matt Menkec6b3edf72019-03-19 17:00:394764 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514765 mock_layered_pool.set_can_release_connection(false);
4766 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4767 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4768 .WillOnce(Invoke(&mock_layered_pool,
4769 &MockLayeredPool::ReleaseOneConnection));
4770 ClientSocketHandle handle;
4771 TestCompletionCallback callback;
4772 EXPECT_EQ(
4773 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284774 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4775 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4776 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4777 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514778 base::RunLoop().RunUntilIdle();
4779 EXPECT_FALSE(callback.have_result());
4780}
4781
[email protected]58e562f2013-04-22 17:32:204782// Same as above, but the idle socket is in the same group as the stalled
4783// socket, and closes the only other request in its group when closing requests
4784// in higher layered pools. This generally shouldn't happen, but it may be
4785// possible if a higher level pool issues a request and the request is
4786// subsequently cancelled. Even if it's not possible, best not to crash.
4787TEST_F(ClientSocketPoolBaseTest,
4788 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4789 CreatePool(2, 2);
4790 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4791
4792 // Need a socket in another group for the pool to be stalled (If a group
4793 // has the maximum number of connections already, it's not stalled).
4794 ClientSocketHandle handle1;
4795 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284796 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4797 DEFAULT_PRIORITY, SocketTag(),
4798 ClientSocketPool::RespectLimits::ENABLED,
4799 callback1.callback(),
4800 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4801 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204802
Matt Menkec6b3edf72019-03-19 17:00:394803 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014804 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204805 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4806 .WillOnce(Invoke(&mock_layered_pool,
4807 &MockLayeredPool::ReleaseOneConnection));
4808 ClientSocketHandle handle;
4809 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284810 EXPECT_EQ(ERR_IO_PENDING,
4811 handle.Init(
4812 TestGroupId("group2"), params_, base::nullopt, DEFAULT_PRIORITY,
4813 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4814 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4815 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014816 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204817}
4818
4819// Tests the case when an idle socket can be closed when a new request is
4820// issued, and the new request belongs to a group that was previously stalled.
4821TEST_F(ClientSocketPoolBaseTest,
4822 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4823 CreatePool(2, 2);
4824 std::list<TestConnectJob::JobType> job_types;
4825 job_types.push_back(TestConnectJob::kMockJob);
4826 job_types.push_back(TestConnectJob::kMockJob);
4827 job_types.push_back(TestConnectJob::kMockJob);
4828 job_types.push_back(TestConnectJob::kMockJob);
4829 connect_job_factory_->set_job_types(&job_types);
4830
4831 ClientSocketHandle handle1;
4832 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284833 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4834 DEFAULT_PRIORITY, SocketTag(),
4835 ClientSocketPool::RespectLimits::ENABLED,
4836 callback1.callback(),
4837 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4838 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204839
Matt Menkec6b3edf72019-03-19 17:00:394840 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014841 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204842 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4843 .WillRepeatedly(Invoke(&mock_layered_pool,
4844 &MockLayeredPool::ReleaseOneConnection));
4845 mock_layered_pool.set_can_release_connection(false);
4846
4847 // The third request is made when the socket pool is in a stalled state.
4848 ClientSocketHandle handle3;
4849 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284850 EXPECT_EQ(ERR_IO_PENDING,
4851 handle3.Init(
4852 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4853 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4854 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4855 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204856
4857 base::RunLoop().RunUntilIdle();
4858 EXPECT_FALSE(callback3.have_result());
4859
4860 // The fourth request is made when the pool is no longer stalled. The third
4861 // request should be serviced first, since it was issued first and has the
4862 // same priority.
4863 mock_layered_pool.set_can_release_connection(true);
4864 ClientSocketHandle handle4;
4865 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284866 EXPECT_EQ(ERR_IO_PENDING,
4867 handle4.Init(
4868 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4869 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4870 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4871 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014872 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204873 EXPECT_FALSE(callback4.have_result());
4874
4875 // Closing a handle should free up another socket slot.
4876 handle1.Reset();
robpercival214763f2016-07-01 23:27:014877 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204878}
4879
4880// Tests the case when an idle socket can be closed when a new request is
4881// issued, and the new request belongs to a group that was previously stalled.
4882//
4883// The two differences from the above test are that the stalled requests are not
4884// in the same group as the layered pool's request, and the the fourth request
4885// has a higher priority than the third one, so gets a socket first.
4886TEST_F(ClientSocketPoolBaseTest,
4887 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4888 CreatePool(2, 2);
4889 std::list<TestConnectJob::JobType> job_types;
4890 job_types.push_back(TestConnectJob::kMockJob);
4891 job_types.push_back(TestConnectJob::kMockJob);
4892 job_types.push_back(TestConnectJob::kMockJob);
4893 job_types.push_back(TestConnectJob::kMockJob);
4894 connect_job_factory_->set_job_types(&job_types);
4895
4896 ClientSocketHandle handle1;
4897 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284898 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4899 DEFAULT_PRIORITY, SocketTag(),
4900 ClientSocketPool::RespectLimits::ENABLED,
4901 callback1.callback(),
4902 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4903 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204904
Matt Menkec6b3edf72019-03-19 17:00:394905 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014906 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204907 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4908 .WillRepeatedly(Invoke(&mock_layered_pool,
4909 &MockLayeredPool::ReleaseOneConnection));
4910 mock_layered_pool.set_can_release_connection(false);
4911
4912 // The third request is made when the socket pool is in a stalled state.
4913 ClientSocketHandle handle3;
4914 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204915 EXPECT_EQ(
4916 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284917 handle3.Init(TestGroupId("group3"), params_, base::nullopt, MEDIUM,
4918 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504919 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4920 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204921
4922 base::RunLoop().RunUntilIdle();
4923 EXPECT_FALSE(callback3.have_result());
4924
4925 // The fourth request is made when the pool is no longer stalled. This
4926 // request has a higher priority than the third request, so is serviced first.
4927 mock_layered_pool.set_can_release_connection(true);
4928 ClientSocketHandle handle4;
4929 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204930 EXPECT_EQ(
4931 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284932 handle4.Init(TestGroupId("group3"), params_, base::nullopt, HIGHEST,
4933 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504934 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4935 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014936 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204937 EXPECT_FALSE(callback3.have_result());
4938
4939 // Closing a handle should free up another socket slot.
4940 handle1.Reset();
robpercival214763f2016-07-01 23:27:014941 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204942}
4943
4944TEST_F(ClientSocketPoolBaseTest,
4945 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4946 CreatePool(1, 1);
4947 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4948
Matt Menkec6b3edf72019-03-19 17:00:394949 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014950 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204951 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4952 .WillRepeatedly(Invoke(&mock_layered_pool1,
4953 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:394954 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:014955 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4956 IsOk());
[email protected]58e562f2013-04-22 17:32:204957 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4958 .WillRepeatedly(Invoke(&mock_layered_pool2,
4959 &MockLayeredPool::ReleaseOneConnection));
4960 ClientSocketHandle handle;
4961 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504962 EXPECT_EQ(
4963 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284964 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4965 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4966 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4967 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014968 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204969}
4970
[email protected]b021ece62013-06-11 11:06:334971// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154972// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4973// socket instead of a request with the same priority that was issued earlier,
4974// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334975TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334976 CreatePool(1, 1);
4977
4978 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394979 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4980 TestGroupId("a"), MAXIMUM_PRIORITY,
4981 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264982 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334983
4984 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4985
mmenked3641e12016-01-28 16:06:154986 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394987 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154988 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264989 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334990
mmenked3641e12016-01-28 16:06:154991 // Issue a request that ignores the limits, so a new ConnectJob is
4992 // created.
4993 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394994 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154995 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264996 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334997
robpercival214763f2016-07-01 23:27:014998 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334999 EXPECT_FALSE(request(1)->have_result());
5000}
5001
[email protected]c55fabd2013-11-04 23:26:565002// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155003// issued for a request with RespectLimits::DISABLED is not cancelled when a
5004// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565005TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565006 CreatePool(1, 1);
5007
5008 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395009 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5010 TestGroupId("a"), MAXIMUM_PRIORITY,
5011 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265012 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565013
5014 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5015
mmenked3641e12016-01-28 16:06:155016 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395017 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155018 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265019 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565020
mmenked3641e12016-01-28 16:06:155021 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5022 // created.
5023 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395024 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155025 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265026 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335027
mmenked3641e12016-01-28 16:06:155028 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335029 // should not be cancelled.
5030 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265031 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335032
robpercival214763f2016-07-01 23:27:015033 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335034 EXPECT_FALSE(request(1)->have_result());
5035}
5036
Matt Menkeb57663b32019-03-01 17:17:105037TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5038 CreatePool(1, 1);
5039
5040 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5041
5042 ClientSocketHandle handle;
5043 TestCompletionCallback callback;
5044 EXPECT_EQ(
5045 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285046 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5047 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5048 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5049 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105050
Matt Menke9fa17d52019-03-25 19:12:265051 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105052
5053 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5054 EXPECT_FALSE(handle.is_initialized());
5055 EXPECT_FALSE(handle.socket());
5056
5057 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265058 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105059}
5060
5061class TestAuthHelper {
5062 public:
5063 TestAuthHelper() = default;
5064 ~TestAuthHelper() = default;
5065
Matt Menkec6b3edf72019-03-19 17:00:395066 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195067 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265068 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395069 RequestPriority priority = DEFAULT_PRIORITY,
5070 ClientSocketPool::RespectLimits respect_limits =
5071 ClientSocketPool::RespectLimits::ENABLED,
5072 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105073 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285074 handle_.Init(group_id_in, params, base::nullopt, priority,
5075 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105076 base::BindRepeating(&TestAuthHelper::AuthCallback,
5077 base::Unretained(this)),
5078 pool, NetLogWithSource()));
5079 }
5080
5081 void WaitForAuth() {
5082 run_loop_ = std::make_unique<base::RunLoop>();
5083 run_loop_->Run();
5084 run_loop_.reset();
5085 }
5086
5087 void WaitForAuthAndRestartSync() {
5088 restart_sync_ = true;
5089 WaitForAuth();
5090 restart_sync_ = false;
5091 }
5092
5093 void WaitForAuthAndResetHandleSync() {
5094 reset_handle_sync_ = true;
5095 WaitForAuth();
5096 reset_handle_sync_ = false;
5097 }
5098
5099 void RestartWithAuth() {
5100 DCHECK(restart_with_auth_callback_);
5101 std::move(restart_with_auth_callback_).Run();
5102 }
5103
5104 int WaitForResult() {
5105 int result = callback_.WaitForResult();
5106 // There shouldn't be any callback waiting to be invoked once the request is
5107 // complete.
5108 EXPECT_FALSE(restart_with_auth_callback_);
5109 // The socket should only be initialized on success.
5110 EXPECT_EQ(result == OK, handle_.is_initialized());
5111 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5112 return result;
5113 }
5114
5115 ClientSocketHandle* handle() { return &handle_; }
5116 int auth_count() const { return auth_count_; }
5117 int have_result() const { return callback_.have_result(); }
5118
5119 private:
5120 void AuthCallback(const HttpResponseInfo& response,
5121 HttpAuthController* auth_controller,
5122 base::OnceClosure restart_with_auth_callback) {
5123 EXPECT_FALSE(restart_with_auth_callback_);
5124 EXPECT_TRUE(restart_with_auth_callback);
5125
5126 // Once there's a result, this method shouldn't be invoked again.
5127 EXPECT_FALSE(callback_.have_result());
5128
5129 ++auth_count_;
5130 run_loop_->Quit();
5131 if (restart_sync_) {
5132 std::move(restart_with_auth_callback).Run();
5133 return;
5134 }
5135
5136 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5137
5138 if (reset_handle_sync_) {
5139 handle_.Reset();
5140 return;
5141 }
5142 }
5143
5144 std::unique_ptr<base::RunLoop> run_loop_;
5145 base::OnceClosure restart_with_auth_callback_;
5146
5147 bool restart_sync_ = false;
5148 bool reset_handle_sync_ = false;
5149
5150 ClientSocketHandle handle_;
5151 int auth_count_ = 0;
5152 TestCompletionCallback callback_;
5153
5154 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
5155};
5156
5157TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5158 CreatePool(1, 1);
5159 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5160
5161 TestAuthHelper auth_helper;
5162 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265163 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015164 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395165 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105166
5167 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265168 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015169 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395170 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105171
5172 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265173 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015174 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395175 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105176
5177 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5178 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265179 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5180 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395181 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105182 EXPECT_EQ(0, pool_->IdleSocketCount());
5183}
5184
5185TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5186 CreatePool(1, 1);
5187 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5188
5189 TestAuthHelper auth_helper;
5190 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265191 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015192 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395193 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105194
5195 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265196 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015197 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395198 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105199
5200 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5201 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265202 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5203 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395204 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105205 EXPECT_EQ(0, pool_->IdleSocketCount());
5206}
5207
5208TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5209 CreatePool(1, 1);
5210 connect_job_factory_->set_job_type(
5211 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5212
5213 TestAuthHelper auth_helper;
5214 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265215 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105216
5217 auth_helper.WaitForAuth();
5218 auth_helper.RestartWithAuth();
5219 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5220
5221 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265222 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105223 EXPECT_EQ(0, pool_->IdleSocketCount());
5224}
5225
5226TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5227 CreatePool(1, 1);
5228 connect_job_factory_->set_job_type(
5229 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5230
5231 TestAuthHelper auth_helper;
5232 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265233 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105234
5235 auth_helper.WaitForAuthAndRestartSync();
5236 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5237
5238 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265239 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105240 EXPECT_EQ(0, pool_->IdleSocketCount());
5241}
5242
5243TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5244 CreatePool(1, 1);
5245 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5246
5247 TestAuthHelper auth_helper;
5248 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265249 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105250
5251 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265252 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105253
5254 auth_helper.handle()->Reset();
5255
5256 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265257 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105258 EXPECT_EQ(0, pool_->IdleSocketCount());
5259 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5260 EXPECT_FALSE(auth_helper.handle()->socket());
5261}
5262
5263TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5264 CreatePool(1, 1);
5265 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5266
5267 TestAuthHelper auth_helper;
5268 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265269 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105270
5271 auth_helper.WaitForAuthAndResetHandleSync();
5272 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265273 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105274 EXPECT_EQ(0, pool_->IdleSocketCount());
5275 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5276 EXPECT_FALSE(auth_helper.handle()->socket());
5277}
5278
5279TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5280 CreatePool(1, 1);
5281 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5282
5283 TestAuthHelper auth_helper;
5284 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265285 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105286
5287 auth_helper.WaitForAuth();
5288
5289 pool_->FlushWithError(ERR_FAILED);
5290 base::RunLoop().RunUntilIdle();
5291
5292 // When flushing the socket pool, bound sockets should delay returning the
5293 // error until completion.
5294 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265295 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105296 EXPECT_EQ(0, pool_->IdleSocketCount());
5297
5298 auth_helper.RestartWithAuth();
5299 // The callback should be called asynchronously.
5300 EXPECT_FALSE(auth_helper.have_result());
5301
5302 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265303 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105304 EXPECT_EQ(0, pool_->IdleSocketCount());
5305}
5306
5307TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5308 CreatePool(1, 1);
5309 connect_job_factory_->set_job_type(
5310 TestConnectJob::kMockAuthChallengeTwiceJob);
5311
5312 TestAuthHelper auth_helper;
5313 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265314 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015315 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395316 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105317
5318 auth_helper.WaitForAuth();
5319 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265320 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105321 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015322 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395323 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105324
5325 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265326 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015327 EXPECT_EQ(2, auth_helper.auth_count());
5328 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395329 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015330
Matt Menkeb57663b32019-03-01 17:17:105331 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265332 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105333 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015334 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395335 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105336
5337 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5338 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265339 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5340 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395341 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105342 EXPECT_EQ(0, pool_->IdleSocketCount());
5343}
5344
5345TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5346 CreatePool(1, 1);
5347 connect_job_factory_->set_job_type(
5348 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5349
5350 TestAuthHelper auth_helper;
5351 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265352 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105353
5354 auth_helper.WaitForAuth();
5355 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265356 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105357 EXPECT_EQ(1, auth_helper.auth_count());
5358
5359 auth_helper.WaitForAuth();
5360 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265361 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105362 EXPECT_EQ(2, auth_helper.auth_count());
5363
5364 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5365 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265366 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105367 EXPECT_EQ(0, pool_->IdleSocketCount());
5368}
5369
5370// Makes sure that when a bound request is destroyed, a new ConnectJob is
5371// created, if needed.
5372TEST_F(ClientSocketPoolBaseTest,
5373 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5374 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5375 connect_job_factory_->set_job_type(
5376 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5377
5378 // First request creates a ConnectJob.
5379 TestAuthHelper auth_helper1;
5380 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265381 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105382
5383 // A second request come in, but no new ConnectJob is needed, since the limit
5384 // has been reached.
5385 TestAuthHelper auth_helper2;
5386 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265387 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105388
5389 // Run until the auth callback for the first request is invoked.
5390 auth_helper1.WaitForAuth();
5391 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265392 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5393 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395394 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105395
5396 // Make connect jobs succeed, then cancel the first request, which should
5397 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5398 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5399 auth_helper1.handle()->Reset();
5400 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265401 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105402
5403 // The second ConnectJob should succeed.
5404 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5405 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265406 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105407}
5408
5409// Makes sure that when a bound request is destroyed, a new ConnectJob is
5410// created for another group, if needed.
5411TEST_F(ClientSocketPoolBaseTest,
5412 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5413 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5414 connect_job_factory_->set_job_type(
5415 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5416
5417 // First request creates a ConnectJob.
5418 TestAuthHelper auth_helper1;
5419 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265420 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105421
5422 // A second request come in, but no new ConnectJob is needed, since the limit
5423 // has been reached.
5424 TestAuthHelper auth_helper2;
5425 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395426 ClientSocketPool::RespectLimits::ENABLED,
5427 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265428 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5429 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105430
5431 // Run until the auth callback for the first request is invoked.
5432 auth_helper1.WaitForAuth();
5433 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265434 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5435 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395436 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265437 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5438 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395439 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105440
5441 // Make connect jobs succeed, then cancel the first request, which should
5442 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5443 // other group.
5444 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5445 auth_helper1.handle()->Reset();
5446 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265447 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5448 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105449
5450 // The second ConnectJob should succeed.
5451 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5452 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265453 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5454 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105455}
5456
5457// Test that once an auth challenge is bound, that's the request that gets all
5458// subsequent calls and the socket itself.
5459TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5460 CreatePool(1, 1);
5461 connect_job_factory_->set_job_type(
5462 TestConnectJob::kMockAuthChallengeTwiceJob);
5463
5464 // First request creates a ConnectJob.
5465 TestAuthHelper auth_helper1;
5466 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265467 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105468
5469 // A second, higher priority request is made.
5470 TestAuthHelper auth_helper2;
5471 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265472 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105473
5474 // Run until the auth callback for the second request is invoked.
5475 auth_helper2.WaitForAuth();
5476 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265477 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5478 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395479 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105480
5481 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5482 // ConnectJob.
5483 TestAuthHelper auth_helper3;
5484 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265485 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105486
5487 // Start a higher job that ignores limits, creating a hanging socket. It
5488 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5489 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5490 TestAuthHelper auth_helper4;
5491 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5492 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265493 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105494
5495 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5496 // again.
5497 auth_helper2.RestartWithAuth();
5498 auth_helper2.WaitForAuth();
5499 EXPECT_EQ(0, auth_helper1.auth_count());
5500 EXPECT_FALSE(auth_helper1.have_result());
5501 EXPECT_EQ(2, auth_helper2.auth_count());
5502 EXPECT_FALSE(auth_helper2.have_result());
5503 EXPECT_EQ(0, auth_helper3.auth_count());
5504 EXPECT_FALSE(auth_helper3.have_result());
5505 EXPECT_EQ(0, auth_helper4.auth_count());
5506 EXPECT_FALSE(auth_helper4.have_result());
5507
5508 // Advance auth again, and |auth_helper2| should get the socket.
5509 auth_helper2.RestartWithAuth();
5510 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5511 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5512 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265513 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5514 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105515 EXPECT_EQ(0, auth_helper1.auth_count());
5516 EXPECT_FALSE(auth_helper1.have_result());
5517 EXPECT_EQ(0, auth_helper3.auth_count());
5518 EXPECT_FALSE(auth_helper3.have_result());
5519 EXPECT_EQ(0, auth_helper4.auth_count());
5520 EXPECT_FALSE(auth_helper4.have_result());
5521
5522 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5523 // socket request should be able to claim it.
5524 auth_helper2.handle()->Reset();
5525 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5526 EXPECT_EQ(0, auth_helper1.auth_count());
5527 EXPECT_FALSE(auth_helper1.have_result());
5528 EXPECT_EQ(0, auth_helper3.auth_count());
5529 EXPECT_FALSE(auth_helper3.have_result());
5530 EXPECT_EQ(0, auth_helper4.auth_count());
5531}
5532
Matt Menkebf3c767d2019-04-15 23:28:245533TEST_F(ClientSocketPoolBaseTest, RefreshGroupCreatesNewConnectJobs) {
5534 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5535 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5536
5537 // First job will be waiting until it gets aborted.
5538 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5539
5540 ClientSocketHandle handle;
5541 TestCompletionCallback callback;
5542 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285543 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5544 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5545 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5546 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245547 IsError(ERR_IO_PENDING));
5548
5549 // Switch connect job types, so creating a new ConnectJob will result in
5550 // success.
5551 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5552
5553 pool_->RefreshGroupForTesting(kGroupId);
5554 EXPECT_EQ(OK, callback.WaitForResult());
5555 ASSERT_TRUE(handle.socket());
5556 EXPECT_EQ(0, pool_->IdleSocketCount());
5557 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5558 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5559 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5560 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5561}
5562
5563TEST_F(ClientSocketPoolBaseTest, RefreshGroupClosesIdleConnectJobs) {
5564 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5565 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5566
Matt Menkef09e64c2019-04-23 22:16:285567 pool_->RequestSockets(kGroupId, params_, base::nullopt, 2,
5568 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245569 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5570 EXPECT_EQ(2, pool_->IdleSocketCount());
5571 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
5572
5573 pool_->RefreshGroupForTesting(kGroupId);
5574 EXPECT_EQ(0, pool_->IdleSocketCount());
5575 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5576}
5577
5578TEST_F(ClientSocketPoolBaseTest,
5579 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5580 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5581 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5582 const ClientSocketPool::GroupId kOtherGroupId = TestGroupId("b");
5583
Matt Menkef09e64c2019-04-23 22:16:285584 pool_->RequestSockets(kOtherGroupId, params_, base::nullopt, 2,
5585 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245586 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5587 EXPECT_EQ(2, pool_->IdleSocketCount());
5588 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5589
5590 pool_->RefreshGroupForTesting(kGroupId);
5591 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5592 EXPECT_EQ(2, pool_->IdleSocketCount());
5593 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5594}
5595
5596TEST_F(ClientSocketPoolBaseTest, RefreshGroupPreventsSocketReuse) {
5597 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5598 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5599
5600 ClientSocketHandle handle;
5601 TestCompletionCallback callback;
5602 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285603 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5604 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5605 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5606 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245607 IsOk());
5608 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5609 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5610
5611 pool_->RefreshGroupForTesting(kGroupId);
5612
5613 handle.Reset();
5614 EXPECT_EQ(0, pool_->IdleSocketCount());
5615 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5616}
5617
5618TEST_F(ClientSocketPoolBaseTest,
5619 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5620 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5621 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5622 const ClientSocketPool::GroupId kOtherGroupId = TestGroupId("b");
5623
5624 ClientSocketHandle handle;
5625 TestCompletionCallback callback;
5626 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285627 handle.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5628 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5629 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5630 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245631 IsOk());
5632 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5633 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5634
5635 pool_->RefreshGroupForTesting(kGroupId);
5636
5637 handle.Reset();
5638 EXPECT_EQ(1, pool_->IdleSocketCount());
5639 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5640 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5641}
5642
5643TEST_F(ClientSocketPoolBaseTest, RefreshGroupReplacesBoundConnectJobOnConnect) {
5644 CreatePool(1, 1);
5645 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5646 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5647
5648 TestAuthHelper auth_helper;
5649 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5650 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5651 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5652
5653 auth_helper.WaitForAuth();
5654
5655 // This should update the generation, but not cancel the old ConnectJob - it's
5656 // not safe to do anything while waiting on the original ConnectJob.
5657 pool_->RefreshGroupForTesting(kGroupId);
5658
5659 // Providing auth credentials and restarting the request with them will cause
5660 // the ConnectJob to complete successfully, but the result will be discarded
5661 // because of the generation mismatch.
5662 auth_helper.RestartWithAuth();
5663
5664 // Despite using ConnectJobs that simulate a single challenge, a second
5665 // challenge will be seen, due to using a new ConnectJob.
5666 auth_helper.WaitForAuth();
5667 auth_helper.RestartWithAuth();
5668
5669 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5670 EXPECT_TRUE(auth_helper.handle()->socket());
5671 EXPECT_EQ(2, auth_helper.auth_count());
5672
5673 // When released, the socket will be returned to the socket pool, and
5674 // available for reuse.
5675 auth_helper.handle()->Reset();
5676 EXPECT_EQ(1, pool_->IdleSocketCount());
5677 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5678 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5679}
5680
[email protected]f6d1d6eb2009-06-24 20:16:095681} // namespace
5682
5683} // namespace net