blob: 6d7ee44c97e2f5587c4fd646fdd4ad3b053e7b3e [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"
Matt Menkef09e64c2019-04-23 22:16:2818#include "base/optional.h"
[email protected]034df0f32013-01-07 23:17:4819#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4520#include "base/single_thread_task_runner.h"
Avi Drissman4365a4782018-12-28 19:26:2421#include "base/stl_util.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
Matt Menke166443c2019-05-24 18:45:5924#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0825#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3526#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0327#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5928#include "net/base/features.h"
[email protected]034df0f32013-01-07 23:17:4829#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5930#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0631#include "net/base/net_errors.h"
Matt Menke166443c2019-05-24 18:45:5932#include "net/base/network_isolation_key.h"
Matt Menkebdf777802019-04-22 19:38:5933#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3634#include "net/base/proxy_server.h"
[email protected]ac790b42009-12-02 04:31:3135#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0936#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3537#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5138#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0739#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0040#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1941#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0042#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5643#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4644#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0945#include "net/socket/client_socket_factory.h"
46#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2647#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2848#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5449#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1750#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4451#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1052#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2653#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5154#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0155#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4056#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2857#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3858#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4859#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0960#include "testing/gtest/include/gtest/gtest.h"
61
robpercival214763f2016-07-01 23:27:0162using net::test::IsError;
63using net::test::IsOk;
64
[email protected]51fdc7c2012-04-10 19:19:4865using ::testing::Invoke;
66using ::testing::Return;
67
[email protected]f6d1d6eb2009-06-24 20:16:0968namespace net {
69
70namespace {
71
[email protected]211d21722009-07-22 15:48:5372const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2073const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5974constexpr base::TimeDelta kUnusedIdleSocketTimeout =
75 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0176
Matt Menkebdf777802019-04-22 19:38:5977ClientSocketPool::GroupId TestGroupId(
78 const std::string& host,
79 int port = 80,
80 ClientSocketPool::SocketType socket_type =
81 ClientSocketPool::SocketType::kHttp,
Matt Menke166443c2019-05-24 18:45:5982 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
83 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
dalyk5f48a132019-10-14 15:20:1984 bool disable_secure_dns = false;
Matt Menkec6b3edf72019-03-19 17:00:3985 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
dalyk5f48a132019-10-14 15:20:1986 privacy_mode, network_isolation_key,
87 disable_secure_dns);
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();
David Benjamin24725be2019-07-24 20:57:18235 return nullptr;
[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(
David Benjamin24725be2019-07-24 20:57:18249 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12250 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27251 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18252 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09253 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18254 return nullptr;
[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 */,
David Benjamin24725be2019-07-24 20:57:18546 nullptr /* ssl_client_context */,
Matt Menkea6f99ad2019-03-08 02:26:43547 nullptr /* socket_performance_watcher_factory */,
548 nullptr /* network_quality_estimator */,
549 net_log,
550 nullptr /* websocket_endpoint_lock_manager */),
551 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35552 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43553 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05554
Chris Watkins7a41d3552017-12-01 02:13:27555 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05556
557 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
558
[email protected]51fdc7c2012-04-10 19:19:48559 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
560 job_types_ = job_types;
561 CHECK(!job_types_->empty());
562 }
563
[email protected]974ebd62009-08-03 23:14:34564 void set_timeout_duration(base::TimeDelta timeout_duration) {
565 timeout_duration_ = timeout_duration;
566 }
567
[email protected]3f55aa12011-12-07 02:03:33568 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55569
danakj655b66c2016-04-16 00:51:38570 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36571 ClientSocketPool::GroupId group_id,
572 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menkef09e64c2019-04-23 22:16:28573 const base::Optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Matt Menke16f5c2e52019-03-25 21:50:40574 RequestPriority request_priority,
575 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13576 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48577 EXPECT_TRUE(!job_types_ || !job_types_->empty());
578 TestConnectJob::JobType job_type = job_type_;
579 if (job_types_ && !job_types_->empty()) {
580 job_type = job_types_->front();
581 job_types_->pop_front();
582 }
Matt Menkea6f99ad2019-03-08 02:26:43583 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40584 job_type, request_priority, socket_tag, timeout_duration_,
585 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05586 }
587
588 private:
Matt Menkea6f99ad2019-03-08 02:26:43589 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05590 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48591 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34592 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57593 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05594
595 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
596};
597
[email protected]a937a06d2009-08-19 21:19:24598} // namespace
599
[email protected]a937a06d2009-08-19 21:19:24600namespace {
601
[email protected]5fc08e32009-07-15 17:09:57602void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26603 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57604 (*it)->Signal();
605 }
606 waiting_jobs_.clear();
607}
608
[email protected]03b7c8c2013-07-20 04:38:55609void MockClientSocketFactory::SignalJob(size_t job) {
610 ASSERT_LT(job, waiting_jobs_.size());
611 waiting_jobs_[job]->Signal();
612 waiting_jobs_.erase(waiting_jobs_.begin() + job);
613}
614
615void MockClientSocketFactory::SetJobLoadState(size_t job,
616 LoadState load_state) {
617 ASSERT_LT(job, waiting_jobs_.size());
618 waiting_jobs_[job]->set_load_state(load_state);
619}
620
Matt Menke141b87f22019-01-30 02:43:03621void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
622 ASSERT_LT(job, waiting_jobs_.size());
623 waiting_jobs_[job]->set_has_established_connection();
624}
625
Gabriel Charette694c3c332019-08-19 14:53:05626class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09627 protected:
Alex Clarke0def2092018-12-10 12:01:45628 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05629 : TestWithTaskEnvironment(
630 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03631 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54632 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40633 TransportClientSocketPool::connect_backup_jobs_enabled();
634 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54635 }
[email protected]2431756e2010-09-29 20:26:13636
dcheng67be2b1f2014-10-27 21:47:29637 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40638 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54639 connect_backup_jobs_enabled_);
640 }
[email protected]c9d6a1d2009-07-14 16:15:20641
Matt Menke9fa17d52019-03-25 19:12:26642 void CreatePool(int max_sockets,
643 int max_sockets_per_group,
644 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59645 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
646 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26647 ClientSocketPool::used_idle_socket_timeout(),
648 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16649 }
650
David Benjaminbac8dff2019-08-07 01:30:41651 void CreatePoolWithIdleTimeouts(
652 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,
657 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20658 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26659 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
660 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
661 &net_log_);
662 connect_job_factory_ = connect_job_factory.get();
663 pool_ = TransportClientSocketPool::CreateForTesting(
664 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
David Benjaminbac8dff2019-08-07 01:30:41665 used_idle_socket_timeout, proxy_server, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26666 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20667 }
[email protected]f6d1d6eb2009-06-24 20:16:09668
mmenked3641e12016-01-28 16:06:15669 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39670 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33671 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15672 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39673 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15674 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33675 }
676
Matt Menkec6b3edf72019-03-19 17:00:39677 int StartRequest(const ClientSocketPool::GroupId& group_id,
678 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15679 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39680 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09681 }
682
[email protected]2431756e2010-09-29 20:26:13683 int GetOrderOfRequest(size_t index) const {
684 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09685 }
686
[email protected]2431756e2010-09-29 20:26:13687 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
688 return test_base_.ReleaseOneConnection(keep_alive);
689 }
690
691 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
692 test_base_.ReleaseAllConnections(keep_alive);
693 }
694
695 TestSocketRequest* request(int i) { return test_base_.request(i); }
696 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38697 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42698 return test_base_.requests();
699 }
rdsmith29dbad12017-02-17 02:22:18700 // Only counts the requests that get sockets asynchronously;
701 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13702 size_t completion_count() const { return test_base_.completion_count(); }
703
Matt Muellerd9342e3a2019-11-26 01:41:14704 RecordingTestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54705 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09706 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04707 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26708 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19709 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26710 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13711 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09712};
713
Shivani Sharma8ae506c2019-07-21 21:08:27714// TODO(950069): Add testing for frame_origin in NetworkIsolationKey
715// using kAppendInitiatingFrameOriginToNetworkIsolationKey.
716
[email protected]5fc08e32009-07-15 17:09:57717TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53718 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20719
[email protected]6ecf2b92011-12-15 01:14:52720 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06721 ClientSocketHandle handle;
Matt Muellerd9342e3a2019-11-26 01:41:14722 RecordingBoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48723 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53724
Matt Menkef09e64c2019-04-23 22:16:28725 EXPECT_EQ(OK, handle.Init(
726 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
727 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
728 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
729 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09730 EXPECT_TRUE(handle.is_initialized());
731 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48732 TestLoadTimingInfoConnectedNotReused(handle);
733
[email protected]f6d1d6eb2009-06-24 20:16:09734 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48735 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30736
Eric Roman79cc7552019-07-19 02:17:54737 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40738
Matt Menke9fa17d52019-03-25 19:12:26739 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53740 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26741 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00742 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26743 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
744 EXPECT_TRUE(LogContainsEvent(
745 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
746 NetLogEventPhase::NONE));
747 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00748 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
749 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26750 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09751}
752
[email protected]ab838892009-06-30 18:49:05753TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53754 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20755
[email protected]ab838892009-06-30 18:49:05756 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Muellerd9342e3a2019-11-26 01:41:14757 RecordingBoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53758
[email protected]2431756e2010-09-29 20:26:13759 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52760 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18761 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13762 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51763 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50764 EXPECT_EQ(
765 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:28766 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
767 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
768 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
769 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13770 EXPECT_FALSE(handle.socket());
771 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51772 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48773 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30774
Eric Roman79cc7552019-07-19 02:17:54775 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40776
Matt Menke9fa17d52019-03-25 19:12:26777 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17778 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26779 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00780 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26781 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
782 EXPECT_TRUE(LogContainsEvent(
783 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
784 NetLogEventPhase::NONE));
785 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09786}
787
Matt Menkef6edce752019-03-19 17:21:56788// Make sure different groups do not share sockets.
789TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59790 base::test::ScopedFeatureList feature_list;
791 feature_list.InitAndEnableFeature(
792 features::kPartitionConnectionsByNetworkIsolationKey);
793
Matt Menkef6edce752019-03-19 17:21:56794 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
795
796 const HostPortPair kHostPortPairs[] = {
797 {"a", 80},
798 {"a", 443},
799 {"b", 80},
800 };
801
802 const ClientSocketPool::SocketType kSocketTypes[] = {
803 ClientSocketPool::SocketType::kHttp,
804 ClientSocketPool::SocketType::kSsl,
Matt Menkef6edce752019-03-19 17:21:56805 };
806
Matt Menkebdf777802019-04-22 19:38:59807 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
808 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56809
Shivani Sharma8ae506c2019-07-21 21:08:27810 const auto kOriginA = url::Origin::Create(GURL("http://a.test/"));
811 const auto kOriginB = url::Origin::Create(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59812 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Shivani Sharma8ae506c2019-07-21 21:08:27813 NetworkIsolationKey(kOriginA, kOriginA),
814 NetworkIsolationKey(kOriginB, kOriginB),
Matt Menke166443c2019-05-24 18:45:59815 };
816
dalyk5f48a132019-10-14 15:20:19817 const bool kDisableSecureDnsValues[] = {false, true};
818
Matt Menkef6edce752019-03-19 17:21:56819 int total_idle_sockets = 0;
820
821 // Walk through each GroupId, making sure that requesting a socket for one
822 // group does not return a previously connected socket for another group.
823 for (const auto& host_port_pair : kHostPortPairs) {
824 SCOPED_TRACE(host_port_pair.ToString());
825 for (const auto& socket_type : kSocketTypes) {
826 SCOPED_TRACE(static_cast<int>(socket_type));
827 for (const auto& privacy_mode : kPrivacyModes) {
828 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59829 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
830 SCOPED_TRACE(network_isolation_key.ToString());
dalyk5f48a132019-10-14 15:20:19831 for (const auto& disable_secure_dns : kDisableSecureDnsValues) {
832 SCOPED_TRACE(disable_secure_dns);
Matt Menkef6edce752019-03-19 17:21:56833
dalyk5f48a132019-10-14 15:20:19834 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56835
dalyk5f48a132019-10-14 15:20:19836 ClientSocketPool::GroupId group_id(
837 host_port_pair, socket_type, privacy_mode,
838 network_isolation_key, disable_secure_dns);
Matt Menkef6edce752019-03-19 17:21:56839
dalyk5f48a132019-10-14 15:20:19840 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56841
dalyk5f48a132019-10-14 15:20:19842 TestCompletionCallback callback;
843 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56844
dalyk5f48a132019-10-14 15:20:19845 // Since the group is empty, requesting a socket should not complete
846 // synchronously.
847 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
848 DEFAULT_PRIORITY, SocketTag(),
849 ClientSocketPool::RespectLimits::ENABLED,
850 callback.callback(),
851 ClientSocketPool::ProxyAuthCallback(),
852 pool_.get(), NetLogWithSource()),
853 IsError(ERR_IO_PENDING));
854 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
855 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56856
dalyk5f48a132019-10-14 15:20:19857 EXPECT_THAT(callback.WaitForResult(), IsOk());
858 EXPECT_TRUE(handle.socket());
859 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
860 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56861
dalyk5f48a132019-10-14 15:20:19862 // Return socket to pool.
863 handle.Reset();
864 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56865
dalyk5f48a132019-10-14 15:20:19866 // Requesting a socket again should return the same socket as
867 // before, so should complete synchronously.
868 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
869 DEFAULT_PRIORITY, SocketTag(),
870 ClientSocketPool::RespectLimits::ENABLED,
871 callback.callback(),
872 ClientSocketPool::ProxyAuthCallback(),
873 pool_.get(), NetLogWithSource()),
874 IsOk());
875 EXPECT_TRUE(handle.socket());
876 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56877
dalyk5f48a132019-10-14 15:20:19878 // Return socket to pool again.
879 handle.Reset();
880 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56881
dalyk5f48a132019-10-14 15:20:19882 ++total_idle_sockets;
883 }
Matt Menke166443c2019-05-24 18:45:59884 }
Matt Menkef6edce752019-03-19 17:21:56885 }
886 }
887 }
888}
889
[email protected]211d21722009-07-22 15:48:53890TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
891 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
892
[email protected]9e743cd2010-03-16 07:03:53893 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30894
Matt Menkec6b3edf72019-03-19 17:00:39895 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
896 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
897 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
898 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53899
[email protected]2431756e2010-09-29 20:26:13900 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53901 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13902 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53903
Matt Menkec6b3edf72019-03-19 17:00:39904 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
905 IsError(ERR_IO_PENDING));
906 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
907 IsError(ERR_IO_PENDING));
908 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
909 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53910
[email protected]2431756e2010-09-29 20:26:13911 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53912
[email protected]2431756e2010-09-29 20:26:13913 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53914 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13915 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53916
917 EXPECT_EQ(1, GetOrderOfRequest(1));
918 EXPECT_EQ(2, GetOrderOfRequest(2));
919 EXPECT_EQ(3, GetOrderOfRequest(3));
920 EXPECT_EQ(4, GetOrderOfRequest(4));
921 EXPECT_EQ(5, GetOrderOfRequest(5));
922 EXPECT_EQ(6, GetOrderOfRequest(6));
923 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17924
925 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13926 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53927}
928
929TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
930 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
931
[email protected]9e743cd2010-03-16 07:03:53932 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30933
[email protected]211d21722009-07-22 15:48:53934 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39935 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
936 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
937 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
938 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[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 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39945 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
946 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53947
[email protected]2431756e2010-09-29 20:26:13948 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53949
[email protected]2431756e2010-09-29 20:26:13950 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53951 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13952 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53953
954 EXPECT_EQ(1, GetOrderOfRequest(1));
955 EXPECT_EQ(2, GetOrderOfRequest(2));
956 EXPECT_EQ(3, GetOrderOfRequest(3));
957 EXPECT_EQ(4, GetOrderOfRequest(4));
958 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17959
960 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13961 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53962}
963
964TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
966
Matt Menkec6b3edf72019-03-19 17:00:39967 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
968 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
969 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
970 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53971
[email protected]2431756e2010-09-29 20:26:13972 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53973 client_socket_factory_.allocation_count());
974
Matt Menkec6b3edf72019-03-19 17:00:39975 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
976 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
977 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53978
[email protected]2431756e2010-09-29 20:26:13979 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53980
[email protected]2431756e2010-09-29 20:26:13981 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53982
983 // First 4 requests don't have to wait, and finish in order.
984 EXPECT_EQ(1, GetOrderOfRequest(1));
985 EXPECT_EQ(2, GetOrderOfRequest(2));
986 EXPECT_EQ(3, GetOrderOfRequest(3));
987 EXPECT_EQ(4, GetOrderOfRequest(4));
988
Matt Menkec6b3edf72019-03-19 17:00:39989 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
990 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53991 EXPECT_EQ(7, GetOrderOfRequest(5));
992 EXPECT_EQ(6, GetOrderOfRequest(6));
993 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17994
995 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13996 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53997}
998
rdsmith29dbad12017-02-17 02:22:18999// Test reprioritizing a request before completion doesn't interfere with
1000// its completion.
1001TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1002 CreatePool(kDefaultMaxSockets, 1);
1003
Matt Menkec6b3edf72019-03-19 17:00:391004 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1005 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181006 EXPECT_TRUE(request(0)->handle()->socket());
1007 EXPECT_FALSE(request(1)->handle()->socket());
1008
Lily Chenecebf932018-11-02 17:15:431009 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181010
1011 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1012
1013 EXPECT_TRUE(request(1)->handle()->socket());
1014}
1015
1016// Reprioritize a request up past another one and make sure that changes the
1017// completion order.
1018TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1019 CreatePool(kDefaultMaxSockets, 1);
1020
Matt Menkec6b3edf72019-03-19 17:00:391021 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1022 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1023 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181024 EXPECT_TRUE(request(0)->handle()->socket());
1025 EXPECT_FALSE(request(1)->handle()->socket());
1026 EXPECT_FALSE(request(2)->handle()->socket());
1027
1028 request(2)->handle()->SetPriority(HIGHEST);
1029
1030 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1031
1032 EXPECT_EQ(1, GetOrderOfRequest(1));
1033 EXPECT_EQ(3, GetOrderOfRequest(2));
1034 EXPECT_EQ(2, GetOrderOfRequest(3));
1035}
1036
1037// Reprioritize a request without changing relative priorities and check
1038// that the order doesn't change.
1039TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1040 CreatePool(kDefaultMaxSockets, 1);
1041
Matt Menkec6b3edf72019-03-19 17:00:391042 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1043 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1044 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181045 EXPECT_TRUE(request(0)->handle()->socket());
1046 EXPECT_FALSE(request(1)->handle()->socket());
1047 EXPECT_FALSE(request(2)->handle()->socket());
1048
1049 request(2)->handle()->SetPriority(MEDIUM);
1050
1051 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1052
1053 EXPECT_EQ(1, GetOrderOfRequest(1));
1054 EXPECT_EQ(2, GetOrderOfRequest(2));
1055 EXPECT_EQ(3, GetOrderOfRequest(3));
1056}
1057
1058// Reprioritize a request past down another one and make sure that changes the
1059// completion order.
1060TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1061 CreatePool(kDefaultMaxSockets, 1);
1062
Matt Menkec6b3edf72019-03-19 17:00:391063 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1064 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1065 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181066 EXPECT_TRUE(request(0)->handle()->socket());
1067 EXPECT_FALSE(request(1)->handle()->socket());
1068 EXPECT_FALSE(request(2)->handle()->socket());
1069
1070 request(1)->handle()->SetPriority(LOW);
1071
1072 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1073
1074 EXPECT_EQ(1, GetOrderOfRequest(1));
1075 EXPECT_EQ(3, GetOrderOfRequest(2));
1076 EXPECT_EQ(2, GetOrderOfRequest(3));
1077}
1078
1079// Reprioritize a request to the same level as another and confirm it is
1080// put after the old request.
1081TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1082 CreatePool(kDefaultMaxSockets, 1);
1083
Matt Menkec6b3edf72019-03-19 17:00:391084 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1085 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1086 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181087 EXPECT_TRUE(request(0)->handle()->socket());
1088 EXPECT_FALSE(request(1)->handle()->socket());
1089 EXPECT_FALSE(request(2)->handle()->socket());
1090
1091 request(1)->handle()->SetPriority(MEDIUM);
1092
1093 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1094
1095 EXPECT_EQ(1, GetOrderOfRequest(1));
1096 EXPECT_EQ(3, GetOrderOfRequest(2));
1097 EXPECT_EQ(2, GetOrderOfRequest(3));
1098}
1099
[email protected]211d21722009-07-22 15:48:531100TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1101 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1102
Matt Menkec6b3edf72019-03-19 17:00:391103 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1104 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1105 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1106 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531107
[email protected]2431756e2010-09-29 20:26:131108 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531109 client_socket_factory_.allocation_count());
1110
Matt Menkec6b3edf72019-03-19 17:00:391111 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1112 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1113 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531114
[email protected]2431756e2010-09-29 20:26:131115 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531116
[email protected]2431756e2010-09-29 20:26:131117 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531118 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131119 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531120
1121 // First 4 requests don't have to wait, and finish in order.
1122 EXPECT_EQ(1, GetOrderOfRequest(1));
1123 EXPECT_EQ(2, GetOrderOfRequest(2));
1124 EXPECT_EQ(3, GetOrderOfRequest(3));
1125 EXPECT_EQ(4, GetOrderOfRequest(4));
1126
1127 // Request ("b", 7) has the highest priority, but we can't make new socket for
1128 // group "b", because it has reached the per-group limit. Then we make
1129 // socket for ("c", 6), because it has higher priority than ("a", 4),
1130 // and we still can't make a socket for group "b".
1131 EXPECT_EQ(5, GetOrderOfRequest(5));
1132 EXPECT_EQ(6, GetOrderOfRequest(6));
1133 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171134
1135 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131136 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531137}
1138
1139// Make sure that we count connecting sockets against the total limit.
1140TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1141 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1142
Matt Menkec6b3edf72019-03-19 17:00:391143 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1144 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1145 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531146
1147 // Create one asynchronous request.
1148 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391149 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1150 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531151
[email protected]6b175382009-10-13 06:47:471152 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1153 // actually become pending until 2ms after they have been created. In order
1154 // to flush all tasks, we need to wait so that we know there are no
1155 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451156 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471157
[email protected]211d21722009-07-22 15:48:531158 // The next synchronous request should wait for its turn.
1159 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391160 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1161 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531162
[email protected]2431756e2010-09-29 20:26:131163 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531164
[email protected]2431756e2010-09-29 20:26:131165 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531166 client_socket_factory_.allocation_count());
1167
1168 EXPECT_EQ(1, GetOrderOfRequest(1));
1169 EXPECT_EQ(2, GetOrderOfRequest(2));
1170 EXPECT_EQ(3, GetOrderOfRequest(3));
1171 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171172 EXPECT_EQ(5, GetOrderOfRequest(5));
1173
1174 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131175 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531176}
1177
[email protected]6427fe22010-04-16 22:27:411178TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1179 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1180 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1181
Matt Menkec6b3edf72019-03-19 17:00:391182 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1183 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1184 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1185 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411186
1187 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1188
1189 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1190
Matt Menkec6b3edf72019-03-19 17:00:391191 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1192 IsError(ERR_IO_PENDING));
1193 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1194 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411195
1196 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1197
[email protected]2431756e2010-09-29 20:26:131198 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411199 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131200 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411201 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131202 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1203 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411204 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1205}
1206
[email protected]d7027bb2010-05-10 18:58:541207TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1208 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1209 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1210
1211 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521212 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501213 EXPECT_EQ(
1214 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281215 handle.Init(TestGroupId("a"), 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 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241221 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521222 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501223 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391224 handles[i].Init(
Matt Menkef09e64c2019-04-23 22:16:281225 TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
1226 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1227 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1228 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541229 }
1230
1231 // One will be stalled, cancel all the handles now.
1232 // This should hit the OnAvailableSocketSlot() code where we previously had
1233 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241234 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541235 handles[i].Reset();
1236}
1237
[email protected]eb5a99382010-07-11 03:18:261238TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1240 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1241
[email protected]eb5a99382010-07-11 03:18:261242 {
1243 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521244 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261245 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkef09e64c2019-04-23 22:16:281246 EXPECT_EQ(OK,
1247 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1248 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1249 ClientSocketPool::RespectLimits::ENABLED,
1250 callbacks[i].callback(),
1251 ClientSocketPool::ProxyAuthCallback(),
1252 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261253 }
1254
1255 // Force a stalled group.
1256 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521257 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201258 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391259 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281260 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1261 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1262 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1263 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261264
1265 // Cancel the stalled request.
1266 stalled_handle.Reset();
1267
1268 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1269 EXPECT_EQ(0, pool_->IdleSocketCount());
1270
1271 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541272 }
1273
[email protected]43a21b82010-06-10 21:30:541274 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1275 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261276}
[email protected]43a21b82010-06-10 21:30:541277
[email protected]eb5a99382010-07-11 03:18:261278TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1279 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1280 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1281
1282 {
1283 ClientSocketHandle handles[kDefaultMaxSockets];
1284 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521285 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201286 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391287 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281288 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391289 ClientSocketPool::RespectLimits::ENABLED,
1290 callback.callback(),
1291 ClientSocketPool::ProxyAuthCallback(),
1292 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261293 }
1294
1295 // Force a stalled group.
1296 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1297 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521298 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201299 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391300 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281301 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1302 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1303 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1304 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261305
1306 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261307 EXPECT_EQ(0u, 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 // Cancel the stalled request.
1314 handles[0].Reset();
1315
[email protected]eb5a99382010-07-11 03:18:261316 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261317 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1318 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1319 TestGroupId("foo")));
1320 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1321 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261322
1323 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011324 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261325
1326 EXPECT_EQ(kDefaultMaxSockets + 1,
1327 client_socket_factory_.allocation_count());
1328 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261329 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1330 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1331 TestGroupId("foo")));
1332 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1333 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261334
1335 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541336 }
1337
[email protected]eb5a99382010-07-11 03:18:261338 EXPECT_EQ(1, pool_->IdleSocketCount());
1339}
[email protected]43a21b82010-06-10 21:30:541340
[email protected]eb5a99382010-07-11 03:18:261341TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1342 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1343 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541344
[email protected]eb5a99382010-07-11 03:18:261345 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521346 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261347 {
[email protected]51fdc7c2012-04-10 19:19:481348 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261349 ClientSocketHandle handles[kDefaultMaxSockets];
1350 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521351 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391352 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281353 OK, handles[i].Init(
1354 TestGroupId(base::StringPrintf("Take 2: %d", i)), params_,
1355 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1356 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1357 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1358 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261359 }
1360
1361 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1362 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481363 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261364
1365 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201366 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391367 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281368 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1369 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1370 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1371 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481372 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261373
1374 // Dropping out of scope will close all handles and return them to idle.
1375 }
[email protected]43a21b82010-06-10 21:30:541376
1377 // But if we wait for it, the released idle sockets will be closed in
1378 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011379 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261380
1381 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1382 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541383}
1384
1385// Regression test for http://crbug.com/40952.
1386TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261387 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1388 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541389 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1390
1391 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1392 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521393 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391394 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281395 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391396 ClientSocketPool::RespectLimits::ENABLED,
1397 callback.callback(),
1398 ClientSocketPool::ProxyAuthCallback(),
1399 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541400 }
1401
1402 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281403 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541404
1405 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1406 // reuse a socket.
1407 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1408 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521409 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541410
1411 // "0" is special here, since it should be the first entry in the sorted map,
1412 // which is the one which we would close an idle socket for. We shouldn't
1413 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391414 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281415 TestGroupId("0"), params_, base::nullopt, DEFAULT_PRIORITY,
1416 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391417 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1418 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541419
1420 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1421 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1422}
1423
[email protected]ab838892009-06-30 18:49:051424TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531425 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091426
Matt Menkec6b3edf72019-03-19 17:00:391427 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1428 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1429 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1430 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1431 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1432 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1433 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1434 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091435
[email protected]2431756e2010-09-29 20:26:131436 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201437 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1438 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131439 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1440 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091441
[email protected]c9d6a1d2009-07-14 16:15:201442 EXPECT_EQ(1, GetOrderOfRequest(1));
1443 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031444 EXPECT_EQ(8, GetOrderOfRequest(3));
1445 EXPECT_EQ(6, GetOrderOfRequest(4));
1446 EXPECT_EQ(4, GetOrderOfRequest(5));
1447 EXPECT_EQ(3, GetOrderOfRequest(6));
1448 EXPECT_EQ(5, GetOrderOfRequest(7));
1449 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171450
1451 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131452 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091453}
1454
[email protected]ab838892009-06-30 18:49:051455TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531456 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091457
Matt Menkec6b3edf72019-03-19 17:00:391458 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1459 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1460 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1461 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1462 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1463 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1464 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091465
[email protected]2431756e2010-09-29 20:26:131466 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091467
[email protected]2431756e2010-09-29 20:26:131468 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011469 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201470
[email protected]2431756e2010-09-29 20:26:131471 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201472 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131473 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1474 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091475}
1476
Matt Menke7eb405e2019-04-25 20:48:211477TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1478 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1479
1480 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1481 ClientSocketHandle handle;
1482 TestCompletionCallback callback;
1483 EXPECT_EQ(
1484 ERR_IO_PENDING,
1485 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1486 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1487 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1488 pool_.get(), NetLogWithSource()));
1489
1490 EXPECT_THAT(callback.WaitForResult(), IsOk());
1491 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1492 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1493 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1494 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1495
1496 handle.ResetAndCloseSocket();
1497 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1498}
1499
Matt Menke99251ea42019-04-25 22:59:021500// This test will start up a socket request and then call Reset() on the handle.
1501// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211502TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531503 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201504
[email protected]ab838892009-06-30 18:49:051505 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131506 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521507 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501508 EXPECT_EQ(
1509 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281510 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1511 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1512 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1513 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131514 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211515 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1516 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1517}
1518
Matt Menke99251ea42019-04-25 22:59:021519// This test will start up a socket request and then call ResetAndCloseSocket()
1520// on the handle. The pending ConnectJob or connected socket should be
1521// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211522TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1523 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1524
Matt Menke99251ea42019-04-25 22:59:021525 // When true, the socket connects before it's canceled.
1526 for (bool cancel_when_callback_pending : {false, true}) {
1527 if (cancel_when_callback_pending) {
1528 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1529 } else {
1530 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1531 }
1532 ClientSocketHandle handle;
1533 TestCompletionCallback callback;
1534 EXPECT_EQ(
1535 ERR_IO_PENDING,
1536 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1537 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1538 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1539 pool_.get(), NetLogWithSource()));
1540 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1541 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1542
1543 if (cancel_when_callback_pending) {
1544 client_socket_factory_.SignalJobs();
1545 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1546 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1547 }
1548
1549 handle.ResetAndCloseSocket();
1550 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1551 }
Matt Menke7eb405e2019-04-25 20:48:211552}
1553
1554TEST_F(ClientSocketPoolBaseTest,
1555 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1556 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1557
Matt Menke99251ea42019-04-25 22:59:021558 // When true, the sockets connect before they're canceled.
1559 for (bool cancel_when_callback_pending : {false, true}) {
1560 if (cancel_when_callback_pending) {
1561 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1562 } else {
1563 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1564 }
Matt Menke7eb405e2019-04-25 20:48:211565
Matt Menke99251ea42019-04-25 22:59:021566 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1567 TestCompletionCallback callback;
1568 // Make |kDefaultMaxSockets + 1| socket requests.
1569 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1570 std::unique_ptr<ClientSocketHandle> handle =
1571 std::make_unique<ClientSocketHandle>();
1572 EXPECT_EQ(ERR_IO_PENDING,
1573 handle->Init(
1574 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1575 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1576 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1577 pool_.get(), NetLogWithSource()));
1578 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211579 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021580 EXPECT_EQ(
1581 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1582 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1583 }
1584
1585 if (cancel_when_callback_pending) {
1586 client_socket_factory_.SignalJobs();
1587 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1588 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1589 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1590 }
1591
1592 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1593 // or close a socket, since there are more requests than ConnectJobs or
1594 // sockets.
1595 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1596 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1597 if (cancel_when_callback_pending) {
1598 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1599 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1600 } else {
1601 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211602 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1603 }
Matt Menke99251ea42019-04-25 22:59:021604
1605 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1606 // or close a socket.
1607 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1608 handles[i]->ResetAndCloseSocket();
1609 if (i > 0) {
1610 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1611 if (cancel_when_callback_pending) {
1612 EXPECT_EQ(i,
1613 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1614 } else {
1615 EXPECT_EQ(static_cast<size_t>(i),
1616 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1617 }
1618 } else {
1619 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1620 }
1621 }
Matt Menke7eb405e2019-04-25 20:48:211622 }
[email protected]f6d1d6eb2009-06-24 20:16:091623}
1624
[email protected]ab838892009-06-30 18:49:051625TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531626 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201627
[email protected]ab838892009-06-30 18:49:051628 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061629 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521630 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091631
Matt Menke28ac03e2019-02-25 22:25:501632 EXPECT_EQ(
1633 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281634 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1635 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1636 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1637 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091638
1639 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211640 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1641 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091642
Matt Menke7eb405e2019-04-25 20:48:211643 // This will create a second ConnectJob, since the other ConnectJob was
1644 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521645 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501646 EXPECT_EQ(
1647 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281648 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1649 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501650 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1651 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091652
Matt Menke7eb405e2019-04-25 20:48:211653 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1654 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1655
robpercival214763f2016-07-01 23:27:011656 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091657 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211658 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1659 // One ConnectJob completed, and its socket is now assigned to |handle|.
1660 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1661 // The other ConnectJob should have either completed, or still be connecting.
1662 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1663 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091664
1665 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211666 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1667 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1668 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1669 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091670}
1671
[email protected]ab838892009-06-30 18:49:051672TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531673 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091674
Matt Menkec6b3edf72019-03-19 17:00:391675 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1676 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1677 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1678 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1679 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1680 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1681 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091682
1683 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201684 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131685 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1686 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091687
[email protected]2431756e2010-09-29 20:26:131688 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091689
[email protected]c9d6a1d2009-07-14 16:15:201690 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1691 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131692 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1693 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091694
[email protected]c9d6a1d2009-07-14 16:15:201695 EXPECT_EQ(1, GetOrderOfRequest(1));
1696 EXPECT_EQ(2, GetOrderOfRequest(2));
1697 EXPECT_EQ(5, GetOrderOfRequest(3));
1698 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131699 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1700 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201701 EXPECT_EQ(4, GetOrderOfRequest(6));
1702 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171703
1704 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131705 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091706}
1707
mmenke33d24423d2015-05-19 19:41:091708// Function to be used as a callback on socket request completion. It first
1709// disconnects the successfully connected socket from the first request, and
1710// then reuses the ClientSocketHandle to request another socket.
1711//
1712// |nested_callback| is called with the result of the second socket request.
1713void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261714 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091715 TestConnectJobFactory* test_connect_job_factory,
1716 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411717 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091718 int first_request_result) {
robpercival214763f2016-07-01 23:27:011719 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091720
1721 test_connect_job_factory->set_job_type(next_job_type);
1722
1723 // Don't allow reuse of the socket. Disconnect it and then release it.
1724 if (handle->socket())
1725 handle->socket()->Disconnect();
1726 handle->Reset();
1727
mmenke33d24423d2015-05-19 19:41:091728 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501729 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031730 TestGroupId("a"),
Matt Menkef09e64c2019-04-23 22:16:281731 ClientSocketPool::SocketParams::CreateForHttpForTesting(), base::nullopt,
1732 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031733 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1734 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091735 if (rv != ERR_IO_PENDING) {
1736 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411737 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091738 } else {
1739 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521740 }
mmenke33d24423d2015-05-19 19:41:091741}
[email protected]f6d1d6eb2009-06-24 20:16:091742
mmenke33d24423d2015-05-19 19:41:091743// Tests the case where a second socket is requested in a completion callback,
1744// and the second socket connects asynchronously. Reuses the same
1745// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581746TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201748
[email protected]0b7648c2009-07-06 20:14:011749 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061750 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091751 TestCompletionCallback second_result_callback;
1752 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281753 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541754 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501755 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1756 connect_job_factory_, TestConnectJob::kMockPendingJob,
1757 &second_result_callback),
1758 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011759 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091760
robpercival214763f2016-07-01 23:27:011761 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581762}
[email protected]f6d1d6eb2009-06-24 20:16:091763
mmenke33d24423d2015-05-19 19:41:091764// Tests the case where a second socket is requested in a completion callback,
1765// and the second socket connects synchronously. Reuses the same
1766// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581767TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531768 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201769
[email protected]0b7648c2009-07-06 20:14:011770 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061771 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091772 TestCompletionCallback second_result_callback;
1773 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281774 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541775 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501776 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1777 connect_job_factory_, TestConnectJob::kMockPendingJob,
1778 &second_result_callback),
1779 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011780 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581781
robpercival214763f2016-07-01 23:27:011782 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091783}
1784
1785// Make sure that pending requests get serviced after active requests get
1786// cancelled.
[email protected]ab838892009-06-30 18:49:051787TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531788 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201789
[email protected]0b7648c2009-07-06 20:14:011790 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091791
Matt Menkec6b3edf72019-03-19 17:00:391792 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));
1796 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1797 IsError(ERR_IO_PENDING));
1798 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1799 IsError(ERR_IO_PENDING));
1800 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1801 IsError(ERR_IO_PENDING));
1802 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1803 IsError(ERR_IO_PENDING));
1804 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1805 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091806
[email protected]c9d6a1d2009-07-14 16:15:201807 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1808 // Let's cancel them.
1809 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131810 ASSERT_FALSE(request(i)->handle()->is_initialized());
1811 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091812 }
1813
[email protected]f6d1d6eb2009-06-24 20:16:091814 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131815 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011816 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131817 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091818 }
1819
[email protected]2431756e2010-09-29 20:26:131820 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1821 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091822}
1823
1824// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051825TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531826 const size_t kMaxSockets = 5;
1827 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201828
[email protected]0b7648c2009-07-06 20:14:011829 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091830
[email protected]211d21722009-07-22 15:48:531831 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1832 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091833
1834 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531835 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391836 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1837 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091838
[email protected]211d21722009-07-22 15:48:531839 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011840 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091841}
1842
mmenke9d72fe42017-05-18 22:36:071843// Make sure that pending requests that complete synchronously get serviced
1844// after active requests fail. See https://crbug.com/723748
1845TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1846 const size_t kNumberOfRequests = 10;
1847 const size_t kMaxSockets = 1;
1848 CreatePool(kMaxSockets, kMaxSockets);
1849
1850 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1851
Matt Menkec6b3edf72019-03-19 17:00:391852 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1853 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071854
1855 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1856
1857 // Queue up all the other requests
1858 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391859 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1860 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071861
1862 // Make sure all requests fail, instead of hanging.
1863 for (size_t i = 0; i < kNumberOfRequests; ++i)
1864 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1865}
1866
[email protected]5fc08e32009-07-15 17:09:571867TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531868 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571869
1870 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1871
[email protected]2431756e2010-09-29 20:26:131872 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521873 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501874 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281875 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501876 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1877 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011878 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571879
1880 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131881 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571882
Matt Menkef09e64c2019-04-23 22:16:281883 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1884 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501885 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1886 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011887 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1888 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571889
[email protected]2431756e2010-09-29 20:26:131890 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481891 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571892 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1893}
1894
xunjieli26619e72016-11-23 19:39:551895TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551896 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1897 ClientSocketHandle handle;
1898 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141899 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501900 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281901 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501902 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1903 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551904 EXPECT_THAT(rv, IsOk());
1905 handle.Reset();
1906 EXPECT_EQ(1, pool_->IdleSocketCount());
1907 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551908}
1909
xunjieli92feb332017-03-03 17:19:231910TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231911 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1912 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141913 RecordingBoundTestNetLog log;
xunjieli92feb332017-03-03 17:19:231914 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501915 int rv = handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:281916 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501917 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1918 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231919 EXPECT_THAT(rv, IsOk());
1920 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281921 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1922 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501923 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1924 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231925 ClientSocketHandle handle3;
Matt Menkef09e64c2019-04-23 22:16:281926 rv = handle3.Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
1927 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501928 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1929 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231930 EXPECT_THAT(rv, IsOk());
1931 handle1.Reset();
1932 handle2.Reset();
1933 handle3.Reset();
1934 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391935 pool_->CloseIdleSocketsInGroup(TestGroupId("a"));
xunjieli92feb332017-03-03 17:19:231936 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231937}
1938
xunjieli26619e72016-11-23 19:39:551939TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551940 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1941 ClientSocketHandle handle;
1942 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141943 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501944 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281945 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501946 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1947 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551948 EXPECT_THAT(rv, IsOk());
1949 StreamSocket* socket = handle.socket();
1950 handle.Reset();
1951 EXPECT_EQ(1, pool_->IdleSocketCount());
1952
1953 // Disconnect socket now to make the socket unusable.
1954 socket->Disconnect();
1955 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281956 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1957 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501958 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1959 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551960 EXPECT_THAT(rv, IsOk());
1961 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551962}
1963
[email protected]2b7523d2009-07-29 20:29:231964// Regression test for http://crbug.com/17985.
1965TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1966 const int kMaxSockets = 3;
1967 const int kMaxSocketsPerGroup = 2;
1968 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1969
[email protected]ac790b42009-12-02 04:31:311970 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231971
Matt Menkec6b3edf72019-03-19 17:00:391972 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1973 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231974
1975 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:391976 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1977 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231978
1979 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:391980 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231981
1982 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:391983 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1984 IsError(ERR_IO_PENDING));
1985 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1986 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231987
Matt Menkec6b3edf72019-03-19 17:00:391988 // Release the first two sockets from TestGroupId("a"). Because this is a
1989 // keepalive, the first release will unblock the pending request for
1990 // TestGroupId("a"). The second release will unblock a request for "c",
1991 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:131992 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1993 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231994
1995 // Closing idle sockets should not get us into trouble, but in the bug
1996 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:391997 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]43a21b82010-06-10 21:30:541998 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261999
[email protected]2da659e2013-05-23 20:51:342000 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282001 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232002}
2003
[email protected]4d3b05d2010-01-27 21:27:292004TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532005 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572006
2007 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132008 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522009 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142010 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502011 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282012 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502013 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2014 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012015 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392016 EXPECT_EQ(LOAD_STATE_CONNECTING,
2017 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482018 TestLoadTimingInfoNotConnected(handle);
2019
robpercival214763f2016-07-01 23:27:012020 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132021 EXPECT_TRUE(handle.is_initialized());
2022 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482023 TestLoadTimingInfoConnectedNotReused(handle);
2024
[email protected]2431756e2010-09-29 20:26:132025 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482026 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302027
Eric Roman79cc7552019-07-19 02:17:542028 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402029
Matt Menke9fa17d52019-03-25 19:12:262030 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172031 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262032 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002033 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262034 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2035 EXPECT_TRUE(LogContainsEvent(
2036 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2037 NetLogEventPhase::NONE));
2038 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002039 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2040 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262041 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572042}
2043
[email protected]4d3b05d2010-01-27 21:27:292044TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572045 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532046 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572047
2048 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132049 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522050 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142051 RecordingBoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182052 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132053 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512054 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502055 EXPECT_EQ(
2056 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282057 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2058 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2059 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2060 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392061 EXPECT_EQ(LOAD_STATE_CONNECTING,
2062 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012063 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132064 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512065 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302066
Eric Roman79cc7552019-07-19 02:17:542067 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402068
Matt Menke9fa17d52019-03-25 19:12:262069 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172070 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262071 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002072 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262073 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2074 EXPECT_TRUE(LogContainsEvent(
2075 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2076 NetLogEventPhase::NONE));
2077 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572078}
2079
mmenke6be122f2015-03-09 22:22:472080// Check that an async ConnectJob failure does not result in creation of a new
2081// ConnectJob when there's another pending request also waiting on its own
2082// ConnectJob. See http://crbug.com/463960.
2083TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2084 CreatePool(2, 2);
2085 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2086
Matt Menkec6b3edf72019-03-19 17:00:392087 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2088 IsError(ERR_IO_PENDING));
2089 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2090 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472091
robpercival214763f2016-07-01 23:27:012092 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2093 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472094
2095 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2096}
2097
[email protected]4d3b05d2010-01-27 21:27:292098TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102099 // TODO(eroman): Add back the log expectations! Removed them because the
2100 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532101 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572102
2103 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132104 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522105 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132106 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522107 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572108
Matt Menke28ac03e2019-02-25 22:25:502109 EXPECT_EQ(
2110 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282111 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2112 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2113 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2114 pool_.get(), NetLogWithSource()));
Matt Muellerd9342e3a2019-11-26 01:41:142115 RecordingBoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202116 EXPECT_EQ(
2117 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282118 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2119 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502120 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2121 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572122
[email protected]2431756e2010-09-29 20:26:132123 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572124
[email protected]fd7b7c92009-08-20 19:38:302125
2126 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302127
robpercival214763f2016-07-01 23:27:012128 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132129 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302130
2131 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532132 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572133}
2134
[email protected]4d3b05d2010-01-27 21:27:292135TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342136 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2137
[email protected]17a0c6c2009-08-04 00:07:042138 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2139
Matt Menkec6b3edf72019-03-19 17:00:392140 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2141 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2142 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2143 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342144
Raul Tambre8335a6d2019-02-21 16:57:432145 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262146 static_cast<int>(
2147 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132148 (*requests())[2]->handle()->Reset();
2149 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432150 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262151 static_cast<int>(
2152 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342153
[email protected]2431756e2010-09-29 20:26:132154 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432155 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262156 static_cast<int>(
2157 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342158
[email protected]2431756e2010-09-29 20:26:132159 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432160 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262161 static_cast<int>(
2162 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342163}
2164
[email protected]5fc08e32009-07-15 17:09:572165// When requests and ConnectJobs are not coupled, the request will get serviced
2166// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292167TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532168 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572169
2170 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322171 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572172
[email protected]2431756e2010-09-29 20:26:132173 std::vector<TestSocketRequest*> request_order;
2174 size_t completion_count; // unused
2175 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502176 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282177 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502178 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2179 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012180 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2181 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572182
2183 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2184 // without a job.
2185 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2186
[email protected]2431756e2010-09-29 20:26:132187 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502188 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282189 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502190 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2191 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012192 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132193 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502194 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282195 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502196 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2197 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012198 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572199
2200 // Both Requests 2 and 3 are pending. We release socket 1 which should
2201 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332202 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342203 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282204 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332205 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012206 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332207 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572208
2209 // Signal job 2, which should service request 3.
2210
2211 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012212 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572213
Raul Tambre8335a6d2019-02-21 16:57:432214 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132215 EXPECT_EQ(&req1, request_order[0]);
2216 EXPECT_EQ(&req2, request_order[1]);
2217 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392218 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572219}
2220
2221// The requests are not coupled to the jobs. So, the requests should finish in
2222// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292223TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532224 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572225 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322226 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572227
[email protected]2431756e2010-09-29 20:26:132228 std::vector<TestSocketRequest*> request_order;
2229 size_t completion_count; // unused
2230 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502231 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282232 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502233 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2234 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012235 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572236
[email protected]2431756e2010-09-29 20:26:132237 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502238 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282239 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502240 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2241 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012242 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572243
2244 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322245 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572246
[email protected]2431756e2010-09-29 20:26:132247 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502248 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282249 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502250 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2251 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012252 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572253
robpercival214763f2016-07-01 23:27:012254 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2255 EXPECT_THAT(req2.WaitForResult(), IsOk());
2256 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572257
Raul Tambre8335a6d2019-02-21 16:57:432258 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132259 EXPECT_EQ(&req1, request_order[0]);
2260 EXPECT_EQ(&req2, request_order[1]);
2261 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572262}
2263
[email protected]03b7c8c2013-07-20 04:38:552264// Test GetLoadState in the case there's only one socket request.
2265TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532266 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552267 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572268
[email protected]2431756e2010-09-29 20:26:132269 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522270 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502271 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282272 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502273 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2274 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012275 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552276 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572277
[email protected]03b7c8c2013-07-20 04:38:552278 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2279 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2280
2281 // No point in completing the connection, since ClientSocketHandles only
2282 // expect the LoadState to be checked while connecting.
2283}
2284
2285// Test GetLoadState in the case there are two socket requests.
2286TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2287 CreatePool(2, 2);
2288 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2289
2290 ClientSocketHandle handle;
2291 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502292 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282293 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502294 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2295 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012296 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002297 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2298
2299 ClientSocketHandle handle2;
2300 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282301 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2302 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502303 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2304 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012305 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002306 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2307
Matt Menke4b69f932019-03-04 16:20:012308 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002309 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2310 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2311
Matt Menke4b69f932019-03-04 16:20:012312 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002313 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2314
Matt Menke4b69f932019-03-04 16:20:012315 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002316 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002317 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012318
2319 // Update the state of the second job.
2320 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2321
2322 // Only the state of the second request should have changed.
2323 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2324 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2325
2326 // Second job connects and the first request gets the socket. The
2327 // second handle switches to the state of the remaining ConnectJob.
2328 client_socket_factory_.SignalJob(1);
2329 EXPECT_THAT(callback.WaitForResult(), IsOk());
2330 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552331}
2332
2333// Test GetLoadState in the case the per-group limit is reached.
2334TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2335 CreatePool(2, 1);
2336 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2337
2338 ClientSocketHandle handle;
2339 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502340 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282341 TestGroupId("a"), params_, base::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502342 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2343 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012344 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552345 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2346
2347 // Request another socket from the same pool, buth with a higher priority.
2348 // The first request should now be stalled at the socket group limit.
2349 ClientSocketHandle handle2;
2350 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282351 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
2352 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502353 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2354 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012355 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552356 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2357 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2358
2359 // The first handle should remain stalled as the other socket goes through
2360 // the connect process.
2361
2362 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2363 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2364 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2365
2366 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012367 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552368 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2369
2370 // Closing the second socket should cause the stalled handle to finally get a
2371 // ConnectJob.
2372 handle2.socket()->Disconnect();
2373 handle2.Reset();
2374 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2375}
2376
2377// Test GetLoadState in the case the per-pool limit is reached.
2378TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2379 CreatePool(2, 2);
2380 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2381
2382 ClientSocketHandle handle;
2383 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502384 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282385 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502386 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2387 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012388 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552389
2390 // Request for socket from another pool.
2391 ClientSocketHandle handle2;
2392 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282393 rv = handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
2394 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502395 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2396 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012397 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552398
2399 // Request another socket from the first pool. Request should stall at the
2400 // socket pool limit.
2401 ClientSocketHandle handle3;
2402 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282403 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2404 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502405 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2406 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012407 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552408
2409 // The third handle should remain stalled as the other sockets in its group
2410 // goes through the connect process.
2411
2412 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2413 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2414
2415 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2416 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2417 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2418
2419 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012420 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552421 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2422
2423 // Closing a socket should allow the stalled handle to finally get a new
2424 // ConnectJob.
2425 handle.socket()->Disconnect();
2426 handle.Reset();
2427 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572428}
2429
Matt Menkeb57663b32019-03-01 17:17:102430TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132431 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102432 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132433
[email protected]2431756e2010-09-29 20:26:132434 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522435 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502436 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102437 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkef09e64c2019-04-23 22:16:282438 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2439 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2440 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2441 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132442 EXPECT_TRUE(handle.is_initialized());
2443 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132444}
2445
Matt Menkeb57663b32019-03-01 17:17:102446TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132447 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2448
Matt Menkeb57663b32019-03-01 17:17:102449 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132450 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522451 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502452 EXPECT_EQ(
2453 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282454 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2455 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2456 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2457 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392458 EXPECT_EQ(LOAD_STATE_CONNECTING,
2459 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102460 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132461 EXPECT_TRUE(handle.is_initialized());
2462 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132463}
2464
[email protected]e60e47a2010-07-14 03:37:182465TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2466 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2467 connect_job_factory_->set_job_type(
2468 TestConnectJob::kMockAdditionalErrorStateJob);
2469
[email protected]2431756e2010-09-29 20:26:132470 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522471 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502472 EXPECT_EQ(
2473 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:282474 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2475 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2476 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2477 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132478 EXPECT_FALSE(handle.is_initialized());
2479 EXPECT_FALSE(handle.socket());
2480 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512481 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182482}
2483
2484TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2485 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2486
2487 connect_job_factory_->set_job_type(
2488 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132489 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522490 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502491 EXPECT_EQ(
2492 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282493 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2494 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2495 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2496 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392497 EXPECT_EQ(LOAD_STATE_CONNECTING,
2498 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012499 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132500 EXPECT_FALSE(handle.is_initialized());
2501 EXPECT_FALSE(handle.socket());
2502 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512503 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182504}
2505
martijn003cd612016-05-19 22:24:382506// Make sure we can reuse sockets.
2507TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412508 CreatePoolWithIdleTimeouts(
2509 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032510 base::TimeDelta(), // Time out unused sockets immediately.
2511 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2512
2513 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2514
2515 ClientSocketHandle handle;
2516 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502517 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282518 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502519 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2520 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012521 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392522 EXPECT_EQ(LOAD_STATE_CONNECTING,
2523 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012524 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032525
2526 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352527 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382528 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482529 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032530 handle.Reset();
2531
2532 // Should now have one idle socket.
2533 ASSERT_EQ(1, pool_->IdleSocketCount());
2534
2535 // Request a new socket. This should reuse the old socket and complete
2536 // synchronously.
Matt Muellerd9342e3a2019-11-26 01:41:142537 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502538 rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282539 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502540 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2541 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012542 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032543 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482544 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032545
Matt Menke9fa17d52019-03-25 19:12:262546 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392547 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262548 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032549
Eric Roman79cc7552019-07-19 02:17:542550 auto entries = log.GetEntries();
Matt Menke9fa17d52019-03-25 19:12:262551 EXPECT_TRUE(LogContainsEvent(
2552 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2553 NetLogEventPhase::NONE));
2554 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032555 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262556 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032557}
2558
martijn003cd612016-05-19 22:24:382559// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172560TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032561 CreatePoolWithIdleTimeouts(
2562 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2563 base::TimeDelta(), // Time out unused sockets immediately
2564 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412565
2566 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2567
2568 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2569
2570 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522571 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502572 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282573 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502574 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2575 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012576 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392577 EXPECT_EQ(LOAD_STATE_CONNECTING,
2578 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412579
2580 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522581 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282582 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2583 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502584 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2585 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012586 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392587 EXPECT_EQ(LOAD_STATE_CONNECTING,
2588 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412589
2590 // Cancel one of the requests. Wait for the other, which will get the first
2591 // job. Release the socket. Run the loop again to make sure the second
2592 // socket is sitting idle and the first one is released (since ReleaseSocket()
2593 // just posts a DoReleaseSocket() task).
2594
2595 handle.Reset();
robpercival214763f2016-07-01 23:27:012596 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412597 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352598 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382599 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412600 handle2.Reset();
2601
[email protected]e7b1c6d2c2012-05-05 00:54:032602 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2603 // actually become pending until 2ms after they have been created. In order
2604 // to flush all tasks, we need to wait so that we know there are no
2605 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452606 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412607
[email protected]e7b1c6d2c2012-05-05 00:54:032608 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412609 ASSERT_EQ(2, pool_->IdleSocketCount());
2610
2611 // Request a new socket. This should cleanup the unused and timed out ones.
2612 // A new socket will be created rather than reusing the idle one.
Matt Muellerd9342e3a2019-11-26 01:41:142613 RecordingBoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522614 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282615 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2616 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502617 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2618 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012619 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2620 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412621 EXPECT_FALSE(handle.is_reused());
2622
[email protected]e7b1c6d2c2012-05-05 00:54:032623 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262624 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392625 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262626 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412627
Eric Roman79cc7552019-07-19 02:17:542628 auto entries = log.GetEntries();
[email protected]64770b7d2011-11-16 04:30:412629 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002630 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412631}
2632
[email protected]2041cf342010-02-19 03:15:592633// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162634// because of multiple releasing disconnected sockets.
2635TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2636 CreatePoolWithIdleTimeouts(
2637 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2638 base::TimeDelta(), // Time out unused sockets immediately.
2639 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2640
2641 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2642
2643 // Startup 4 connect jobs. Two of them will be pending.
2644
[email protected]2431756e2010-09-29 20:26:132645 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522646 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502647 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282648 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502649 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2650 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012651 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162652
[email protected]2431756e2010-09-29 20:26:132653 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522654 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282655 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2656 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502657 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2658 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012659 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162660
[email protected]2431756e2010-09-29 20:26:132661 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522662 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282663 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2664 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502665 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2666 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012667 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162668
[email protected]2431756e2010-09-29 20:26:132669 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522670 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:282671 rv = handle4.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2672 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502673 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2674 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012675 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162676
2677 // Release two disconnected sockets.
2678
[email protected]2431756e2010-09-29 20:26:132679 handle.socket()->Disconnect();
2680 handle.Reset();
2681 handle2.socket()->Disconnect();
2682 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162683
robpercival214763f2016-07-01 23:27:012684 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132685 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012686 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132687 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162688}
2689
[email protected]d7027bb2010-05-10 18:58:542690// Regression test for http://crbug.com/42267.
2691// When DoReleaseSocket() is processed for one socket, it is blocked because the
2692// other stalled groups all have releasing sockets, so no progress can be made.
2693TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2694 CreatePoolWithIdleTimeouts(
2695 4 /* socket limit */, 4 /* socket limit per group */,
2696 base::TimeDelta(), // Time out unused sockets immediately.
2697 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2698
2699 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2700
2701 // Max out the socket limit with 2 per group.
2702
[email protected]2431756e2010-09-29 20:26:132703 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522704 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132705 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522706 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542707
2708 for (int i = 0; i < 2; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282709 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, base::nullopt,
2710 LOWEST, SocketTag(),
2711 ClientSocketPool::RespectLimits::ENABLED,
2712 callback_a[i].callback(),
2713 ClientSocketPool::ProxyAuthCallback(),
2714 pool_.get(), NetLogWithSource()));
2715 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, base::nullopt,
2716 LOWEST, SocketTag(),
2717 ClientSocketPool::RespectLimits::ENABLED,
2718 callback_b[i].callback(),
2719 ClientSocketPool::ProxyAuthCallback(),
2720 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542721 }
[email protected]b89f7e42010-05-20 20:37:002722
[email protected]d7027bb2010-05-10 18:58:542723 // Make 4 pending requests, 2 per group.
2724
2725 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282726 EXPECT_EQ(
2727 ERR_IO_PENDING,
2728 handle_a[i].Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2729 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2730 callback_a[i].callback(),
2731 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2732 NetLogWithSource()));
2733 EXPECT_EQ(
2734 ERR_IO_PENDING,
2735 handle_b[i].Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
2736 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2737 callback_b[i].callback(),
2738 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2739 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542740 }
2741
2742 // Release b's socket first. The order is important, because in
2743 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2744 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2745 // first, which has a releasing socket, so it refuses to start up another
2746 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132747 handle_b[0].socket()->Disconnect();
2748 handle_b[0].Reset();
2749 handle_a[0].socket()->Disconnect();
2750 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542751
2752 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282753 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542754
[email protected]2431756e2010-09-29 20:26:132755 handle_b[1].socket()->Disconnect();
2756 handle_b[1].Reset();
2757 handle_a[1].socket()->Disconnect();
2758 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542759
2760 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012761 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2762 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542763 }
2764}
2765
[email protected]fd4fe0b2010-02-08 23:02:152766TEST_F(ClientSocketPoolBaseTest,
2767 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2768 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2769
2770 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2771
Matt Menkec6b3edf72019-03-19 17:00:392772 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2773 IsError(ERR_IO_PENDING));
2774 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2775 IsError(ERR_IO_PENDING));
2776 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2777 IsError(ERR_IO_PENDING));
2778 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2779 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152780
robpercival214763f2016-07-01 23:27:012781 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2782 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132783 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152784
2785 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132786 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012787 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152788
[email protected]2431756e2010-09-29 20:26:132789 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012790 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132791 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152792
2793 EXPECT_EQ(1, GetOrderOfRequest(1));
2794 EXPECT_EQ(2, GetOrderOfRequest(2));
2795 EXPECT_EQ(3, GetOrderOfRequest(3));
2796 EXPECT_EQ(4, GetOrderOfRequest(4));
2797
2798 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132799 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152800}
2801
[email protected]6ecf2b92011-12-15 01:14:522802class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042803 public:
Matt Menke9fa17d52019-03-25 19:12:262804 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132805 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182806 bool reset_releasing_handle)
2807 : pool_(pool),
2808 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042809 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522810
Chris Watkins7a41d3552017-12-01 02:13:272811 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042812
2813 ClientSocketHandle* handle() { return &handle_; }
2814
Bence Béky8ddc2492018-06-13 01:02:042815 CompletionOnceCallback callback() {
2816 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2817 base::Unretained(this));
2818 }
[email protected]4f1e4982010-03-02 18:31:042819
2820 private:
[email protected]6ecf2b92011-12-15 01:14:522821 void OnComplete(int result) {
2822 SetResult(result);
2823 if (reset_releasing_handle_)
2824 handle_.Reset();
2825
Matt Menkec6b3edf72019-03-19 17:00:392826 EXPECT_EQ(
2827 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032828 handle2_.Init(
2829 TestGroupId("a"),
2830 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:282831 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032832 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2833 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522834 }
2835
Matt Menke9fa17d52019-03-25 19:12:262836 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182837 int expected_result_;
2838 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042839 ClientSocketHandle handle_;
2840 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042841};
2842
[email protected]e60e47a2010-07-14 03:37:182843
2844TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2846
Matt Menkec6b3edf72019-03-19 17:00:392847 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2848 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2849 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182850
[email protected]2431756e2010-09-29 20:26:132851 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182852 client_socket_factory_.allocation_count());
2853
2854 connect_job_factory_->set_job_type(
2855 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2856 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282857 EXPECT_EQ(ERR_IO_PENDING,
2858 req.handle()->Init(
2859 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2860 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2861 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2862 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182863 // The next job should complete synchronously
2864 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2865
robpercival214763f2016-07-01 23:27:012866 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182867 EXPECT_FALSE(req.handle()->is_initialized());
2868 EXPECT_FALSE(req.handle()->socket());
2869 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512870 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182871}
2872
[email protected]b6501d3d2010-06-03 23:53:342873// http://crbug.com/44724 regression test.
2874// We start releasing the pool when we flush on network change. When that
2875// happens, the only active references are in the ClientSocketHandles. When a
2876// ConnectJob completes and calls back into the last ClientSocketHandle, that
2877// callback can release the last reference and delete the pool. After the
2878// callback finishes, we go back to the stack frame within the now-deleted pool.
2879// Executing any code that refers to members of the now-deleted pool can cause
2880// crashes.
2881TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2882 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2883 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2884
2885 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522886 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502887 EXPECT_EQ(
2888 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282889 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2890 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2891 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2892 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342893
[email protected]7af985a2012-12-14 22:40:422894 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342895
2896 // We'll call back into this now.
2897 callback.WaitForResult();
2898}
2899
[email protected]a7e38572010-06-07 18:22:242900TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2901 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2902 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2903
2904 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522905 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502906 EXPECT_EQ(
2907 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282908 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2909 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2910 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2911 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012912 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242913 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2914
[email protected]7af985a2012-12-14 22:40:422915 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242916
2917 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282918 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242919
Matt Menke28ac03e2019-02-25 22:25:502920 EXPECT_EQ(
2921 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282922 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2923 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2924 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2925 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012926 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242927 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2928}
2929
[email protected]6ecf2b92011-12-15 01:14:522930class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142931 public:
Matt Menke9fa17d52019-03-25 19:12:262932 ConnectWithinCallback(
2933 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:192934 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:262935 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:392936 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142937
Chris Watkins7a41d3552017-12-01 02:13:272938 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142939
2940 int WaitForNestedResult() {
2941 return nested_callback_.WaitForResult();
2942 }
2943
Bence Béky8ddc2492018-06-13 01:02:042944 CompletionOnceCallback callback() {
2945 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2946 base::Unretained(this));
2947 }
[email protected]6ecf2b92011-12-15 01:14:522948
[email protected]06f92462010-08-31 19:24:142949 private:
[email protected]6ecf2b92011-12-15 01:14:522950 void OnComplete(int result) {
2951 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:282952 EXPECT_EQ(
2953 ERR_IO_PENDING,
2954 handle_.Init(group_id_, params_, base::nullopt, DEFAULT_PRIORITY,
2955 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2956 nested_callback_.callback(),
2957 ClientSocketPool::ProxyAuthCallback(), pool_,
2958 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522959 }
2960
Matt Menkec6b3edf72019-03-19 17:00:392961 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:192962 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:262963 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142964 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522965 TestCompletionCallback nested_callback_;
2966
2967 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142968};
2969
2970TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2971 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2972
2973 // First job will be waiting until it gets aborted.
2974 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2975
2976 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:392977 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502978 EXPECT_EQ(
2979 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282980 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2981 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2982 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2983 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142984
2985 // Second job will be started during the first callback, and will
2986 // asynchronously complete with OK.
2987 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422988 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012989 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2990 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142991}
2992
Matt Menke141b87f22019-01-30 02:43:032993TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:262994 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2995 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032996
2997 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2998 ClientSocketHandle handle;
2999 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503000 EXPECT_EQ(
3001 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283002 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3003 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3004 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3005 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033006 // The backup timer fires but doesn't start a new ConnectJob while resolving
3007 // the hostname.
3008 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3009 FastForwardBy(base::TimeDelta::FromMilliseconds(
3010 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3011 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3012
3013 // Once the ConnectJob has finished resolving the hostname, the backup timer
3014 // will create a ConnectJob when it fires.
3015 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3016 FastForwardBy(base::TimeDelta::FromMilliseconds(
3017 ClientSocketPool::kMaxConnectRetryIntervalMs));
3018 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3019}
3020
3021// Test that no backup socket is created when a ConnectJob connects before it
3022// completes.
3023TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263024 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3025 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033026
3027 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3028 ClientSocketHandle handle;
3029 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503030 EXPECT_EQ(
3031 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283032 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3033 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3034 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3035 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033036 // The backup timer fires but doesn't start a new ConnectJob while resolving
3037 // the hostname.
3038 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3039 FastForwardBy(base::TimeDelta::FromMilliseconds(
3040 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3041 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3042
3043 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3044 client_socket_factory_.SetJobHasEstablishedConnection(0);
3045 FastForwardBy(base::TimeDelta::FromMilliseconds(
3046 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3047 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3048}
3049
[email protected]25eea382010-07-10 23:55:263050// Cancel a pending socket request while we're at max sockets,
3051// and verify that the backup socket firing doesn't cause a crash.
3052TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3053 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263054 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3055 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263056
[email protected]4baaf9d2010-08-31 15:15:443057 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3058 // timer.
[email protected]25eea382010-07-10 23:55:263059 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3060 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523061 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503062 EXPECT_EQ(
3063 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283064 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3065 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3066 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3067 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263068
3069 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3070 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3071 ClientSocketHandle handles[kDefaultMaxSockets];
3072 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:523073 TestCompletionCallback callback;
Matt Menkef09e64c2019-04-23 22:16:283074 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, base::nullopt,
3075 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203076 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503077 callback.callback(),
3078 ClientSocketPool::ProxyAuthCallback(),
3079 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263080 }
3081
fdoray5eeb7642016-06-22 16:11:283082 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263083
3084 // Cancel the pending request.
3085 handle.Reset();
3086
3087 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453088 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003089 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263090
[email protected]25eea382010-07-10 23:55:263091 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3092}
3093
[email protected]3f00be82010-09-27 19:50:023094TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263095 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3096 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443097
3098 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3099 // timer.
3100 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3101 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523102 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503103 EXPECT_EQ(
3104 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283105 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3106 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3107 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3108 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263109 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3110 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3111 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3112 TestGroupId("bar")));
3113 EXPECT_EQ(
3114 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443115
3116 // Cancel the socket request. This should cancel the backup timer. Wait for
3117 // the backup time to see if it indeed got canceled.
3118 handle.Reset();
3119 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453120 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003121 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263122 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3123 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443124}
3125
[email protected]3f00be82010-09-27 19:50:023126TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263127 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3128 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023129
3130 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3131 // timer.
3132 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3133 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523134 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503135 EXPECT_EQ(
3136 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283137 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3138 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3139 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3140 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023141 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3142 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523143 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203144 EXPECT_EQ(
3145 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283146 handle2.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3147 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503148 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3149 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263150 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3151 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023152
3153 // Cancel request 1 and then complete request 2. With the requests finished,
3154 // the backup timer should be cancelled.
3155 handle.Reset();
robpercival214763f2016-07-01 23:27:013156 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023157 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453158 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003159 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023160}
3161
[email protected]eb5a99382010-07-11 03:18:263162// Test delayed socket binding for the case where we have two connects,
3163// and while one is waiting on a connect, the other frees up.
3164// The socket waiting on a connect should switch immediately to the freed
3165// up socket.
3166TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3167 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3168 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3169
3170 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523171 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503172 EXPECT_EQ(
3173 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283174 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3175 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503176 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3177 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013178 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263179
3180 // No idle sockets, no pending jobs.
3181 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263182 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263183
3184 // Create a second socket to the same host, but this one will wait.
3185 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3186 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503187 EXPECT_EQ(
3188 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283189 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3190 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503191 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3192 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263193 // No idle sockets, and one connecting job.
3194 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263195 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263196
3197 // Return the first handle to the pool. This will initiate the delayed
3198 // binding.
3199 handle1.Reset();
3200
fdoray5eeb7642016-06-22 16:11:283201 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263202
3203 // Still no idle sockets, still one pending connect job.
3204 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263205 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263206
3207 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013208 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263209
3210 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263211 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263212
3213 // Finally, signal the waiting Connect.
3214 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263215 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263216
fdoray5eeb7642016-06-22 16:11:283217 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263218}
3219
3220// Test delayed socket binding when a group is at capacity and one
3221// of the group's sockets frees up.
3222TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3223 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3224 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3225
3226 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523227 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503228 EXPECT_EQ(
3229 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283230 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3231 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503232 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3233 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013234 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263235
3236 // No idle sockets, no pending jobs.
3237 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263238 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263239
3240 // Create a second socket to the same host, but this one will wait.
3241 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3242 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503243 EXPECT_EQ(
3244 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283245 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3246 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503247 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3248 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263249 // No idle sockets, and one connecting job.
3250 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263251 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263252
3253 // Return the first handle to the pool. This will initiate the delayed
3254 // binding.
3255 handle1.Reset();
3256
fdoray5eeb7642016-06-22 16:11:283257 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263258
3259 // Still no idle sockets, still one pending connect job.
3260 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263261 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263262
3263 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013264 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263265
3266 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263267 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263268
3269 // Finally, signal the waiting Connect.
3270 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263271 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263272
fdoray5eeb7642016-06-22 16:11:283273 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263274}
3275
3276// Test out the case where we have one socket connected, one
3277// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513278// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263279// should complete, by taking the first socket's idle socket.
3280TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3281 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3282 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3283
3284 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523285 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503286 EXPECT_EQ(
3287 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283288 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3289 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503290 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3291 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013292 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263293
3294 // No idle sockets, no pending jobs.
3295 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263296 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263297
3298 // Create a second socket to the same host, but this one will wait.
3299 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3300 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503301 EXPECT_EQ(
3302 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283303 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3304 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503305 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3306 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263307 // No idle sockets, and one connecting job.
3308 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263309 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263310
3311 // Return the first handle to the pool. This will initiate the delayed
3312 // binding.
3313 handle1.Reset();
3314
fdoray5eeb7642016-06-22 16:11:283315 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263316
3317 // Still no idle sockets, still one pending connect job.
3318 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263319 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263320
3321 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013322 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263323
3324 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263325 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263326
3327 // Finally, signal the waiting Connect.
3328 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263329 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263330
fdoray5eeb7642016-06-22 16:11:283331 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263332}
3333
[email protected]2abfe90a2010-08-25 17:49:513334// Cover the case where on an available socket slot, we have one pending
3335// request that completes synchronously, thereby making the Group empty.
3336TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3337 const int kUnlimitedSockets = 100;
3338 const int kOneSocketPerGroup = 1;
3339 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3340
3341 // Make the first request asynchronous fail.
3342 // This will free up a socket slot later.
3343 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3344
3345 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523346 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203347 EXPECT_EQ(
3348 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283349 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3350 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503351 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3352 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263353 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513354
3355 // Make the second request synchronously fail. This should make the Group
3356 // empty.
3357 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3358 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523359 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513360 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3361 // when created.
tfarina428341112016-09-22 13:38:203362 EXPECT_EQ(
3363 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283364 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3365 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503366 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3367 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513368
Matt Menke9fa17d52019-03-25 19:12:263369 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513370
robpercival214763f2016-07-01 23:27:013371 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3372 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263373 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513374}
3375
[email protected]e1b54dc2010-10-06 21:27:223376TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3377 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3378
3379 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3380
3381 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523382 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203383 EXPECT_EQ(
3384 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283385 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3386 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503387 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3388 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223389
3390 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523391 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203392 EXPECT_EQ(
3393 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283394 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3395 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503396 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3397 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223398 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523399 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203400 EXPECT_EQ(
3401 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283402 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3403 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503404 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3405 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223406
robpercival214763f2016-07-01 23:27:013407 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3408 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3409 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223410
3411 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353412 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383413 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353414 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383415 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223416
3417 handle1.Reset();
3418 handle2.Reset();
3419 handle3.Reset();
3420
Matt Menkec6b3edf72019-03-19 17:00:393421 EXPECT_EQ(OK, handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:283422 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3423 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393424 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3425 pool_.get(), NetLogWithSource()));
3426 EXPECT_EQ(OK, handle2.Init(
Matt Menkef09e64c2019-04-23 22:16:283427 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3428 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393429 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3430 pool_.get(), NetLogWithSource()));
3431 EXPECT_EQ(OK, handle3.Init(
Matt Menkef09e64c2019-04-23 22:16:283432 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3433 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393434 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3435 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223436
3437 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3438 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3439 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3440}
3441
[email protected]2c2bef152010-10-13 00:55:033442TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3443 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3444 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3445
Matt Menkef09e64c2019-04-23 22:16:283446 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3447 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033448
Matt Menke9fa17d52019-03-25 19:12:263449 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3450 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3451 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3452 TestGroupId("a")));
3453 EXPECT_EQ(2u,
3454 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393455 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033456
3457 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523458 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203459 EXPECT_EQ(
3460 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283461 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3462 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503463 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3464 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033465
3466 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523467 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203468 EXPECT_EQ(
3469 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283470 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3471 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503472 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3473 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033474
Matt Menke9fa17d52019-03-25 19:12:263475 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3476 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3477 TestGroupId("a")));
3478 EXPECT_EQ(0u,
3479 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393480 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033481
robpercival214763f2016-07-01 23:27:013482 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3483 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033484 handle1.Reset();
3485 handle2.Reset();
3486
Matt Menke9fa17d52019-03-25 19:12:263487 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3488 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3489 TestGroupId("a")));
3490 EXPECT_EQ(0u,
3491 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393492 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033493}
3494
3495TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3496 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3497 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3498
3499 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523500 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203501 EXPECT_EQ(
3502 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283503 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3504 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503505 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3506 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033507
Matt Menke9fa17d52019-03-25 19:12:263508 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3509 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3510 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3511 TestGroupId("a")));
3512 EXPECT_EQ(0u,
3513 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393514 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033515
Matt Menkef09e64c2019-04-23 22:16:283516 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3517 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033518
Matt Menke9fa17d52019-03-25 19:12:263519 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3520 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3521 TestGroupId("a")));
3522 EXPECT_EQ(1u,
3523 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393524 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033525
3526 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523527 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203528 EXPECT_EQ(
3529 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283530 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3531 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503532 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3533 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033534
Matt Menke9fa17d52019-03-25 19:12:263535 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3536 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3537 TestGroupId("a")));
3538 EXPECT_EQ(0u,
3539 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393540 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033541
robpercival214763f2016-07-01 23:27:013542 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3543 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033544 handle1.Reset();
3545 handle2.Reset();
3546
Matt Menke9fa17d52019-03-25 19:12:263547 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3548 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3549 TestGroupId("a")));
3550 EXPECT_EQ(0u,
3551 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393552 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033553}
3554
3555TEST_F(ClientSocketPoolBaseTest,
3556 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3557 CreatePool(4, 4);
3558 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3559
3560 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523561 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203562 EXPECT_EQ(
3563 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283564 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3565 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503566 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3567 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033568
3569 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523570 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203571 EXPECT_EQ(
3572 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283573 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3574 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503575 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3576 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033577
3578 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523579 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203580 EXPECT_EQ(
3581 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283582 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3583 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503584 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3585 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033586
Matt Menke9fa17d52019-03-25 19:12:263587 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3588 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3589 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3590 TestGroupId("a")));
3591 EXPECT_EQ(0u,
3592 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393593 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033594
Matt Menkef09e64c2019-04-23 22:16:283595 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3596 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033597
Matt Menke9fa17d52019-03-25 19:12:263598 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3599 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3600 TestGroupId("a")));
3601 EXPECT_EQ(0u,
3602 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393603 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033604
robpercival214763f2016-07-01 23:27:013605 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3606 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3607 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033608 handle1.Reset();
3609 handle2.Reset();
3610 handle3.Reset();
3611
Matt Menke9fa17d52019-03-25 19:12:263612 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3613 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3614 TestGroupId("a")));
3615 EXPECT_EQ(0u,
3616 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393617 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033618}
3619
3620TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3621 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3622 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3623
Matt Menke9fa17d52019-03-25 19:12:263624 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033625
Matt Menkef09e64c2019-04-23 22:16:283626 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3627 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033628
Matt Menke9fa17d52019-03-25 19:12:263629 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433630 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393631 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263632 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3633 EXPECT_EQ(
3634 kDefaultMaxSockets,
3635 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3636 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433637 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263638 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3639 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033640
Matt Menke9fa17d52019-03-25 19:12:263641 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033642
Matt Menkef09e64c2019-04-23 22:16:283643 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3644 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033645
Matt Menke9fa17d52019-03-25 19:12:263646 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033647}
3648
3649TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3650 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3651 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3652
Matt Menke9fa17d52019-03-25 19:12:263653 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033654
Matt Menkef09e64c2019-04-23 22:16:283655 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3656 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033657
Matt Menke9fa17d52019-03-25 19:12:263658 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433659 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393660 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263661 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3662 EXPECT_EQ(
3663 kDefaultMaxSockets - 1,
3664 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3665 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433666 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263667 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3668 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483669 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033670
Matt Menke9fa17d52019-03-25 19:12:263671 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033672
Matt Menkef09e64c2019-04-23 22:16:283673 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3674 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033675
Matt Menke9fa17d52019-03-25 19:12:263676 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3677 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483678 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033679}
3680
3681TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3682 CreatePool(4, 4);
3683 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3684
3685 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523686 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203687 EXPECT_EQ(
3688 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283689 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3690 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503691 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3692 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013693 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033694 handle1.Reset();
3695
Matt Menke9fa17d52019-03-25 19:12:263696 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3697 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3698 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3699 TestGroupId("a")));
3700 EXPECT_EQ(0u,
3701 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393702 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033703
Matt Menkef09e64c2019-04-23 22:16:283704 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3705 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033706
Matt Menke9fa17d52019-03-25 19:12:263707 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3708 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3709 TestGroupId("a")));
3710 EXPECT_EQ(1u,
3711 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393712 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033713}
3714
3715TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3716 CreatePool(4, 4);
3717 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3718
3719 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523720 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203721 EXPECT_EQ(
3722 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283723 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3724 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503725 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3726 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013727 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033728
Matt Menke9fa17d52019-03-25 19:12:263729 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3730 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3731 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3732 TestGroupId("a")));
3733 EXPECT_EQ(0u,
3734 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393735 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263736 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033737
Matt Menkef09e64c2019-04-23 22:16:283738 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3739 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033740
Matt Menke9fa17d52019-03-25 19:12:263741 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3742 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3743 TestGroupId("a")));
3744 EXPECT_EQ(1u,
3745 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393746 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263747 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033748}
3749
3750TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3751 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3752 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3753
Matt Menkef09e64c2019-04-23 22:16:283754 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3755 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033756
Matt Menke9fa17d52019-03-25 19:12:263757 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3758 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3759 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3760 TestGroupId("a")));
3761 EXPECT_EQ(0u,
3762 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433763 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393764 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033765
Matt Menkef09e64c2019-04-23 22:16:283766 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3767 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033768
Matt Menke9fa17d52019-03-25 19:12:263769 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3770 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3771 TestGroupId("b")));
3772 EXPECT_EQ(0u,
3773 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433774 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393775 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033776}
3777
[email protected]3c819f522010-12-02 02:03:123778TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3779 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3780 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3781
Matt Menkef09e64c2019-04-23 22:16:283782 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3783 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123784
Matt Menke9fa17d52019-03-25 19:12:263785 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523786
3787 connect_job_factory_->set_job_type(
3788 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkef09e64c2019-04-23 22:16:283789 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3790 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523791
Matt Menke9fa17d52019-03-25 19:12:263792 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123793}
3794
[email protected]8159a1c2012-06-07 00:00:103795TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033796 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433797 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033798
Matt Menkef09e64c2019-04-23 22:16:283799 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3800 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033801
Matt Menke9fa17d52019-03-25 19:12:263802 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3803 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3804 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3805 TestGroupId("a")));
3806 EXPECT_EQ(2u,
3807 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3808 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393809 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033810
Matt Menkef09e64c2019-04-23 22:16:283811 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3812 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263813 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3814 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3815 TestGroupId("a")));
3816 EXPECT_EQ(2u,
3817 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3818 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393819 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033820
3821 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523822 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203823 EXPECT_EQ(
3824 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283825 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3826 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503827 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3828 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433829
3830 client_socket_factory_.SignalJob(0);
3831 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3832
Matt Menke9fa17d52019-03-25 19:12:263833 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3834 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3835 TestGroupId("a")));
3836 EXPECT_EQ(1u,
3837 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3838 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393839 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033840
3841 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523842 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433843 EXPECT_EQ(
3844 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283845 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3846 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503847 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3848 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433849 client_socket_factory_.SignalJob(0);
3850 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033851
Matt Menke9fa17d52019-03-25 19:12:263852 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3853 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3854 TestGroupId("a")));
3855 EXPECT_EQ(0u,
3856 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3857 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393858 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103859
[email protected]2c2bef152010-10-13 00:55:033860 handle1.Reset();
3861 handle2.Reset();
3862
Matt Menke9fa17d52019-03-25 19:12:263863 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3864 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3865 TestGroupId("a")));
3866 EXPECT_EQ(0u,
3867 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3868 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393869 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033870
Matt Menkef09e64c2019-04-23 22:16:283871 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3872 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263873 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3874 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3875 TestGroupId("a")));
3876 EXPECT_EQ(0u,
3877 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3878 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393879 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033880}
3881
3882TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3883 CreatePool(4, 4);
3884 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3885
Matt Menkef09e64c2019-04-23 22:16:283886 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3887 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033888
Matt Menke9fa17d52019-03-25 19:12:263889 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3890 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3891 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3892 TestGroupId("a")));
3893 EXPECT_EQ(1u,
3894 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393895 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033896
Matt Menkef09e64c2019-04-23 22:16:283897 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3898 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263899 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3900 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3901 TestGroupId("a")));
3902 EXPECT_EQ(2u,
3903 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393904 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033905
Matt Menkef09e64c2019-04-23 22:16:283906 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 3,
3907 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263908 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3909 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3910 TestGroupId("a")));
3911 EXPECT_EQ(3u,
3912 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393913 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033914
Matt Menkef09e64c2019-04-23 22:16:283915 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3916 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263917 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3918 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3919 TestGroupId("a")));
3920 EXPECT_EQ(3u,
3921 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393922 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033923}
3924
3925TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3926 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433927 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033928
Matt Menkef09e64c2019-04-23 22:16:283929 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3930 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033931
Matt Menke9fa17d52019-03-25 19:12:263932 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3933 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3934 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3935 TestGroupId("a")));
3936 EXPECT_EQ(1u,
3937 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393938 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033939
3940 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523941 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203942 EXPECT_EQ(
3943 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283944 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3945 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503946 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3947 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033948
Matt Menke9fa17d52019-03-25 19:12:263949 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3950 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3951 TestGroupId("a")));
3952 EXPECT_EQ(0u,
3953 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393954 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033955
Lily Chenecebf932018-11-02 17:15:433956 client_socket_factory_.SignalJobs();
3957 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3958
Matt Menke9fa17d52019-03-25 19:12:263959 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3960 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3961 TestGroupId("a")));
3962 EXPECT_EQ(0u,
3963 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393964 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263965 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033966
[email protected]0dc88b32014-03-26 20:12:283967 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483968 // starts, it has a connect start time.
3969 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033970 handle1.Reset();
3971
Matt Menkec6b3edf72019-03-19 17:00:393972 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033973}
3974
[email protected]034df0f32013-01-07 23:17:483975// Checks that fully connected preconnect jobs have no connect times, and are
3976// marked as reused.
3977TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3979 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkef09e64c2019-04-23 22:16:283980 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3981 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483982
Matt Menke9fa17d52019-03-25 19:12:263983 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3984 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3985 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3986 TestGroupId("a")));
3987 EXPECT_EQ(0u,
3988 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393989 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483990
3991 ClientSocketHandle handle;
3992 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393993 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:283994 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3995 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393996 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3997 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483998
3999 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394000 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484001
4002 TestLoadTimingInfoConnectedReused(handle);
4003 handle.Reset();
4004 TestLoadTimingInfoNotConnected(handle);
4005}
4006
[email protected]dcbe168a2010-12-02 03:14:464007// http://crbug.com/64940 regression test.
4008TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4009 const int kMaxTotalSockets = 3;
4010 const int kMaxSocketsPerGroup = 2;
4011 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434012 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464013
Matt Menkef6edce752019-03-19 17:21:564014 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464015 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4016
4017 // Set up one idle socket in "a".
4018 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524019 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204020 EXPECT_EQ(
4021 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284022 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4023 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504024 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4025 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264026 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4027 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4028 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4029 TestGroupId("a")));
4030 EXPECT_EQ(0u,
4031 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394032 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464033
Lily Chenecebf932018-11-02 17:15:434034 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014035 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264036 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4037 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4038 TestGroupId("a")));
4039 EXPECT_EQ(0u,
4040 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4041 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434042
[email protected]dcbe168a2010-12-02 03:14:464043 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394044 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464045
4046 // Set up two active sockets in "b".
4047 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524048 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204049 EXPECT_EQ(
4050 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284051 handle1.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4052 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504053 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4054 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204055 EXPECT_EQ(
4056 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284057 handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4058 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504059 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4060 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464061
Matt Menke9fa17d52019-03-25 19:12:264062 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4063 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4064 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4065 TestGroupId("b")));
4066 EXPECT_EQ(0u,
4067 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394068 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434069
4070 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014071 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4072 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394073 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264074 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4075 TestGroupId("b")));
4076 EXPECT_EQ(0u,
4077 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4078 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464079
4080 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4081 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4082 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4083 // sockets for "a", and "b" should still have 2 active sockets.
4084
Matt Menkef09e64c2019-04-23 22:16:284085 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4086 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264087 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4088 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4089 TestGroupId("a")));
4090 EXPECT_EQ(0u,
4091 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394092 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264093 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4094 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4095 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4096 TestGroupId("b")));
4097 EXPECT_EQ(0u,
4098 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394099 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264100 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464101
4102 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4103 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4104 // "a" should result in closing 1 for "b".
4105 handle1.Reset();
4106 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394107 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264108 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464109
Matt Menkef09e64c2019-04-23 22:16:284110 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4111 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264112 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4113 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4114 TestGroupId("a")));
4115 EXPECT_EQ(1u,
4116 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394117 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264118 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4119 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4120 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4121 TestGroupId("b")));
4122 EXPECT_EQ(0u,
4123 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394124 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264125 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464126}
4127
[email protected]b7b8be42011-07-12 12:46:414128TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264129 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4130 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074131
4132 // Make the ConnectJob hang until it times out, shorten the timeout.
4133 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4134 connect_job_factory_->set_timeout_duration(
4135 base::TimeDelta::FromMilliseconds(500));
Matt Menkef09e64c2019-04-23 22:16:284136 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4137 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264138 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4139 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4140 TestGroupId("a")));
4141 EXPECT_EQ(1u,
4142 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394143 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074144
[email protected]b7b8be42011-07-12 12:46:414145 // Verify the backup timer doesn't create a backup job, by making
4146 // the backup job a pending job instead of a waiting job, so it
4147 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:074148 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454149 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:444150 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:344151 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:284152 base::RunLoop().Run();
Matt Menke9fa17d52019-03-25 19:12:264153 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074154}
4155
[email protected]b7b8be42011-07-12 12:46:414156TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264157 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4158 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074159
4160 // Make the ConnectJob hang forever.
4161 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkef09e64c2019-04-23 22:16:284162 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4163 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264164 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4165 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4166 TestGroupId("a")));
4167 EXPECT_EQ(1u,
4168 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394169 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284170 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074171
4172 // Make the backup job be a pending job, so it completes normally.
4173 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4174 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524175 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504176 EXPECT_EQ(
4177 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284178 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4179 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4180 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4181 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414182 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264183 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4184 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4185 TestGroupId("a")));
4186 EXPECT_EQ(0u,
4187 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394188 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264189 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014190 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074191
4192 // The hung connect job should still be there, but everything else should be
4193 // complete.
Matt Menke9fa17d52019-03-25 19:12:264194 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4195 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4196 TestGroupId("a")));
4197 EXPECT_EQ(1u,
4198 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394199 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264200 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074201}
4202
[email protected]0dc88b32014-03-26 20:12:284203// Tests that a preconnect that starts out with unread data can still be used.
4204// http://crbug.com/334467
4205TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4206 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4207 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4208
Matt Menkef09e64c2019-04-23 22:16:284209 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4210 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284211
Matt Menke9fa17d52019-03-25 19:12:264212 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4213 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4214 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4215 TestGroupId("a")));
4216 EXPECT_EQ(0u,
4217 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394218 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284219
4220 // Fail future jobs to be sure that handle receives the preconnected socket
4221 // rather than closing it and making a new one.
4222 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4223 ClientSocketHandle handle;
4224 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394225 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284226 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4227 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394228 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4229 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284230
Matt Menke9fa17d52019-03-25 19:12:264231 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4232 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4233 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4234 TestGroupId("a")));
4235 EXPECT_EQ(0u,
4236 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394237 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264238 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284239
4240 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354241 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284242
4243 TestLoadTimingInfoConnectedReused(handle);
4244 handle.Reset();
4245
4246 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394247 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284248}
4249
Lily Chenecebf932018-11-02 17:15:434250TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4251 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4252 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4253
4254 ClientSocketHandle handle1;
4255 TestCompletionCallback callback1;
4256 EXPECT_EQ(
4257 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284258 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4259 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504260 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4261 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434262
Matt Menke9fa17d52019-03-25 19:12:264263 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4264 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4265 TestGroupId("a")));
4266 EXPECT_EQ(0u,
4267 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394268 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434269
Matt Menkec6b3edf72019-03-19 17:00:394270 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4271 &handle1));
Lily Chenecebf932018-11-02 17:15:434272}
4273
4274TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4275 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4276 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4277
4278 ClientSocketHandle handle1;
4279 TestCompletionCallback callback1;
4280 EXPECT_EQ(
4281 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284282 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4283 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504284 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4285 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434286
Matt Menke9fa17d52019-03-25 19:12:264287 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4288 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4289 TestGroupId("a")));
4290 EXPECT_EQ(0u,
4291 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394292 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434293
4294 ClientSocketHandle handle2;
4295 TestCompletionCallback callback2;
4296 EXPECT_EQ(
4297 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284298 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4299 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504300 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4301 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434302
Matt Menke9fa17d52019-03-25 19:12:264303 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4304 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4305 TestGroupId("a")));
4306 EXPECT_EQ(0u,
4307 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394308 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434309
Matt Menkec6b3edf72019-03-19 17:00:394310 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4311 &handle1));
4312 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4313 &handle2));
Lily Chenecebf932018-11-02 17:15:434314
4315 // One job completes. The other request should still have its job.
4316 client_socket_factory_.SignalJob(0);
4317 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4318
Matt Menke9fa17d52019-03-25 19:12:264319 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4320 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4321 TestGroupId("a")));
4322 EXPECT_EQ(0u,
4323 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4324 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394325 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434326
Matt Menkec6b3edf72019-03-19 17:00:394327 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4328 &handle2));
Lily Chenecebf932018-11-02 17:15:434329}
4330
4331TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4332 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4333 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4334
Matt Menkef09e64c2019-04-23 22:16:284335 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4336 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434337
Matt Menke9fa17d52019-03-25 19:12:264338 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4339 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4340 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4341 TestGroupId("a")));
4342 EXPECT_EQ(1u,
4343 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394344 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434345
4346 ClientSocketHandle handle1;
4347 TestCompletionCallback callback1;
4348 EXPECT_EQ(
4349 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284350 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4351 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504352 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4353 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434354
Matt Menke9fa17d52019-03-25 19:12:264355 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4356 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4357 TestGroupId("a")));
4358 EXPECT_EQ(0u,
4359 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394360 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434361
Matt Menkec6b3edf72019-03-19 17:00:394362 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4363 &handle1));
Lily Chenecebf932018-11-02 17:15:434364}
4365
4366TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4367 CreatePool(kDefaultMaxSockets, 1);
4368 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4369
4370 ClientSocketHandle handle1;
4371 TestCompletionCallback callback1;
4372 EXPECT_EQ(
4373 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284374 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4375 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504376 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4377 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434378
Matt Menke9fa17d52019-03-25 19:12:264379 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4380 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4381 TestGroupId("a")));
4382 EXPECT_EQ(0u,
4383 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394384 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434385
Matt Menkec6b3edf72019-03-19 17:00:394386 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4387 &handle1));
Lily Chenecebf932018-11-02 17:15:434388
4389 // Insert a higher priority request
4390 ClientSocketHandle handle2;
4391 TestCompletionCallback callback2;
4392 EXPECT_EQ(
4393 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284394 handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4395 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504396 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4397 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434398
Matt Menke9fa17d52019-03-25 19:12:264399 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4400 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4401 TestGroupId("a")));
4402 EXPECT_EQ(0u,
4403 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394404 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434405
4406 // The highest priority request should steal the job from the default priority
4407 // request.
Matt Menkec6b3edf72019-03-19 17:00:394408 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4409 &handle2));
4410 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4411 &handle1));
Lily Chenecebf932018-11-02 17:15:434412}
4413
4414TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4415 CreatePool(3, 3);
4416 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4417
4418 ClientSocketHandle handle_lowest;
4419 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284420 EXPECT_EQ(
4421 ERR_IO_PENDING,
4422 handle_lowest.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4423 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4424 callback_lowest.callback(),
4425 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4426 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434427
Matt Menke9fa17d52019-03-25 19:12:264428 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4429 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4430 TestGroupId("a")));
4431 EXPECT_EQ(0u,
4432 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394433 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434434
4435 ClientSocketHandle handle_highest;
4436 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284437 EXPECT_EQ(
4438 ERR_IO_PENDING,
4439 handle_highest.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4440 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4441 callback_highest.callback(),
4442 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4443 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434444
Matt Menke9fa17d52019-03-25 19:12:264445 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4446 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4447 TestGroupId("a")));
4448 EXPECT_EQ(0u,
4449 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394450 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434451
4452 ClientSocketHandle handle_low;
4453 TestCompletionCallback callback_low;
4454 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284455 handle_low.Init(
4456 TestGroupId("a"), params_, base::nullopt, LOW, SocketTag(),
4457 ClientSocketPool::RespectLimits::ENABLED,
4458 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4459 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434460
Matt Menke9fa17d52019-03-25 19:12:264461 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4462 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4463 TestGroupId("a")));
4464 EXPECT_EQ(0u,
4465 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394466 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434467
4468 ClientSocketHandle handle_lowest2;
4469 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284470 EXPECT_EQ(
4471 ERR_IO_PENDING,
4472 handle_lowest2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4473 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4474 callback_lowest2.callback(),
4475 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4476 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434477
Matt Menke9fa17d52019-03-25 19:12:264478 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4479 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4480 TestGroupId("a")));
4481 EXPECT_EQ(0u,
4482 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394483 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434484
4485 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394486 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4487 &handle_highest));
4488 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4489 &handle_low));
4490 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4491 &handle_lowest));
4492 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4493 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434494
4495 // Add another request with medium priority. It should steal the job from the
4496 // lowest priority request with a job.
4497 ClientSocketHandle handle_medium;
4498 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284499 EXPECT_EQ(
4500 ERR_IO_PENDING,
4501 handle_medium.Init(TestGroupId("a"), params_, base::nullopt, MEDIUM,
4502 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4503 callback_medium.callback(),
4504 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4505 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434506
Matt Menke9fa17d52019-03-25 19:12:264507 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4508 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4509 TestGroupId("a")));
4510 EXPECT_EQ(0u,
4511 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394512 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4513 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4514 &handle_highest));
4515 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4516 &handle_medium));
4517 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4518 &handle_low));
4519 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4520 &handle_lowest));
4521 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4522 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434523}
4524
4525TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4526 CreatePool(kDefaultMaxSockets, 1);
4527 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4528
4529 ClientSocketHandle handle1;
4530 TestCompletionCallback callback1;
4531 EXPECT_EQ(
4532 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284533 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4534 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504535 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4536 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434537
Matt Menke9fa17d52019-03-25 19:12:264538 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4539 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4540 TestGroupId("a")));
4541 EXPECT_EQ(0u,
4542 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394543 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434544
4545 ClientSocketHandle handle2;
4546 TestCompletionCallback callback2;
4547 EXPECT_EQ(
4548 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284549 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4550 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504551 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4552 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434553
Matt Menke9fa17d52019-03-25 19:12:264554 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4555 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4556 TestGroupId("a")));
4557 EXPECT_EQ(0u,
4558 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394559 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434560
4561 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394562 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4563 &handle1));
4564 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4565 &handle2));
Lily Chenecebf932018-11-02 17:15:434566
4567 // Reprioritizing the second request places it above the first, and it steals
4568 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394569 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4570 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4571 &handle2));
4572 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4573 &handle1));
Lily Chenecebf932018-11-02 17:15:434574}
4575
4576TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4577 CreatePool(kDefaultMaxSockets, 1);
4578 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4579
4580 ClientSocketHandle handle1;
4581 TestCompletionCallback callback1;
4582 EXPECT_EQ(
4583 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284584 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4585 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504586 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4587 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434588
Matt Menke9fa17d52019-03-25 19:12:264589 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4590 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4591 TestGroupId("a")));
4592 EXPECT_EQ(0u,
4593 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394594 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434595
Matt Menkec6b3edf72019-03-19 17:00:394596 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4597 &handle1));
Lily Chenecebf932018-11-02 17:15:434598
4599 ClientSocketHandle handle2;
4600 TestCompletionCallback callback2;
4601 EXPECT_EQ(
4602 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284603 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4604 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504605 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4606 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434607
Matt Menke9fa17d52019-03-25 19:12:264608 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4609 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4610 TestGroupId("a")));
4611 EXPECT_EQ(0u,
4612 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394613 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434614
4615 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394616 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4617 &handle1));
4618 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4619 &handle2));
Lily Chenecebf932018-11-02 17:15:434620
4621 // The second request should get a job upon cancelling the first request.
4622 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264623 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4624 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4625 TestGroupId("a")));
4626 EXPECT_EQ(0u,
4627 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394628 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434629
Matt Menkec6b3edf72019-03-19 17:00:394630 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4631 &handle2));
Lily Chenecebf932018-11-02 17:15:434632}
4633
4634TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4635 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4636 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4637
4638 ClientSocketHandle handle1;
4639 TestCompletionCallback callback1;
4640 EXPECT_EQ(
4641 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284642 handle1.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4643 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504644 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4645 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434646
Matt Menke9fa17d52019-03-25 19:12:264647 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4648 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4649 TestGroupId("a")));
4650 EXPECT_EQ(0u,
4651 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394652 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434653
4654 ClientSocketHandle handle2;
4655 TestCompletionCallback callback2;
4656 EXPECT_EQ(
4657 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284658 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4659 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504660 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4661 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434662
Matt Menke9fa17d52019-03-25 19:12:264663 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4664 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4665 TestGroupId("a")));
4666 EXPECT_EQ(0u,
4667 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394668 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434669
Matt Menkec6b3edf72019-03-19 17:00:394670 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4671 &handle1));
4672 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4673 &handle2));
Lily Chenecebf932018-11-02 17:15:434674
4675 // The lower-priority job completes first. The higher-priority request should
4676 // get the socket, and the lower-priority request should get the remaining
4677 // job.
4678 client_socket_factory_.SignalJob(1);
4679 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264680 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4681 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4682 TestGroupId("a")));
4683 EXPECT_EQ(0u,
4684 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4685 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394686 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434687 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394688 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4689 &handle2));
Lily Chenecebf932018-11-02 17:15:434690}
4691
[email protected]043b68c82013-08-22 23:41:524692class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204693 public:
Matt Menke9fa17d52019-03-25 19:12:264694 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394695 const ClientSocketPool::GroupId& group_id)
4696 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524697 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204698 }
4699
Daniel Cheng4496d0822018-04-26 21:52:154700 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204701
Matt Menke9fa17d52019-03-25 19:12:264702 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504703 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034704 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284705 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
4706 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4707 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204708 }
4709
Matt Menke9fa17d52019-03-25 19:12:264710 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504711 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034712 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284713 base::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504714 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4715 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204716 }
4717
4718 bool ReleaseOneConnection() {
4719 if (!handle_.is_initialized() || !can_release_connection_) {
4720 return false;
4721 }
4722 handle_.socket()->Disconnect();
4723 handle_.Reset();
4724 return true;
4725 }
4726
4727 void set_can_release_connection(bool can_release_connection) {
4728 can_release_connection_ = can_release_connection;
4729 }
4730
4731 MOCK_METHOD0(CloseOneIdleConnection, bool());
4732
4733 private:
Matt Menke9fa17d52019-03-25 19:12:264734 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204735 ClientSocketHandle handle_;
4736 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394737 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204738 bool can_release_connection_;
4739};
4740
[email protected]58e562f2013-04-22 17:32:204741// Tests the basic case of closing an idle socket in a higher layered pool when
4742// a new request is issued and the lower layer pool is stalled.
4743TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4744 CreatePool(1, 1);
4745 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4746
Matt Menkec6b3edf72019-03-19 17:00:394747 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014748 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204749 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4750 .WillOnce(Invoke(&mock_layered_pool,
4751 &MockLayeredPool::ReleaseOneConnection));
4752 ClientSocketHandle handle;
4753 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504754 EXPECT_EQ(
4755 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284756 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4757 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4758 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4759 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014760 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204761}
4762
Matt Menke833678642019-03-05 22:05:514763// Tests the case that trying to close an idle socket in a higher layered pool
4764// fails.
4765TEST_F(ClientSocketPoolBaseTest,
4766 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4767 CreatePool(1, 1);
4768 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4769
Matt Menkec6b3edf72019-03-19 17:00:394770 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514771 mock_layered_pool.set_can_release_connection(false);
4772 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4773 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4774 .WillOnce(Invoke(&mock_layered_pool,
4775 &MockLayeredPool::ReleaseOneConnection));
4776 ClientSocketHandle handle;
4777 TestCompletionCallback callback;
4778 EXPECT_EQ(
4779 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284780 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4781 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4782 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4783 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514784 base::RunLoop().RunUntilIdle();
4785 EXPECT_FALSE(callback.have_result());
4786}
4787
[email protected]58e562f2013-04-22 17:32:204788// Same as above, but the idle socket is in the same group as the stalled
4789// socket, and closes the only other request in its group when closing requests
4790// in higher layered pools. This generally shouldn't happen, but it may be
4791// possible if a higher level pool issues a request and the request is
4792// subsequently cancelled. Even if it's not possible, best not to crash.
4793TEST_F(ClientSocketPoolBaseTest,
4794 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4795 CreatePool(2, 2);
4796 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4797
4798 // Need a socket in another group for the pool to be stalled (If a group
4799 // has the maximum number of connections already, it's not stalled).
4800 ClientSocketHandle handle1;
4801 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284802 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4803 DEFAULT_PRIORITY, SocketTag(),
4804 ClientSocketPool::RespectLimits::ENABLED,
4805 callback1.callback(),
4806 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4807 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204808
Matt Menkec6b3edf72019-03-19 17:00:394809 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014810 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204811 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4812 .WillOnce(Invoke(&mock_layered_pool,
4813 &MockLayeredPool::ReleaseOneConnection));
4814 ClientSocketHandle handle;
4815 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284816 EXPECT_EQ(ERR_IO_PENDING,
4817 handle.Init(
4818 TestGroupId("group2"), params_, base::nullopt, DEFAULT_PRIORITY,
4819 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4820 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4821 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014822 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204823}
4824
4825// Tests the case when an idle socket can be closed when a new request is
4826// issued, and the new request belongs to a group that was previously stalled.
4827TEST_F(ClientSocketPoolBaseTest,
4828 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4829 CreatePool(2, 2);
4830 std::list<TestConnectJob::JobType> job_types;
4831 job_types.push_back(TestConnectJob::kMockJob);
4832 job_types.push_back(TestConnectJob::kMockJob);
4833 job_types.push_back(TestConnectJob::kMockJob);
4834 job_types.push_back(TestConnectJob::kMockJob);
4835 connect_job_factory_->set_job_types(&job_types);
4836
4837 ClientSocketHandle handle1;
4838 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284839 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4840 DEFAULT_PRIORITY, SocketTag(),
4841 ClientSocketPool::RespectLimits::ENABLED,
4842 callback1.callback(),
4843 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4844 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204845
Matt Menkec6b3edf72019-03-19 17:00:394846 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014847 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204848 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4849 .WillRepeatedly(Invoke(&mock_layered_pool,
4850 &MockLayeredPool::ReleaseOneConnection));
4851 mock_layered_pool.set_can_release_connection(false);
4852
4853 // The third request is made when the socket pool is in a stalled state.
4854 ClientSocketHandle handle3;
4855 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284856 EXPECT_EQ(ERR_IO_PENDING,
4857 handle3.Init(
4858 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4859 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4860 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4861 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204862
4863 base::RunLoop().RunUntilIdle();
4864 EXPECT_FALSE(callback3.have_result());
4865
4866 // The fourth request is made when the pool is no longer stalled. The third
4867 // request should be serviced first, since it was issued first and has the
4868 // same priority.
4869 mock_layered_pool.set_can_release_connection(true);
4870 ClientSocketHandle handle4;
4871 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284872 EXPECT_EQ(ERR_IO_PENDING,
4873 handle4.Init(
4874 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4875 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4876 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4877 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014878 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204879 EXPECT_FALSE(callback4.have_result());
4880
4881 // Closing a handle should free up another socket slot.
4882 handle1.Reset();
robpercival214763f2016-07-01 23:27:014883 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204884}
4885
4886// Tests the case when an idle socket can be closed when a new request is
4887// issued, and the new request belongs to a group that was previously stalled.
4888//
4889// The two differences from the above test are that the stalled requests are not
4890// in the same group as the layered pool's request, and the the fourth request
4891// has a higher priority than the third one, so gets a socket first.
4892TEST_F(ClientSocketPoolBaseTest,
4893 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4894 CreatePool(2, 2);
4895 std::list<TestConnectJob::JobType> job_types;
4896 job_types.push_back(TestConnectJob::kMockJob);
4897 job_types.push_back(TestConnectJob::kMockJob);
4898 job_types.push_back(TestConnectJob::kMockJob);
4899 job_types.push_back(TestConnectJob::kMockJob);
4900 connect_job_factory_->set_job_types(&job_types);
4901
4902 ClientSocketHandle handle1;
4903 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284904 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4905 DEFAULT_PRIORITY, SocketTag(),
4906 ClientSocketPool::RespectLimits::ENABLED,
4907 callback1.callback(),
4908 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4909 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204910
Matt Menkec6b3edf72019-03-19 17:00:394911 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014912 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204913 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4914 .WillRepeatedly(Invoke(&mock_layered_pool,
4915 &MockLayeredPool::ReleaseOneConnection));
4916 mock_layered_pool.set_can_release_connection(false);
4917
4918 // The third request is made when the socket pool is in a stalled state.
4919 ClientSocketHandle handle3;
4920 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204921 EXPECT_EQ(
4922 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284923 handle3.Init(TestGroupId("group3"), params_, base::nullopt, MEDIUM,
4924 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504925 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4926 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204927
4928 base::RunLoop().RunUntilIdle();
4929 EXPECT_FALSE(callback3.have_result());
4930
4931 // The fourth request is made when the pool is no longer stalled. This
4932 // request has a higher priority than the third request, so is serviced first.
4933 mock_layered_pool.set_can_release_connection(true);
4934 ClientSocketHandle handle4;
4935 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204936 EXPECT_EQ(
4937 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284938 handle4.Init(TestGroupId("group3"), params_, base::nullopt, HIGHEST,
4939 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504940 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4941 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014942 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204943 EXPECT_FALSE(callback3.have_result());
4944
4945 // Closing a handle should free up another socket slot.
4946 handle1.Reset();
robpercival214763f2016-07-01 23:27:014947 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204948}
4949
4950TEST_F(ClientSocketPoolBaseTest,
4951 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4952 CreatePool(1, 1);
4953 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4954
Matt Menkec6b3edf72019-03-19 17:00:394955 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014956 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204957 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4958 .WillRepeatedly(Invoke(&mock_layered_pool1,
4959 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:394960 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:014961 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4962 IsOk());
[email protected]58e562f2013-04-22 17:32:204963 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4964 .WillRepeatedly(Invoke(&mock_layered_pool2,
4965 &MockLayeredPool::ReleaseOneConnection));
4966 ClientSocketHandle handle;
4967 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504968 EXPECT_EQ(
4969 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284970 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4971 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4972 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4973 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014974 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204975}
4976
[email protected]b021ece62013-06-11 11:06:334977// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154978// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4979// socket instead of a request with the same priority that was issued earlier,
4980// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334981TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334982 CreatePool(1, 1);
4983
4984 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394985 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4986 TestGroupId("a"), MAXIMUM_PRIORITY,
4987 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264988 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334989
4990 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4991
mmenked3641e12016-01-28 16:06:154992 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394993 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154994 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264995 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334996
mmenked3641e12016-01-28 16:06:154997 // Issue a request that ignores the limits, so a new ConnectJob is
4998 // created.
4999 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395000 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155001 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265002 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335003
robpercival214763f2016-07-01 23:27:015004 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335005 EXPECT_FALSE(request(1)->have_result());
5006}
5007
[email protected]c55fabd2013-11-04 23:26:565008// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155009// issued for a request with RespectLimits::DISABLED is not cancelled when a
5010// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565011TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565012 CreatePool(1, 1);
5013
5014 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395015 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5016 TestGroupId("a"), MAXIMUM_PRIORITY,
5017 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265018 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565019
5020 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5021
mmenked3641e12016-01-28 16:06:155022 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395023 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155024 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265025 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565026
mmenked3641e12016-01-28 16:06:155027 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5028 // created.
5029 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395030 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155031 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265032 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335033
mmenked3641e12016-01-28 16:06:155034 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335035 // should not be cancelled.
5036 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265037 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335038
robpercival214763f2016-07-01 23:27:015039 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335040 EXPECT_FALSE(request(1)->have_result());
5041}
5042
Matt Menkeb57663b32019-03-01 17:17:105043TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5044 CreatePool(1, 1);
5045
5046 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5047
5048 ClientSocketHandle handle;
5049 TestCompletionCallback callback;
5050 EXPECT_EQ(
5051 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285052 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5053 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5054 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5055 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105056
Matt Menke9fa17d52019-03-25 19:12:265057 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105058
5059 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5060 EXPECT_FALSE(handle.is_initialized());
5061 EXPECT_FALSE(handle.socket());
5062
5063 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265064 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105065}
5066
5067class TestAuthHelper {
5068 public:
5069 TestAuthHelper() = default;
5070 ~TestAuthHelper() = default;
5071
Matt Menkec6b3edf72019-03-19 17:00:395072 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195073 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265074 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395075 RequestPriority priority = DEFAULT_PRIORITY,
5076 ClientSocketPool::RespectLimits respect_limits =
5077 ClientSocketPool::RespectLimits::ENABLED,
5078 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105079 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285080 handle_.Init(group_id_in, params, base::nullopt, priority,
5081 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105082 base::BindRepeating(&TestAuthHelper::AuthCallback,
5083 base::Unretained(this)),
5084 pool, NetLogWithSource()));
5085 }
5086
5087 void WaitForAuth() {
5088 run_loop_ = std::make_unique<base::RunLoop>();
5089 run_loop_->Run();
5090 run_loop_.reset();
5091 }
5092
5093 void WaitForAuthAndRestartSync() {
5094 restart_sync_ = true;
5095 WaitForAuth();
5096 restart_sync_ = false;
5097 }
5098
5099 void WaitForAuthAndResetHandleSync() {
5100 reset_handle_sync_ = true;
5101 WaitForAuth();
5102 reset_handle_sync_ = false;
5103 }
5104
5105 void RestartWithAuth() {
5106 DCHECK(restart_with_auth_callback_);
5107 std::move(restart_with_auth_callback_).Run();
5108 }
5109
5110 int WaitForResult() {
5111 int result = callback_.WaitForResult();
5112 // There shouldn't be any callback waiting to be invoked once the request is
5113 // complete.
5114 EXPECT_FALSE(restart_with_auth_callback_);
5115 // The socket should only be initialized on success.
5116 EXPECT_EQ(result == OK, handle_.is_initialized());
5117 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5118 return result;
5119 }
5120
5121 ClientSocketHandle* handle() { return &handle_; }
5122 int auth_count() const { return auth_count_; }
5123 int have_result() const { return callback_.have_result(); }
5124
5125 private:
5126 void AuthCallback(const HttpResponseInfo& response,
5127 HttpAuthController* auth_controller,
5128 base::OnceClosure restart_with_auth_callback) {
5129 EXPECT_FALSE(restart_with_auth_callback_);
5130 EXPECT_TRUE(restart_with_auth_callback);
5131
5132 // Once there's a result, this method shouldn't be invoked again.
5133 EXPECT_FALSE(callback_.have_result());
5134
5135 ++auth_count_;
5136 run_loop_->Quit();
5137 if (restart_sync_) {
5138 std::move(restart_with_auth_callback).Run();
5139 return;
5140 }
5141
5142 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5143
5144 if (reset_handle_sync_) {
5145 handle_.Reset();
5146 return;
5147 }
5148 }
5149
5150 std::unique_ptr<base::RunLoop> run_loop_;
5151 base::OnceClosure restart_with_auth_callback_;
5152
5153 bool restart_sync_ = false;
5154 bool reset_handle_sync_ = false;
5155
5156 ClientSocketHandle handle_;
5157 int auth_count_ = 0;
5158 TestCompletionCallback callback_;
5159
5160 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
5161};
5162
5163TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5164 CreatePool(1, 1);
5165 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5166
5167 TestAuthHelper auth_helper;
5168 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265169 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015170 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395171 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105172
5173 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265174 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015175 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395176 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105177
5178 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265179 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015180 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395181 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105182
5183 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5184 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265185 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5186 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395187 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105188 EXPECT_EQ(0, pool_->IdleSocketCount());
5189}
5190
5191TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5192 CreatePool(1, 1);
5193 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5194
5195 TestAuthHelper auth_helper;
5196 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265197 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015198 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395199 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105200
5201 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265202 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015203 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395204 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105205
5206 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5207 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265208 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5209 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395210 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105211 EXPECT_EQ(0, pool_->IdleSocketCount());
5212}
5213
5214TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5215 CreatePool(1, 1);
5216 connect_job_factory_->set_job_type(
5217 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5218
5219 TestAuthHelper auth_helper;
5220 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265221 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105222
5223 auth_helper.WaitForAuth();
5224 auth_helper.RestartWithAuth();
5225 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5226
5227 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265228 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105229 EXPECT_EQ(0, pool_->IdleSocketCount());
5230}
5231
5232TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5233 CreatePool(1, 1);
5234 connect_job_factory_->set_job_type(
5235 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5236
5237 TestAuthHelper auth_helper;
5238 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265239 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105240
5241 auth_helper.WaitForAuthAndRestartSync();
5242 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5243
5244 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265245 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105246 EXPECT_EQ(0, pool_->IdleSocketCount());
5247}
5248
5249TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5250 CreatePool(1, 1);
5251 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5252
5253 TestAuthHelper auth_helper;
5254 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265255 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105256
5257 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265258 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105259
5260 auth_helper.handle()->Reset();
5261
5262 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265263 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105264 EXPECT_EQ(0, pool_->IdleSocketCount());
5265 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5266 EXPECT_FALSE(auth_helper.handle()->socket());
5267}
5268
5269TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5270 CreatePool(1, 1);
5271 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5272
5273 TestAuthHelper auth_helper;
5274 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265275 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105276
5277 auth_helper.WaitForAuthAndResetHandleSync();
5278 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265279 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105280 EXPECT_EQ(0, pool_->IdleSocketCount());
5281 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5282 EXPECT_FALSE(auth_helper.handle()->socket());
5283}
5284
5285TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5286 CreatePool(1, 1);
5287 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5288
5289 TestAuthHelper auth_helper;
5290 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265291 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105292
5293 auth_helper.WaitForAuth();
5294
5295 pool_->FlushWithError(ERR_FAILED);
5296 base::RunLoop().RunUntilIdle();
5297
5298 // When flushing the socket pool, bound sockets should delay returning the
5299 // error until completion.
5300 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265301 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105302 EXPECT_EQ(0, pool_->IdleSocketCount());
5303
5304 auth_helper.RestartWithAuth();
5305 // The callback should be called asynchronously.
5306 EXPECT_FALSE(auth_helper.have_result());
5307
5308 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265309 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105310 EXPECT_EQ(0, pool_->IdleSocketCount());
5311}
5312
5313TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5314 CreatePool(1, 1);
5315 connect_job_factory_->set_job_type(
5316 TestConnectJob::kMockAuthChallengeTwiceJob);
5317
5318 TestAuthHelper auth_helper;
5319 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265320 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015321 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395322 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105323
5324 auth_helper.WaitForAuth();
5325 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265326 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105327 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015328 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395329 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105330
5331 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265332 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015333 EXPECT_EQ(2, auth_helper.auth_count());
5334 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395335 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015336
Matt Menkeb57663b32019-03-01 17:17:105337 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265338 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105339 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015340 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395341 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105342
5343 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5344 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265345 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5346 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395347 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105348 EXPECT_EQ(0, pool_->IdleSocketCount());
5349}
5350
5351TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5352 CreatePool(1, 1);
5353 connect_job_factory_->set_job_type(
5354 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5355
5356 TestAuthHelper auth_helper;
5357 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265358 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105359
5360 auth_helper.WaitForAuth();
5361 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265362 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105363 EXPECT_EQ(1, auth_helper.auth_count());
5364
5365 auth_helper.WaitForAuth();
5366 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265367 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105368 EXPECT_EQ(2, auth_helper.auth_count());
5369
5370 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5371 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265372 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105373 EXPECT_EQ(0, pool_->IdleSocketCount());
5374}
5375
5376// Makes sure that when a bound request is destroyed, a new ConnectJob is
5377// created, if needed.
5378TEST_F(ClientSocketPoolBaseTest,
5379 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5380 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5381 connect_job_factory_->set_job_type(
5382 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5383
5384 // First request creates a ConnectJob.
5385 TestAuthHelper auth_helper1;
5386 auth_helper1.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 // A second request come in, but no new ConnectJob is needed, since the limit
5390 // has been reached.
5391 TestAuthHelper auth_helper2;
5392 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265393 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105394
5395 // Run until the auth callback for the first request is invoked.
5396 auth_helper1.WaitForAuth();
5397 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265398 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5399 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395400 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105401
5402 // Make connect jobs succeed, then cancel the first request, which should
5403 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5404 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5405 auth_helper1.handle()->Reset();
5406 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265407 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105408
5409 // The second ConnectJob should succeed.
5410 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5411 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265412 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105413}
5414
5415// Makes sure that when a bound request is destroyed, a new ConnectJob is
5416// created for another group, if needed.
5417TEST_F(ClientSocketPoolBaseTest,
5418 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5419 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5420 connect_job_factory_->set_job_type(
5421 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5422
5423 // First request creates a ConnectJob.
5424 TestAuthHelper auth_helper1;
5425 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265426 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105427
5428 // A second request come in, but no new ConnectJob is needed, since the limit
5429 // has been reached.
5430 TestAuthHelper auth_helper2;
5431 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395432 ClientSocketPool::RespectLimits::ENABLED,
5433 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265434 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5435 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105436
5437 // Run until the auth callback for the first request is invoked.
5438 auth_helper1.WaitForAuth();
5439 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265440 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5441 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395442 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265443 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5444 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395445 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105446
5447 // Make connect jobs succeed, then cancel the first request, which should
5448 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5449 // other group.
5450 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5451 auth_helper1.handle()->Reset();
5452 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265453 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5454 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105455
5456 // The second ConnectJob should succeed.
5457 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5458 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265459 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5460 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105461}
5462
5463// Test that once an auth challenge is bound, that's the request that gets all
5464// subsequent calls and the socket itself.
5465TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5466 CreatePool(1, 1);
5467 connect_job_factory_->set_job_type(
5468 TestConnectJob::kMockAuthChallengeTwiceJob);
5469
5470 // First request creates a ConnectJob.
5471 TestAuthHelper auth_helper1;
5472 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265473 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105474
5475 // A second, higher priority request is made.
5476 TestAuthHelper auth_helper2;
5477 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265478 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105479
5480 // Run until the auth callback for the second request is invoked.
5481 auth_helper2.WaitForAuth();
5482 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265483 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5484 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395485 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105486
5487 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5488 // ConnectJob.
5489 TestAuthHelper auth_helper3;
5490 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265491 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105492
5493 // Start a higher job that ignores limits, creating a hanging socket. It
5494 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5495 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5496 TestAuthHelper auth_helper4;
5497 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5498 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265499 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105500
5501 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5502 // again.
5503 auth_helper2.RestartWithAuth();
5504 auth_helper2.WaitForAuth();
5505 EXPECT_EQ(0, auth_helper1.auth_count());
5506 EXPECT_FALSE(auth_helper1.have_result());
5507 EXPECT_EQ(2, auth_helper2.auth_count());
5508 EXPECT_FALSE(auth_helper2.have_result());
5509 EXPECT_EQ(0, auth_helper3.auth_count());
5510 EXPECT_FALSE(auth_helper3.have_result());
5511 EXPECT_EQ(0, auth_helper4.auth_count());
5512 EXPECT_FALSE(auth_helper4.have_result());
5513
5514 // Advance auth again, and |auth_helper2| should get the socket.
5515 auth_helper2.RestartWithAuth();
5516 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5517 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5518 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265519 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5520 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105521 EXPECT_EQ(0, auth_helper1.auth_count());
5522 EXPECT_FALSE(auth_helper1.have_result());
5523 EXPECT_EQ(0, auth_helper3.auth_count());
5524 EXPECT_FALSE(auth_helper3.have_result());
5525 EXPECT_EQ(0, auth_helper4.auth_count());
5526 EXPECT_FALSE(auth_helper4.have_result());
5527
5528 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5529 // socket request should be able to claim it.
5530 auth_helper2.handle()->Reset();
5531 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5532 EXPECT_EQ(0, auth_helper1.auth_count());
5533 EXPECT_FALSE(auth_helper1.have_result());
5534 EXPECT_EQ(0, auth_helper3.auth_count());
5535 EXPECT_FALSE(auth_helper3.have_result());
5536 EXPECT_EQ(0, auth_helper4.auth_count());
5537}
5538
David Benjaminbac8dff2019-08-07 01:30:415539enum class RefreshType {
5540 kServer,
5541 kProxy,
5542};
5543
5544// Common base class to test RefreshGroup() when called from either
5545// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5546//
5547// Tests which test behavior specific to one or the other case should use
5548// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5549// when the pool's proxy matches.
5550class ClientSocketPoolBaseRefreshTest
5551 : public ClientSocketPoolBaseTest,
5552 public testing::WithParamInterface<RefreshType> {
5553 public:
5554 void CreatePoolForRefresh(int max_sockets,
5555 int max_sockets_per_group,
5556 bool enable_backup_connect_jobs = false) {
5557 switch (GetParam()) {
5558 case RefreshType::kServer:
5559 CreatePool(max_sockets, max_sockets_per_group,
5560 enable_backup_connect_jobs);
5561 break;
5562 case RefreshType::kProxy:
5563 CreatePoolWithIdleTimeouts(
5564 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5565 ClientSocketPool::used_idle_socket_timeout(),
5566 enable_backup_connect_jobs,
5567 ProxyServer::FromPacString("HTTPS myproxy:70"));
5568 break;
5569 }
5570 }
5571
5572 static ClientSocketPool::GroupId GetGroupId() {
5573 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5574 }
5575
David Benjamin6dd7e882019-10-10 02:35:235576 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5577 // Note this GroupId will match GetGroupId() unless
5578 // kPartitionConnectionsByNetworkIsolationKey is enabled.
5579 const auto kOrigin = url::Origin::Create(GURL("https://b/"));
5580 const NetworkIsolationKey kNetworkIsolationKey(kOrigin, kOrigin);
5581 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5582 PrivacyMode::PRIVACY_MODE_DISABLED,
5583 kNetworkIsolationKey);
5584 }
5585
David Benjaminbac8dff2019-08-07 01:30:415586 void OnSSLConfigForServerChanged() {
5587 switch (GetParam()) {
5588 case RefreshType::kServer:
5589 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5590 break;
5591 case RefreshType::kProxy:
5592 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5593 break;
5594 }
5595 }
5596};
5597
5598INSTANTIATE_TEST_SUITE_P(RefreshType,
5599 ClientSocketPoolBaseRefreshTest,
5600 ::testing::Values(RefreshType::kServer,
5601 RefreshType::kProxy));
5602
5603TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5604 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5605 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245606
5607 // First job will be waiting until it gets aborted.
5608 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5609
5610 ClientSocketHandle handle;
5611 TestCompletionCallback callback;
5612 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285613 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5614 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5615 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5616 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245617 IsError(ERR_IO_PENDING));
5618
5619 // Switch connect job types, so creating a new ConnectJob will result in
5620 // success.
5621 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5622
David Benjaminbac8dff2019-08-07 01:30:415623 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245624 EXPECT_EQ(OK, callback.WaitForResult());
5625 ASSERT_TRUE(handle.socket());
5626 EXPECT_EQ(0, pool_->IdleSocketCount());
5627 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5628 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5629 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5630 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5631}
5632
David Benjaminbac8dff2019-08-07 01:30:415633TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235634 base::test::ScopedFeatureList feature_list;
5635 feature_list.InitAndEnableFeature(
5636 features::kPartitionConnectionsByNetworkIsolationKey);
5637
David Benjaminbac8dff2019-08-07 01:30:415638 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5639 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235640 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245641
Matt Menkef09e64c2019-04-23 22:16:285642 pool_->RequestSockets(kGroupId, params_, base::nullopt, 2,
5643 NetLogWithSource());
David Benjamin6dd7e882019-10-10 02:35:235644 pool_->RequestSockets(kGroupIdInPartition, params_, base::nullopt, 2,
5645 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245646 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235647 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5648 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245649 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235650 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245651
David Benjaminbac8dff2019-08-07 01:30:415652 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245653 EXPECT_EQ(0, pool_->IdleSocketCount());
5654 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235655 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245656}
5657
5658TEST_F(ClientSocketPoolBaseTest,
5659 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5660 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415661 const ClientSocketPool::GroupId kGroupId =
5662 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5663 const ClientSocketPool::GroupId kOtherGroupId =
5664 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245665
Matt Menkef09e64c2019-04-23 22:16:285666 pool_->RequestSockets(kOtherGroupId, params_, base::nullopt, 2,
5667 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245668 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5669 EXPECT_EQ(2, pool_->IdleSocketCount());
5670 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5671
David Benjaminbac8dff2019-08-07 01:30:415672 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245673 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5674 EXPECT_EQ(2, pool_->IdleSocketCount());
5675 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5676}
5677
David Benjaminbac8dff2019-08-07 01:30:415678TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5679 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5680 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245681
5682 ClientSocketHandle handle;
5683 TestCompletionCallback callback;
5684 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285685 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5686 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5687 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5688 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245689 IsOk());
5690 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5691 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5692
David Benjaminbac8dff2019-08-07 01:30:415693 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245694
5695 handle.Reset();
5696 EXPECT_EQ(0, pool_->IdleSocketCount());
5697 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5698}
5699
5700TEST_F(ClientSocketPoolBaseTest,
5701 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415703 const ClientSocketPool::GroupId kGroupId =
5704 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5705 const ClientSocketPool::GroupId kOtherGroupId =
5706 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245707
5708 ClientSocketHandle handle;
5709 TestCompletionCallback callback;
5710 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285711 handle.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5712 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5713 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5714 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245715 IsOk());
5716 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5717 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5718
David Benjaminbac8dff2019-08-07 01:30:415719 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245720
5721 handle.Reset();
5722 EXPECT_EQ(1, pool_->IdleSocketCount());
5723 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5724 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5725}
5726
David Benjaminbac8dff2019-08-07 01:30:415727TEST_P(ClientSocketPoolBaseRefreshTest,
5728 RefreshGroupReplacesBoundConnectJobOnConnect) {
5729 CreatePoolForRefresh(1, 1);
5730 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245731 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5732
5733 TestAuthHelper auth_helper;
5734 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5735 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5736 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5737
5738 auth_helper.WaitForAuth();
5739
5740 // This should update the generation, but not cancel the old ConnectJob - it's
5741 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415742 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245743
5744 // Providing auth credentials and restarting the request with them will cause
5745 // the ConnectJob to complete successfully, but the result will be discarded
5746 // because of the generation mismatch.
5747 auth_helper.RestartWithAuth();
5748
5749 // Despite using ConnectJobs that simulate a single challenge, a second
5750 // challenge will be seen, due to using a new ConnectJob.
5751 auth_helper.WaitForAuth();
5752 auth_helper.RestartWithAuth();
5753
5754 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5755 EXPECT_TRUE(auth_helper.handle()->socket());
5756 EXPECT_EQ(2, auth_helper.auth_count());
5757
5758 // When released, the socket will be returned to the socket pool, and
5759 // available for reuse.
5760 auth_helper.handle()->Reset();
5761 EXPECT_EQ(1, pool_->IdleSocketCount());
5762 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5763 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5764}
5765
David Benjaminbac8dff2019-08-07 01:30:415766TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5767 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5768 kUnusedIdleSocketTimeout,
5769 ClientSocketPool::used_idle_socket_timeout(),
5770 false /* no backup connect jobs */,
5771 ProxyServer::FromPacString("HTTPS myproxy:70"));
5772
5773 const ClientSocketPool::GroupId kGroupId1 =
5774 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5775 const ClientSocketPool::GroupId kGroupId2 =
5776 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5777 const ClientSocketPool::GroupId kGroupId3 =
5778 TestGroupId("c", 443, ClientSocketPool::SocketType::kSsl);
5779
5780 // Make three sockets in three different groups. The third socket is released
5781 // to the pool as idle.
5782 ClientSocketHandle handle1, handle2, handle3;
5783 TestCompletionCallback callback;
5784 EXPECT_THAT(
5785 handle1.Init(kGroupId1, params_, base::nullopt, DEFAULT_PRIORITY,
5786 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5787 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5788 pool_.get(), NetLogWithSource()),
5789 IsOk());
5790 EXPECT_THAT(
5791 handle2.Init(kGroupId2, params_, base::nullopt, DEFAULT_PRIORITY,
5792 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5793 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5794 pool_.get(), NetLogWithSource()),
5795 IsOk());
5796 EXPECT_THAT(
5797 handle3.Init(kGroupId3, params_, base::nullopt, DEFAULT_PRIORITY,
5798 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5799 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5800 pool_.get(), NetLogWithSource()),
5801 IsOk());
5802 handle3.Reset();
5803 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5804 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5805 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5806 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5807 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5808 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5809
5810 // Changes to some other proxy do not affect the pool. The idle socket remains
5811 // alive and closing |handle2| makes the socket available for the pool.
5812 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5813
5814 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5815 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5816 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5817 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5818 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5819 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5820
5821 handle2.Reset();
5822 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5823 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5824
5825 // Changes to the matching proxy refreshes all groups.
5826 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5827
5828 // Idle sockets are closed.
5829 EXPECT_EQ(0, pool_->IdleSocketCount());
5830 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5831 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5832
5833 // The active socket, however, continues to be active.
5834 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5835 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5836
5837 // Closing it does not make it available for the pool.
5838 handle1.Reset();
5839 EXPECT_EQ(0, pool_->IdleSocketCount());
5840 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5841}
5842
5843TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5844 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5845
5846 const ClientSocketPool::GroupId kGroupId =
5847 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5848 PrivacyMode::PRIVACY_MODE_DISABLED);
5849 const ClientSocketPool::GroupId kGroupIdPrivacy =
5850 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5851 PrivacyMode::PRIVACY_MODE_ENABLED);
5852 const ClientSocketPool::GroupId kOtherGroupId =
5853 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5854
5855 // Make a socket in each groups.
5856 ClientSocketHandle handle1, handle2, handle3;
5857 TestCompletionCallback callback;
5858 EXPECT_THAT(
5859 handle1.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5860 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5861 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5862 pool_.get(), NetLogWithSource()),
5863 IsOk());
5864 EXPECT_THAT(
5865 handle2.Init(kGroupIdPrivacy, params_, base::nullopt, DEFAULT_PRIORITY,
5866 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5867 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5868 pool_.get(), NetLogWithSource()),
5869 IsOk());
5870 EXPECT_THAT(
5871 handle3.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5872 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5873 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5874 pool_.get(), NetLogWithSource()),
5875 IsOk());
5876 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5877 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5878 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5879 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5880 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5881 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5882
5883 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5884
5885 // Active sockets continue to be active.
5886 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5887 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5888 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5889 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5890 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5891 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5892
5893 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5894 // are unusable.
5895 handle1.Reset();
5896 handle2.Reset();
5897 handle3.Reset();
5898 EXPECT_EQ(1, pool_->IdleSocketCount());
5899 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5900 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5901 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5902 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5903}
5904
[email protected]f6d1d6eb2009-06-24 20:16:095905} // namespace
5906
5907} // namespace net