Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: net/socket/client_socket_pool_base_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/client_socket_pool_base.h" 5 #include "net/socket/client_socket_pool_base.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 const bool ignore_limits_; 111 const bool ignore_limits_;
112 }; 112 };
113 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; 113 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
114 114
115 class MockClientSocket : public StreamSocket { 115 class MockClientSocket : public StreamSocket {
116 public: 116 public:
117 explicit MockClientSocket(net::NetLog* net_log) 117 explicit MockClientSocket(net::NetLog* net_log)
118 : connected_(false), 118 : connected_(false),
119 has_unread_data_(false), 119 has_unread_data_(false),
120 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)), 120 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)),
121 was_used_to_convey_data_(false) { 121 was_used_to_convey_data_(false) {}
122 }
123 122
124 // Sets whether the socket has unread data. If true, the next call to Read() 123 // Sets whether the socket has unread data. If true, the next call to Read()
125 // will return 1 byte and IsConnectedAndIdle() will return false. 124 // will return 1 byte and IsConnectedAndIdle() will return false.
126 void set_has_unread_data(bool has_unread_data) { 125 void set_has_unread_data(bool has_unread_data) {
127 has_unread_data_ = has_unread_data; 126 has_unread_data_ = has_unread_data;
128 } 127 }
129 128
130 // Socket implementation. 129 // Socket implementation.
131 virtual int Read( 130 virtual int Read(IOBuffer* /* buf */,
132 IOBuffer* /* buf */, int len, 131 int len,
133 const CompletionCallback& /* callback */) OVERRIDE { 132 const CompletionCallback& /* callback */) OVERRIDE {
134 if (has_unread_data_ && len > 0) { 133 if (has_unread_data_ && len > 0) {
135 has_unread_data_ = false; 134 has_unread_data_ = false;
136 was_used_to_convey_data_ = true; 135 was_used_to_convey_data_ = true;
137 return 1; 136 return 1;
138 } 137 }
139 return ERR_UNEXPECTED; 138 return ERR_UNEXPECTED;
140 } 139 }
141 140
142 virtual int Write( 141 virtual int Write(IOBuffer* /* buf */,
143 IOBuffer* /* buf */, int len, 142 int len,
144 const CompletionCallback& /* callback */) OVERRIDE { 143 const CompletionCallback& /* callback */) OVERRIDE {
145 was_used_to_convey_data_ = true; 144 was_used_to_convey_data_ = true;
146 return len; 145 return len;
147 } 146 }
148 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } 147 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; }
149 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } 148 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; }
150 149
151 // StreamSocket implementation. 150 // StreamSocket implementation.
152 virtual int Connect(const CompletionCallback& callback) OVERRIDE { 151 virtual int Connect(const CompletionCallback& callback) OVERRIDE {
153 connected_ = true; 152 connected_ = true;
154 return OK; 153 return OK;
155 } 154 }
156 155
157 virtual void Disconnect() OVERRIDE { connected_ = false; } 156 virtual void Disconnect() OVERRIDE { connected_ = false; }
158 virtual bool IsConnected() const OVERRIDE { return connected_; } 157 virtual bool IsConnected() const OVERRIDE { return connected_; }
159 virtual bool IsConnectedAndIdle() const OVERRIDE { 158 virtual bool IsConnectedAndIdle() const OVERRIDE {
160 return connected_ && !has_unread_data_; 159 return connected_ && !has_unread_data_;
161 } 160 }
162 161
163 virtual int GetPeerAddress(IPEndPoint* /* address */) const OVERRIDE { 162 virtual int GetPeerAddress(IPEndPoint* /* address */) const OVERRIDE {
164 return ERR_UNEXPECTED; 163 return ERR_UNEXPECTED;
165 } 164 }
166 165
167 virtual int GetLocalAddress(IPEndPoint* /* address */) const OVERRIDE { 166 virtual int GetLocalAddress(IPEndPoint* /* address */) const OVERRIDE {
168 return ERR_UNEXPECTED; 167 return ERR_UNEXPECTED;
169 } 168 }
170 169
171 virtual const BoundNetLog& NetLog() const OVERRIDE { 170 virtual const BoundNetLog& NetLog() const OVERRIDE { return net_log_; }
172 return net_log_;
173 }
174 171
175 virtual void SetSubresourceSpeculation() OVERRIDE {} 172 virtual void SetSubresourceSpeculation() OVERRIDE {}
176 virtual void SetOmniboxSpeculation() OVERRIDE {} 173 virtual void SetOmniboxSpeculation() OVERRIDE {}
177 virtual bool WasEverUsed() const OVERRIDE { 174 virtual bool WasEverUsed() const OVERRIDE { return was_used_to_convey_data_; }
178 return was_used_to_convey_data_;
179 }
180 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } 175 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; }
181 virtual bool WasNpnNegotiated() const OVERRIDE { 176 virtual bool WasNpnNegotiated() const OVERRIDE { return false; }
182 return false;
183 }
184 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { 177 virtual NextProto GetNegotiatedProtocol() const OVERRIDE {
185 return kProtoUnknown; 178 return kProtoUnknown;
186 } 179 }
187 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { 180 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { return false; }
188 return false;
189 }
190 181
191 private: 182 private:
192 bool connected_; 183 bool connected_;
193 bool has_unread_data_; 184 bool has_unread_data_;
194 BoundNetLog net_log_; 185 BoundNetLog net_log_;
195 bool was_used_to_convey_data_; 186 bool was_used_to_convey_data_;
196 187
197 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); 188 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
198 }; 189 };
199 190
(...skipping 22 matching lines...) Expand all
222 213
223 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket( 214 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
224 scoped_ptr<ClientSocketHandle> transport_socket, 215 scoped_ptr<ClientSocketHandle> transport_socket,
225 const HostPortPair& host_and_port, 216 const HostPortPair& host_and_port,
226 const SSLConfig& ssl_config, 217 const SSLConfig& ssl_config,
227 const SSLClientSocketContext& context) OVERRIDE { 218 const SSLClientSocketContext& context) OVERRIDE {
228 NOTIMPLEMENTED(); 219 NOTIMPLEMENTED();
229 return scoped_ptr<SSLClientSocket>(); 220 return scoped_ptr<SSLClientSocket>();
230 } 221 }
231 222
232 virtual void ClearSSLSessionCache() OVERRIDE { 223 virtual void ClearSSLSessionCache() OVERRIDE { NOTIMPLEMENTED(); }
233 NOTIMPLEMENTED();
234 }
235 224
236 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } 225 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
237 226
238 void SignalJobs(); 227 void SignalJobs();
239 228
240 void SignalJob(size_t job); 229 void SignalJob(size_t job);
241 230
242 void SetJobLoadState(size_t job, LoadState load_state); 231 void SetJobLoadState(size_t job, LoadState load_state);
243 232
244 int allocation_count() const { return allocation_count_; } 233 int allocation_count() const { return allocation_count_; }
(...skipping 22 matching lines...) Expand all
267 // to complete. 256 // to complete.
268 static const int kPendingConnectDelay = 2; 257 static const int kPendingConnectDelay = 2;
269 258
270 TestConnectJob(JobType job_type, 259 TestConnectJob(JobType job_type,
271 const std::string& group_name, 260 const std::string& group_name,
272 const TestClientSocketPoolBase::Request& request, 261 const TestClientSocketPoolBase::Request& request,
273 base::TimeDelta timeout_duration, 262 base::TimeDelta timeout_duration,
274 ConnectJob::Delegate* delegate, 263 ConnectJob::Delegate* delegate,
275 MockClientSocketFactory* client_socket_factory, 264 MockClientSocketFactory* client_socket_factory,
276 NetLog* net_log) 265 NetLog* net_log)
277 : ConnectJob(group_name, timeout_duration, request.priority(), delegate, 266 : ConnectJob(group_name,
267 timeout_duration,
268 request.priority(),
269 delegate,
278 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 270 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
279 job_type_(job_type), 271 job_type_(job_type),
280 client_socket_factory_(client_socket_factory), 272 client_socket_factory_(client_socket_factory),
281 load_state_(LOAD_STATE_IDLE), 273 load_state_(LOAD_STATE_IDLE),
282 store_additional_error_state_(false), 274 store_additional_error_state_(false),
283 weak_factory_(this) { 275 weak_factory_(this) {}
284 }
285 276
286 void Signal() { 277 void Signal() {
287 DoConnect(waiting_success_, true /* async */, false /* recoverable */); 278 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
288 } 279 }
289 280
290 void set_load_state(LoadState load_state) { load_state_ = load_state; } 281 void set_load_state(LoadState load_state) { load_state_ = load_state; }
291 282
292 // From ConnectJob: 283 // From ConnectJob:
293 284
294 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; } 285 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; }
(...skipping 12 matching lines...) Expand all
307 // From ConnectJob: 298 // From ConnectJob:
308 299
309 virtual int ConnectInternal() OVERRIDE { 300 virtual int ConnectInternal() OVERRIDE {
310 AddressList ignored; 301 AddressList ignored;
311 client_socket_factory_->CreateTransportClientSocket( 302 client_socket_factory_->CreateTransportClientSocket(
312 ignored, NULL, net::NetLog::Source()); 303 ignored, NULL, net::NetLog::Source());
313 SetSocket( 304 SetSocket(
314 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log()))); 305 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log())));
315 switch (job_type_) { 306 switch (job_type_) {
316 case kMockJob: 307 case kMockJob:
317 return DoConnect(true /* successful */, false /* sync */, 308 return DoConnect(
318 false /* recoverable */); 309 true /* successful */, false /* sync */, false /* recoverable */);
319 case kMockFailingJob: 310 case kMockFailingJob:
320 return DoConnect(false /* error */, false /* sync */, 311 return DoConnect(
321 false /* recoverable */); 312 false /* error */, false /* sync */, false /* recoverable */);
322 case kMockPendingJob: 313 case kMockPendingJob:
323 set_load_state(LOAD_STATE_CONNECTING); 314 set_load_state(LOAD_STATE_CONNECTING);
324 315
325 // Depending on execution timings, posting a delayed task can result 316 // Depending on execution timings, posting a delayed task can result
326 // in the task getting executed the at the earliest possible 317 // in the task getting executed the at the earliest possible
327 // opportunity or only after returning once from the message loop and 318 // opportunity or only after returning once from the message loop and
328 // then a second call into the message loop. In order to make behavior 319 // then a second call into the message loop. In order to make behavior
329 // more deterministic, we change the default delay to 2ms. This should 320 // more deterministic, we change the default delay to 2ms. This should
330 // always require us to wait for the second call into the message loop. 321 // always require us to wait for the second call into the message loop.
331 // 322 //
(...skipping 10 matching lines...) Expand all
342 false /* recoverable */), 333 false /* recoverable */),
343 base::TimeDelta::FromMilliseconds(kPendingConnectDelay)); 334 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
344 return ERR_IO_PENDING; 335 return ERR_IO_PENDING;
345 case kMockPendingFailingJob: 336 case kMockPendingFailingJob:
346 set_load_state(LOAD_STATE_CONNECTING); 337 set_load_state(LOAD_STATE_CONNECTING);
347 base::MessageLoop::current()->PostDelayedTask( 338 base::MessageLoop::current()->PostDelayedTask(
348 FROM_HERE, 339 FROM_HERE,
349 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 340 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
350 weak_factory_.GetWeakPtr(), 341 weak_factory_.GetWeakPtr(),
351 false /* error */, 342 false /* error */,
352 true /* async */, 343 true /* async */,
353 false /* recoverable */), 344 false /* recoverable */),
354 base::TimeDelta::FromMilliseconds(2)); 345 base::TimeDelta::FromMilliseconds(2));
355 return ERR_IO_PENDING; 346 return ERR_IO_PENDING;
356 case kMockWaitingJob: 347 case kMockWaitingJob:
357 set_load_state(LOAD_STATE_CONNECTING); 348 set_load_state(LOAD_STATE_CONNECTING);
358 client_socket_factory_->WaitForSignal(this); 349 client_socket_factory_->WaitForSignal(this);
359 waiting_success_ = true; 350 waiting_success_ = true;
360 return ERR_IO_PENDING; 351 return ERR_IO_PENDING;
361 case kMockRecoverableJob: 352 case kMockRecoverableJob:
362 return DoConnect(false /* error */, false /* sync */, 353 return DoConnect(
363 true /* recoverable */); 354 false /* error */, false /* sync */, true /* recoverable */);
364 case kMockPendingRecoverableJob: 355 case kMockPendingRecoverableJob:
365 set_load_state(LOAD_STATE_CONNECTING); 356 set_load_state(LOAD_STATE_CONNECTING);
366 base::MessageLoop::current()->PostDelayedTask( 357 base::MessageLoop::current()->PostDelayedTask(
367 FROM_HERE, 358 FROM_HERE,
368 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 359 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
369 weak_factory_.GetWeakPtr(), 360 weak_factory_.GetWeakPtr(),
370 false /* error */, 361 false /* error */,
371 true /* async */, 362 true /* async */,
372 true /* recoverable */), 363 true /* recoverable */),
373 base::TimeDelta::FromMilliseconds(2)); 364 base::TimeDelta::FromMilliseconds(2));
374 return ERR_IO_PENDING; 365 return ERR_IO_PENDING;
375 case kMockAdditionalErrorStateJob: 366 case kMockAdditionalErrorStateJob:
376 store_additional_error_state_ = true; 367 store_additional_error_state_ = true;
377 return DoConnect(false /* error */, false /* sync */, 368 return DoConnect(
378 false /* recoverable */); 369 false /* error */, false /* sync */, false /* recoverable */);
379 case kMockPendingAdditionalErrorStateJob: 370 case kMockPendingAdditionalErrorStateJob:
380 set_load_state(LOAD_STATE_CONNECTING); 371 set_load_state(LOAD_STATE_CONNECTING);
381 store_additional_error_state_ = true; 372 store_additional_error_state_ = true;
382 base::MessageLoop::current()->PostDelayedTask( 373 base::MessageLoop::current()->PostDelayedTask(
383 FROM_HERE, 374 FROM_HERE,
384 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 375 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
385 weak_factory_.GetWeakPtr(), 376 weak_factory_.GetWeakPtr(),
386 false /* error */, 377 false /* error */,
387 true /* async */, 378 true /* async */,
388 false /* recoverable */), 379 false /* recoverable */),
389 base::TimeDelta::FromMilliseconds(2)); 380 base::TimeDelta::FromMilliseconds(2));
390 return ERR_IO_PENDING; 381 return ERR_IO_PENDING;
391 case kMockUnreadDataJob: { 382 case kMockUnreadDataJob: {
392 int ret = DoConnect(true /* successful */, false /* sync */, 383 int ret = DoConnect(
393 false /* recoverable */); 384 true /* successful */, false /* sync */, false /* recoverable */);
394 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true); 385 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
395 return ret; 386 return ret;
396 } 387 }
397 default: 388 default:
398 NOTREACHED(); 389 NOTREACHED();
399 SetSocket(scoped_ptr<StreamSocket>()); 390 SetSocket(scoped_ptr<StreamSocket>());
400 return ERR_FAILED; 391 return ERR_FAILED;
401 } 392 }
402 } 393 }
403 394
(...skipping 25 matching lines...) Expand all
429 }; 420 };
430 421
431 class TestConnectJobFactory 422 class TestConnectJobFactory
432 : public TestClientSocketPoolBase::ConnectJobFactory { 423 : public TestClientSocketPoolBase::ConnectJobFactory {
433 public: 424 public:
434 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory, 425 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
435 NetLog* net_log) 426 NetLog* net_log)
436 : job_type_(TestConnectJob::kMockJob), 427 : job_type_(TestConnectJob::kMockJob),
437 job_types_(NULL), 428 job_types_(NULL),
438 client_socket_factory_(client_socket_factory), 429 client_socket_factory_(client_socket_factory),
439 net_log_(net_log) { 430 net_log_(net_log) {}
440 }
441 431
442 virtual ~TestConnectJobFactory() {} 432 virtual ~TestConnectJobFactory() {}
443 433
444 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } 434 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
445 435
446 void set_job_types(std::list<TestConnectJob::JobType>* job_types) { 436 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
447 job_types_ = job_types; 437 job_types_ = job_types;
448 CHECK(!job_types_->empty()); 438 CHECK(!job_types_->empty());
449 } 439 }
450 440
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 public: 481 public:
492 typedef TestSocketParams SocketParams; 482 typedef TestSocketParams SocketParams;
493 483
494 TestClientSocketPool( 484 TestClientSocketPool(
495 int max_sockets, 485 int max_sockets,
496 int max_sockets_per_group, 486 int max_sockets_per_group,
497 ClientSocketPoolHistograms* histograms, 487 ClientSocketPoolHistograms* histograms,
498 base::TimeDelta unused_idle_socket_timeout, 488 base::TimeDelta unused_idle_socket_timeout,
499 base::TimeDelta used_idle_socket_timeout, 489 base::TimeDelta used_idle_socket_timeout,
500 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) 490 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
501 : base_(NULL, max_sockets, max_sockets_per_group, histograms, 491 : base_(NULL,
502 unused_idle_socket_timeout, used_idle_socket_timeout, 492 max_sockets,
493 max_sockets_per_group,
494 histograms,
495 unused_idle_socket_timeout,
496 used_idle_socket_timeout,
503 connect_job_factory) {} 497 connect_job_factory) {}
504 498
505 virtual ~TestClientSocketPool() {} 499 virtual ~TestClientSocketPool() {}
506 500
507 virtual int RequestSocket( 501 virtual int RequestSocket(const std::string& group_name,
508 const std::string& group_name, 502 const void* params,
509 const void* params, 503 net::RequestPriority priority,
510 net::RequestPriority priority, 504 ClientSocketHandle* handle,
511 ClientSocketHandle* handle, 505 const CompletionCallback& callback,
512 const CompletionCallback& callback, 506 const BoundNetLog& net_log) OVERRIDE {
513 const BoundNetLog& net_log) OVERRIDE {
514 const scoped_refptr<TestSocketParams>* casted_socket_params = 507 const scoped_refptr<TestSocketParams>* casted_socket_params =
515 static_cast<const scoped_refptr<TestSocketParams>*>(params); 508 static_cast<const scoped_refptr<TestSocketParams>*>(params);
516 return base_.RequestSocket(group_name, *casted_socket_params, priority, 509 return base_.RequestSocket(
517 handle, callback, net_log); 510 group_name, *casted_socket_params, priority, handle, callback, net_log);
518 } 511 }
519 512
520 virtual void RequestSockets(const std::string& group_name, 513 virtual void RequestSockets(const std::string& group_name,
521 const void* params, 514 const void* params,
522 int num_sockets, 515 int num_sockets,
523 const BoundNetLog& net_log) OVERRIDE { 516 const BoundNetLog& net_log) OVERRIDE {
524 const scoped_refptr<TestSocketParams>* casted_params = 517 const scoped_refptr<TestSocketParams>* casted_params =
525 static_cast<const scoped_refptr<TestSocketParams>*>(params); 518 static_cast<const scoped_refptr<TestSocketParams>*>(params);
526 519
527 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); 520 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
528 } 521 }
529 522
530 virtual void CancelRequest( 523 virtual void CancelRequest(const std::string& group_name,
531 const std::string& group_name, 524 ClientSocketHandle* handle) OVERRIDE {
532 ClientSocketHandle* handle) OVERRIDE {
533 base_.CancelRequest(group_name, handle); 525 base_.CancelRequest(group_name, handle);
534 } 526 }
535 527
536 virtual void ReleaseSocket( 528 virtual void ReleaseSocket(const std::string& group_name,
537 const std::string& group_name, 529 scoped_ptr<StreamSocket> socket,
538 scoped_ptr<StreamSocket> socket, 530 int id) OVERRIDE {
539 int id) OVERRIDE {
540 base_.ReleaseSocket(group_name, socket.Pass(), id); 531 base_.ReleaseSocket(group_name, socket.Pass(), id);
541 } 532 }
542 533
543 virtual void FlushWithError(int error) OVERRIDE { 534 virtual void FlushWithError(int error) OVERRIDE {
544 base_.FlushWithError(error); 535 base_.FlushWithError(error);
545 } 536 }
546 537
547 virtual bool IsStalled() const OVERRIDE { 538 virtual bool IsStalled() const OVERRIDE { return base_.IsStalled(); }
548 return base_.IsStalled();
549 }
550 539
551 virtual void CloseIdleSockets() OVERRIDE { 540 virtual void CloseIdleSockets() OVERRIDE { base_.CloseIdleSockets(); }
552 base_.CloseIdleSockets();
553 }
554 541
555 virtual int IdleSocketCount() const OVERRIDE { 542 virtual int IdleSocketCount() const OVERRIDE {
556 return base_.idle_socket_count(); 543 return base_.idle_socket_count();
557 } 544 }
558 545
559 virtual int IdleSocketCountInGroup( 546 virtual int IdleSocketCountInGroup(
560 const std::string& group_name) const OVERRIDE { 547 const std::string& group_name) const OVERRIDE {
561 return base_.IdleSocketCountInGroup(group_name); 548 return base_.IdleSocketCountInGroup(group_name);
562 } 549 }
563 550
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 609
623 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); 610 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
624 }; 611 };
625 612
626 } // namespace 613 } // namespace
627 614
628 namespace { 615 namespace {
629 616
630 void MockClientSocketFactory::SignalJobs() { 617 void MockClientSocketFactory::SignalJobs() {
631 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); 618 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
632 it != waiting_jobs_.end(); ++it) { 619 it != waiting_jobs_.end();
620 ++it) {
633 (*it)->Signal(); 621 (*it)->Signal();
634 } 622 }
635 waiting_jobs_.clear(); 623 waiting_jobs_.clear();
636 } 624 }
637 625
638 void MockClientSocketFactory::SignalJob(size_t job) { 626 void MockClientSocketFactory::SignalJob(size_t job) {
639 ASSERT_LT(job, waiting_jobs_.size()); 627 ASSERT_LT(job, waiting_jobs_.size());
640 waiting_jobs_[job]->Signal(); 628 waiting_jobs_[job]->Signal();
641 waiting_jobs_.erase(waiting_jobs_.begin() + job); 629 waiting_jobs_.erase(waiting_jobs_.begin() + job);
642 } 630 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 } 682 }
695 683
696 virtual ~ClientSocketPoolBaseTest() { 684 virtual ~ClientSocketPoolBaseTest() {
697 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( 685 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
698 connect_backup_jobs_enabled_); 686 connect_backup_jobs_enabled_);
699 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled( 687 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(
700 cleanup_timer_enabled_); 688 cleanup_timer_enabled_);
701 } 689 }
702 690
703 void CreatePool(int max_sockets, int max_sockets_per_group) { 691 void CreatePool(int max_sockets, int max_sockets_per_group) {
704 CreatePoolWithIdleTimeouts( 692 CreatePoolWithIdleTimeouts(max_sockets,
705 max_sockets, 693 max_sockets_per_group,
706 max_sockets_per_group, 694 ClientSocketPool::unused_idle_socket_timeout(),
707 ClientSocketPool::unused_idle_socket_timeout(), 695 ClientSocketPool::used_idle_socket_timeout());
708 ClientSocketPool::used_idle_socket_timeout());
709 } 696 }
710 697
711 void CreatePoolWithIdleTimeouts( 698 void CreatePoolWithIdleTimeouts(int max_sockets,
712 int max_sockets, int max_sockets_per_group, 699 int max_sockets_per_group,
713 base::TimeDelta unused_idle_socket_timeout, 700 base::TimeDelta unused_idle_socket_timeout,
714 base::TimeDelta used_idle_socket_timeout) { 701 base::TimeDelta used_idle_socket_timeout) {
715 DCHECK(!pool_.get()); 702 DCHECK(!pool_.get());
716 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, 703 connect_job_factory_ =
717 &net_log_); 704 new TestConnectJobFactory(&client_socket_factory_, &net_log_);
718 pool_.reset(new TestClientSocketPool(max_sockets, 705 pool_.reset(new TestClientSocketPool(max_sockets,
719 max_sockets_per_group, 706 max_sockets_per_group,
720 &histograms_, 707 &histograms_,
721 unused_idle_socket_timeout, 708 unused_idle_socket_timeout,
722 used_idle_socket_timeout, 709 used_idle_socket_timeout,
723 connect_job_factory_)); 710 connect_job_factory_));
724 } 711 }
725 712
726 int StartRequestWithParams( 713 int StartRequestWithParams(const std::string& group_name,
727 const std::string& group_name, 714 RequestPriority priority,
728 RequestPriority priority, 715 const scoped_refptr<TestSocketParams>& params) {
729 const scoped_refptr<TestSocketParams>& params) {
730 return test_base_.StartRequestUsingPool( 716 return test_base_.StartRequestUsingPool(
731 pool_.get(), group_name, priority, params); 717 pool_.get(), group_name, priority, params);
732 } 718 }
733 719
734 int StartRequest(const std::string& group_name, RequestPriority priority) { 720 int StartRequest(const std::string& group_name, RequestPriority priority) {
735 return StartRequestWithParams(group_name, priority, params_); 721 return StartRequestWithParams(group_name, priority, params_);
736 } 722 }
737 723
738 int GetOrderOfRequest(size_t index) const { 724 int GetOrderOfRequest(size_t index) const {
739 return test_base_.GetOrderOfRequest(index); 725 return test_base_.GetOrderOfRequest(index);
(...skipping 22 matching lines...) Expand all
762 scoped_ptr<TestClientSocketPool> pool_; 748 scoped_ptr<TestClientSocketPool> pool_;
763 ClientSocketPoolTest test_base_; 749 ClientSocketPoolTest test_base_;
764 }; 750 };
765 751
766 // Even though a timeout is specified, it doesn't time out on a synchronous 752 // Even though a timeout is specified, it doesn't time out on a synchronous
767 // completion. 753 // completion.
768 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { 754 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
769 TestConnectJobDelegate delegate; 755 TestConnectJobDelegate delegate;
770 ClientSocketHandle ignored; 756 ClientSocketHandle ignored;
771 TestClientSocketPoolBase::Request request( 757 TestClientSocketPoolBase::Request request(
772 &ignored, CompletionCallback(), DEFAULT_PRIORITY, 758 &ignored,
759 CompletionCallback(),
760 DEFAULT_PRIORITY,
773 internal::ClientSocketPoolBaseHelper::NORMAL, 761 internal::ClientSocketPoolBaseHelper::NORMAL,
774 false, params_, BoundNetLog()); 762 false,
763 params_,
764 BoundNetLog());
775 scoped_ptr<TestConnectJob> job( 765 scoped_ptr<TestConnectJob> job(
776 new TestConnectJob(TestConnectJob::kMockJob, 766 new TestConnectJob(TestConnectJob::kMockJob,
777 "a", 767 "a",
778 request, 768 request,
779 base::TimeDelta::FromMicroseconds(1), 769 base::TimeDelta::FromMicroseconds(1),
780 &delegate, 770 &delegate,
781 &client_socket_factory_, 771 &client_socket_factory_,
782 NULL)); 772 NULL));
783 EXPECT_EQ(OK, job->Connect()); 773 EXPECT_EQ(OK, job->Connect());
784 } 774 }
785 775
786 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { 776 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
787 TestConnectJobDelegate delegate; 777 TestConnectJobDelegate delegate;
788 ClientSocketHandle ignored; 778 ClientSocketHandle ignored;
789 CapturingNetLog log; 779 CapturingNetLog log;
790 780
791 TestClientSocketPoolBase::Request request( 781 TestClientSocketPoolBase::Request request(
792 &ignored, CompletionCallback(), DEFAULT_PRIORITY, 782 &ignored,
783 CompletionCallback(),
784 DEFAULT_PRIORITY,
793 internal::ClientSocketPoolBaseHelper::NORMAL, 785 internal::ClientSocketPoolBaseHelper::NORMAL,
794 false, params_, BoundNetLog()); 786 false,
787 params_,
788 BoundNetLog());
795 // Deleted by TestConnectJobDelegate. 789 // Deleted by TestConnectJobDelegate.
796 TestConnectJob* job = 790 TestConnectJob* job = new TestConnectJob(TestConnectJob::kMockPendingJob,
797 new TestConnectJob(TestConnectJob::kMockPendingJob, 791 "a",
798 "a", 792 request,
799 request, 793 base::TimeDelta::FromMicroseconds(1),
800 base::TimeDelta::FromMicroseconds(1), 794 &delegate,
801 &delegate, 795 &client_socket_factory_,
802 &client_socket_factory_, 796 &log);
803 &log);
804 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); 797 ASSERT_EQ(ERR_IO_PENDING, job->Connect());
805 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); 798 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
806 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); 799 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult());
807 800
808 CapturingNetLog::CapturedEntryList entries; 801 CapturingNetLog::CapturedEntryList entries;
809 log.GetEntries(&entries); 802 log.GetEntries(&entries);
810 803
811 EXPECT_EQ(6u, entries.size()); 804 EXPECT_EQ(6u, entries.size());
812 EXPECT_TRUE(LogContainsBeginEvent( 805 EXPECT_TRUE(
813 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 806 LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB));
814 EXPECT_TRUE(LogContainsBeginEvent( 807 EXPECT_TRUE(LogContainsBeginEvent(
815 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); 808 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT));
816 EXPECT_TRUE(LogContainsEvent( 809 EXPECT_TRUE(LogContainsEvent(
817 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, 810 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, NetLog::PHASE_NONE));
818 NetLog::PHASE_NONE)); 811 EXPECT_TRUE(LogContainsEvent(entries,
819 EXPECT_TRUE(LogContainsEvent( 812 3,
820 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, 813 NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
821 NetLog::PHASE_NONE)); 814 NetLog::PHASE_NONE));
822 EXPECT_TRUE(LogContainsEndEvent( 815 EXPECT_TRUE(LogContainsEndEvent(
823 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); 816 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT));
824 EXPECT_TRUE(LogContainsEndEvent( 817 EXPECT_TRUE(
825 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 818 LogContainsEndEvent(entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB));
826 } 819 }
827 820
828 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { 821 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
829 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 822 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
830 823
831 TestCompletionCallback callback; 824 TestCompletionCallback callback;
832 ClientSocketHandle handle; 825 ClientSocketHandle handle;
833 CapturingBoundNetLog log; 826 CapturingBoundNetLog log;
834 TestLoadTimingInfoNotConnected(handle); 827 TestLoadTimingInfoNotConnected(handle);
835 828
836 EXPECT_EQ(OK, 829 EXPECT_EQ(OK,
837 handle.Init("a", 830 handle.Init("a",
838 params_, 831 params_,
839 DEFAULT_PRIORITY, 832 DEFAULT_PRIORITY,
840 callback.callback(), 833 callback.callback(),
841 pool_.get(), 834 pool_.get(),
842 log.bound())); 835 log.bound()));
843 EXPECT_TRUE(handle.is_initialized()); 836 EXPECT_TRUE(handle.is_initialized());
844 EXPECT_TRUE(handle.socket()); 837 EXPECT_TRUE(handle.socket());
845 TestLoadTimingInfoConnectedNotReused(handle); 838 TestLoadTimingInfoConnectedNotReused(handle);
846 839
847 handle.Reset(); 840 handle.Reset();
848 TestLoadTimingInfoNotConnected(handle); 841 TestLoadTimingInfoNotConnected(handle);
849 842
850 CapturingNetLog::CapturedEntryList entries; 843 CapturingNetLog::CapturedEntryList entries;
851 log.GetEntries(&entries); 844 log.GetEntries(&entries);
852 845
853 EXPECT_EQ(4u, entries.size()); 846 EXPECT_EQ(4u, entries.size());
854 EXPECT_TRUE(LogContainsBeginEvent( 847 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL));
855 entries, 0, NetLog::TYPE_SOCKET_POOL)); 848 EXPECT_TRUE(LogContainsEvent(entries,
856 EXPECT_TRUE(LogContainsEvent( 849 1,
857 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 850 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
858 NetLog::PHASE_NONE)); 851 NetLog::PHASE_NONE));
859 EXPECT_TRUE(LogContainsEvent( 852 EXPECT_TRUE(LogContainsEvent(entries,
860 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 853 2,
861 NetLog::PHASE_NONE)); 854 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
862 EXPECT_TRUE(LogContainsEndEvent( 855 NetLog::PHASE_NONE));
863 entries, 3, NetLog::TYPE_SOCKET_POOL)); 856 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLog::TYPE_SOCKET_POOL));
864 } 857 }
865 858
866 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { 859 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 860 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
868 861
869 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 862 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
870 CapturingBoundNetLog log; 863 CapturingBoundNetLog log;
871 864
872 ClientSocketHandle handle; 865 ClientSocketHandle handle;
873 TestCompletionCallback callback; 866 TestCompletionCallback callback;
(...skipping 11 matching lines...) Expand all
885 log.bound())); 878 log.bound()));
886 EXPECT_FALSE(handle.socket()); 879 EXPECT_FALSE(handle.socket());
887 EXPECT_FALSE(handle.is_ssl_error()); 880 EXPECT_FALSE(handle.is_ssl_error());
888 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 881 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
889 TestLoadTimingInfoNotConnected(handle); 882 TestLoadTimingInfoNotConnected(handle);
890 883
891 CapturingNetLog::CapturedEntryList entries; 884 CapturingNetLog::CapturedEntryList entries;
892 log.GetEntries(&entries); 885 log.GetEntries(&entries);
893 886
894 EXPECT_EQ(3u, entries.size()); 887 EXPECT_EQ(3u, entries.size());
895 EXPECT_TRUE(LogContainsBeginEvent( 888 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL));
896 entries, 0, NetLog::TYPE_SOCKET_POOL)); 889 EXPECT_TRUE(LogContainsEvent(entries,
897 EXPECT_TRUE(LogContainsEvent( 890 1,
898 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 891 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
899 NetLog::PHASE_NONE)); 892 NetLog::PHASE_NONE));
900 EXPECT_TRUE(LogContainsEndEvent( 893 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLog::TYPE_SOCKET_POOL));
901 entries, 2, NetLog::TYPE_SOCKET_POOL));
902 } 894 }
903 895
904 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { 896 TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 897 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
906 898
907 // TODO(eroman): Check that the NetLog contains this event. 899 // TODO(eroman): Check that the NetLog contains this event.
908 900
909 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 901 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
910 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 902 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
911 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); 903 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY));
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1144 } 1136 }
1145 1137
1146 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { 1138 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
1147 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1148 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1140 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1149 1141
1150 { 1142 {
1151 ClientSocketHandle handles[kDefaultMaxSockets]; 1143 ClientSocketHandle handles[kDefaultMaxSockets];
1152 TestCompletionCallback callbacks[kDefaultMaxSockets]; 1144 TestCompletionCallback callbacks[kDefaultMaxSockets];
1153 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1145 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1154 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), 1146 EXPECT_EQ(OK,
1155 params_, 1147 handles[i].Init(base::IntToString(i),
1156 DEFAULT_PRIORITY, 1148 params_,
1157 callbacks[i].callback(), 1149 DEFAULT_PRIORITY,
1158 pool_.get(), 1150 callbacks[i].callback(),
1159 BoundNetLog())); 1151 pool_.get(),
1152 BoundNetLog()));
1160 } 1153 }
1161 1154
1162 // Force a stalled group. 1155 // Force a stalled group.
1163 ClientSocketHandle stalled_handle; 1156 ClientSocketHandle stalled_handle;
1164 TestCompletionCallback callback; 1157 TestCompletionCallback callback;
1165 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1158 EXPECT_EQ(ERR_IO_PENDING,
1166 params_, 1159 stalled_handle.Init("foo",
1167 DEFAULT_PRIORITY, 1160 params_,
1168 callback.callback(), 1161 DEFAULT_PRIORITY,
1169 pool_.get(), 1162 callback.callback(),
1170 BoundNetLog())); 1163 pool_.get(),
1164 BoundNetLog()));
1171 1165
1172 // Cancel the stalled request. 1166 // Cancel the stalled request.
1173 stalled_handle.Reset(); 1167 stalled_handle.Reset();
1174 1168
1175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1169 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1176 EXPECT_EQ(0, pool_->IdleSocketCount()); 1170 EXPECT_EQ(0, pool_->IdleSocketCount());
1177 1171
1178 // Dropping out of scope will close all handles and return them to idle. 1172 // Dropping out of scope will close all handles and return them to idle.
1179 } 1173 }
1180 1174
1181 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1182 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); 1176 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
1183 } 1177 }
1184 1178
1185 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { 1179 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1186 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1180 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1187 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1181 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1188 1182
1189 { 1183 {
1190 ClientSocketHandle handles[kDefaultMaxSockets]; 1184 ClientSocketHandle handles[kDefaultMaxSockets];
1191 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1185 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1192 TestCompletionCallback callback; 1186 TestCompletionCallback callback;
1193 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), 1187 EXPECT_EQ(ERR_IO_PENDING,
1194 params_, 1188 handles[i].Init(base::IntToString(i),
1195 DEFAULT_PRIORITY, 1189 params_,
1196 callback.callback(), 1190 DEFAULT_PRIORITY,
1197 pool_.get(), 1191 callback.callback(),
1198 BoundNetLog())); 1192 pool_.get(),
1193 BoundNetLog()));
1199 } 1194 }
1200 1195
1201 // Force a stalled group. 1196 // Force a stalled group.
1202 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1197 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1203 ClientSocketHandle stalled_handle; 1198 ClientSocketHandle stalled_handle;
1204 TestCompletionCallback callback; 1199 TestCompletionCallback callback;
1205 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1200 EXPECT_EQ(ERR_IO_PENDING,
1206 params_, 1201 stalled_handle.Init("foo",
1207 DEFAULT_PRIORITY, 1202 params_,
1208 callback.callback(), 1203 DEFAULT_PRIORITY,
1209 pool_.get(), 1204 callback.callback(),
1210 BoundNetLog())); 1205 pool_.get(),
1206 BoundNetLog()));
1211 1207
1212 // Since it is stalled, it should have no connect jobs. 1208 // Since it is stalled, it should have no connect jobs.
1213 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); 1209 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
1214 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); 1210 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
1215 1211
1216 // Cancel the stalled request. 1212 // Cancel the stalled request.
1217 handles[0].Reset(); 1213 handles[0].Reset();
1218 1214
1219 // Now we should have a connect job. 1215 // Now we should have a connect job.
1220 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); 1216 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
(...skipping 18 matching lines...) Expand all
1239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1235 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1240 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1236 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1241 1237
1242 ClientSocketHandle stalled_handle; 1238 ClientSocketHandle stalled_handle;
1243 TestCompletionCallback callback; 1239 TestCompletionCallback callback;
1244 { 1240 {
1245 EXPECT_FALSE(pool_->IsStalled()); 1241 EXPECT_FALSE(pool_->IsStalled());
1246 ClientSocketHandle handles[kDefaultMaxSockets]; 1242 ClientSocketHandle handles[kDefaultMaxSockets];
1247 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1243 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1248 TestCompletionCallback callback; 1244 TestCompletionCallback callback;
1249 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf( 1245 EXPECT_EQ(OK,
1250 "Take 2: %d", i), 1246 handles[i].Init(base::StringPrintf("Take 2: %d", i),
1251 params_, 1247 params_,
1252 DEFAULT_PRIORITY, 1248 DEFAULT_PRIORITY,
1253 callback.callback(), 1249 callback.callback(),
1254 pool_.get(), 1250 pool_.get(),
1255 BoundNetLog())); 1251 BoundNetLog()));
1256 } 1252 }
1257 1253
1258 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1254 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1259 EXPECT_EQ(0, pool_->IdleSocketCount()); 1255 EXPECT_EQ(0, pool_->IdleSocketCount());
1260 EXPECT_FALSE(pool_->IsStalled()); 1256 EXPECT_FALSE(pool_->IsStalled());
1261 1257
1262 // Now we will hit the socket limit. 1258 // Now we will hit the socket limit.
1263 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1259 EXPECT_EQ(ERR_IO_PENDING,
1264 params_, 1260 stalled_handle.Init("foo",
1265 DEFAULT_PRIORITY, 1261 params_,
1266 callback.callback(), 1262 DEFAULT_PRIORITY,
1267 pool_.get(), 1263 callback.callback(),
1268 BoundNetLog())); 1264 pool_.get(),
1265 BoundNetLog()));
1269 EXPECT_TRUE(pool_->IsStalled()); 1266 EXPECT_TRUE(pool_->IsStalled());
1270 1267
1271 // Dropping out of scope will close all handles and return them to idle. 1268 // Dropping out of scope will close all handles and return them to idle.
1272 } 1269 }
1273 1270
1274 // But if we wait for it, the released idle sockets will be closed in 1271 // But if we wait for it, the released idle sockets will be closed in
1275 // preference of the waiting request. 1272 // preference of the waiting request.
1276 EXPECT_EQ(OK, callback.WaitForResult()); 1273 EXPECT_EQ(OK, callback.WaitForResult());
1277 1274
1278 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 1275 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1279 EXPECT_EQ(3, pool_->IdleSocketCount()); 1276 EXPECT_EQ(3, pool_->IdleSocketCount());
1280 } 1277 }
1281 1278
1282 // Regression test for http://crbug.com/40952. 1279 // Regression test for http://crbug.com/40952.
1283 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { 1280 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1281 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1285 pool_->EnableConnectBackupJobs(); 1282 pool_->EnableConnectBackupJobs();
1286 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1283 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1287 1284
1288 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1285 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1289 ClientSocketHandle handle; 1286 ClientSocketHandle handle;
1290 TestCompletionCallback callback; 1287 TestCompletionCallback callback;
1291 EXPECT_EQ(OK, handle.Init(base::IntToString(i), 1288 EXPECT_EQ(OK,
1292 params_, 1289 handle.Init(base::IntToString(i),
1293 DEFAULT_PRIORITY, 1290 params_,
1294 callback.callback(), 1291 DEFAULT_PRIORITY,
1295 pool_.get(), 1292 callback.callback(),
1296 BoundNetLog())); 1293 pool_.get(),
1294 BoundNetLog()));
1297 } 1295 }
1298 1296
1299 // Flush all the DoReleaseSocket tasks. 1297 // Flush all the DoReleaseSocket tasks.
1300 base::MessageLoop::current()->RunUntilIdle(); 1298 base::MessageLoop::current()->RunUntilIdle();
1301 1299
1302 // Stall a group. Set a pending job so it'll trigger a backup job if we don't 1300 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1303 // reuse a socket. 1301 // reuse a socket.
1304 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1302 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1305 ClientSocketHandle handle; 1303 ClientSocketHandle handle;
1306 TestCompletionCallback callback; 1304 TestCompletionCallback callback;
1307 1305
1308 // "0" is special here, since it should be the first entry in the sorted map, 1306 // "0" is special here, since it should be the first entry in the sorted map,
1309 // which is the one which we would close an idle socket for. We shouldn't 1307 // which is the one which we would close an idle socket for. We shouldn't
1310 // close an idle socket though, since we should reuse the idle socket. 1308 // close an idle socket though, since we should reuse the idle socket.
1311 EXPECT_EQ(OK, handle.Init("0", 1309 EXPECT_EQ(OK,
1312 params_, 1310 handle.Init("0",
1313 DEFAULT_PRIORITY, 1311 params_,
1314 callback.callback(), 1312 DEFAULT_PRIORITY,
1315 pool_.get(), 1313 callback.callback(),
1316 BoundNetLog())); 1314 pool_.get(),
1315 BoundNetLog()));
1317 1316
1318 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1317 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1319 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); 1318 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1320 } 1319 }
1321 1320
1322 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { 1321 TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
1323 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1322 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1324 1323
1325 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1324 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1326 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1325 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1327 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); 1326 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE));
1328 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1327 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1329 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1328 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1330 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1329 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1331 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1330 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1332 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1331 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1333 1332
1334 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 1333 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
1335 1334
1336 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1335 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1337 client_socket_factory_.allocation_count()); 1336 client_socket_factory_.allocation_count());
1338 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1337 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, completion_count());
1339 completion_count());
1340 1338
1341 EXPECT_EQ(1, GetOrderOfRequest(1)); 1339 EXPECT_EQ(1, GetOrderOfRequest(1));
1342 EXPECT_EQ(2, GetOrderOfRequest(2)); 1340 EXPECT_EQ(2, GetOrderOfRequest(2));
1343 EXPECT_EQ(8, GetOrderOfRequest(3)); 1341 EXPECT_EQ(8, GetOrderOfRequest(3));
1344 EXPECT_EQ(6, GetOrderOfRequest(4)); 1342 EXPECT_EQ(6, GetOrderOfRequest(4));
1345 EXPECT_EQ(4, GetOrderOfRequest(5)); 1343 EXPECT_EQ(4, GetOrderOfRequest(5));
1346 EXPECT_EQ(3, GetOrderOfRequest(6)); 1344 EXPECT_EQ(3, GetOrderOfRequest(6));
1347 EXPECT_EQ(5, GetOrderOfRequest(7)); 1345 EXPECT_EQ(5, GetOrderOfRequest(7));
1348 EXPECT_EQ(7, GetOrderOfRequest(8)); 1346 EXPECT_EQ(7, GetOrderOfRequest(8));
1349 1347
(...skipping 12 matching lines...) Expand all
1362 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1360 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1363 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1361 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1364 1362
1365 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1363 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1366 1364
1367 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) 1365 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
1368 EXPECT_EQ(OK, request(i)->WaitForResult()); 1366 EXPECT_EQ(OK, request(i)->WaitForResult());
1369 1367
1370 EXPECT_EQ(static_cast<int>(requests_size()), 1368 EXPECT_EQ(static_cast<int>(requests_size()),
1371 client_socket_factory_.allocation_count()); 1369 client_socket_factory_.allocation_count());
1372 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1370 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, completion_count());
1373 completion_count());
1374 } 1371 }
1375 1372
1376 // This test will start up a RequestSocket() and then immediately Cancel() it. 1373 // This test will start up a RequestSocket() and then immediately Cancel() it.
1377 // The pending connect job will be cancelled and should not call back into 1374 // The pending connect job will be cancelled and should not call back into
1378 // ClientSocketPoolBase. 1375 // ClientSocketPoolBase.
1379 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { 1376 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
1380 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1377 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1381 1378
1382 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1379 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1383 ClientSocketHandle handle; 1380 ClientSocketHandle handle;
1384 TestCompletionCallback callback; 1381 TestCompletionCallback callback;
1385 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1382 EXPECT_EQ(ERR_IO_PENDING,
1386 params_, 1383 handle.Init("a",
1387 DEFAULT_PRIORITY, 1384 params_,
1388 callback.callback(), 1385 DEFAULT_PRIORITY,
1389 pool_.get(), 1386 callback.callback(),
1390 BoundNetLog())); 1387 pool_.get(),
1388 BoundNetLog()));
1391 handle.Reset(); 1389 handle.Reset();
1392 } 1390 }
1393 1391
1394 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { 1392 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
1395 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1393 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1396 1394
1397 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1395 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1398 ClientSocketHandle handle; 1396 ClientSocketHandle handle;
1399 TestCompletionCallback callback; 1397 TestCompletionCallback callback;
1400 1398
1401 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1399 EXPECT_EQ(ERR_IO_PENDING,
1402 params_, 1400 handle.Init("a",
1403 DEFAULT_PRIORITY, 1401 params_,
1404 callback.callback(), 1402 DEFAULT_PRIORITY,
1405 pool_.get(), 1403 callback.callback(),
1406 BoundNetLog())); 1404 pool_.get(),
1405 BoundNetLog()));
1407 1406
1408 handle.Reset(); 1407 handle.Reset();
1409 1408
1410 TestCompletionCallback callback2; 1409 TestCompletionCallback callback2;
1411 EXPECT_EQ(ERR_IO_PENDING, 1410 EXPECT_EQ(ERR_IO_PENDING,
1412 handle.Init("a", 1411 handle.Init("a",
1413 params_, 1412 params_,
1414 DEFAULT_PRIORITY, 1413 DEFAULT_PRIORITY,
1415 callback2.callback(), 1414 callback2.callback(),
1416 pool_.get(), 1415 pool_.get(),
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 RequestSocketCallback(ClientSocketHandle* handle, 1462 RequestSocketCallback(ClientSocketHandle* handle,
1464 TestClientSocketPool* pool, 1463 TestClientSocketPool* pool,
1465 TestConnectJobFactory* test_connect_job_factory, 1464 TestConnectJobFactory* test_connect_job_factory,
1466 TestConnectJob::JobType next_job_type) 1465 TestConnectJob::JobType next_job_type)
1467 : handle_(handle), 1466 : handle_(handle),
1468 pool_(pool), 1467 pool_(pool),
1469 within_callback_(false), 1468 within_callback_(false),
1470 test_connect_job_factory_(test_connect_job_factory), 1469 test_connect_job_factory_(test_connect_job_factory),
1471 next_job_type_(next_job_type), 1470 next_job_type_(next_job_type),
1472 callback_(base::Bind(&RequestSocketCallback::OnComplete, 1471 callback_(base::Bind(&RequestSocketCallback::OnComplete,
1473 base::Unretained(this))) { 1472 base::Unretained(this))) {}
1474 }
1475 1473
1476 virtual ~RequestSocketCallback() {} 1474 virtual ~RequestSocketCallback() {}
1477 1475
1478 const CompletionCallback& callback() const { return callback_; } 1476 const CompletionCallback& callback() const { return callback_; }
1479 1477
1480 private: 1478 private:
1481 void OnComplete(int result) { 1479 void OnComplete(int result) {
1482 SetResult(result); 1480 SetResult(result);
1483 ASSERT_EQ(OK, result); 1481 ASSERT_EQ(OK, result);
1484 1482
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 TestConnectJobFactory* const test_connect_job_factory_; 1538 TestConnectJobFactory* const test_connect_job_factory_;
1541 TestConnectJob::JobType next_job_type_; 1539 TestConnectJob::JobType next_job_type_;
1542 CompletionCallback callback_; 1540 CompletionCallback callback_;
1543 }; 1541 };
1544 1542
1545 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { 1543 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
1546 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1544 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1547 1545
1548 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1546 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1549 ClientSocketHandle handle; 1547 ClientSocketHandle handle;
1550 RequestSocketCallback callback( 1548 RequestSocketCallback callback(&handle,
1551 &handle, pool_.get(), connect_job_factory_, 1549 pool_.get(),
1552 TestConnectJob::kMockPendingJob); 1550 connect_job_factory_,
1551 TestConnectJob::kMockPendingJob);
1553 int rv = handle.Init("a", 1552 int rv = handle.Init("a",
1554 params_, 1553 params_,
1555 DEFAULT_PRIORITY, 1554 DEFAULT_PRIORITY,
1556 callback.callback(), 1555 callback.callback(),
1557 pool_.get(), 1556 pool_.get(),
1558 BoundNetLog()); 1557 BoundNetLog());
1559 ASSERT_EQ(ERR_IO_PENDING, rv); 1558 ASSERT_EQ(ERR_IO_PENDING, rv);
1560 1559
1561 EXPECT_EQ(OK, callback.WaitForResult()); 1560 EXPECT_EQ(OK, callback.WaitForResult());
1562 } 1561 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 ASSERT_FALSE(request(i)->handle()->is_initialized()); 1599 ASSERT_FALSE(request(i)->handle()->is_initialized());
1601 request(i)->handle()->Reset(); 1600 request(i)->handle()->Reset();
1602 } 1601 }
1603 1602
1604 // Let's wait for the rest to complete now. 1603 // Let's wait for the rest to complete now.
1605 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { 1604 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
1606 EXPECT_EQ(OK, request(i)->WaitForResult()); 1605 EXPECT_EQ(OK, request(i)->WaitForResult());
1607 request(i)->handle()->Reset(); 1606 request(i)->handle()->Reset();
1608 } 1607 }
1609 1608
1610 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1609 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, completion_count());
1611 completion_count());
1612 } 1610 }
1613 1611
1614 // Make sure that pending requests get serviced after active requests fail. 1612 // Make sure that pending requests get serviced after active requests fail.
1615 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { 1613 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
1616 const size_t kMaxSockets = 5; 1614 const size_t kMaxSockets = 5;
1617 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); 1615 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
1618 1616
1619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1617 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1620 1618
1621 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; 1619 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 base::MessageLoop::current()->RunUntilIdle(); 1696 base::MessageLoop::current()->RunUntilIdle();
1699 } 1697 }
1700 1698
1701 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { 1699 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
1702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1700 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1703 1701
1704 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1702 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1705 ClientSocketHandle handle; 1703 ClientSocketHandle handle;
1706 TestCompletionCallback callback; 1704 TestCompletionCallback callback;
1707 CapturingBoundNetLog log; 1705 CapturingBoundNetLog log;
1708 int rv = handle.Init("a", 1706 int rv = handle.Init(
1709 params_, 1707 "a", params_, LOWEST, callback.callback(), pool_.get(), log.bound());
1710 LOWEST,
1711 callback.callback(),
1712 pool_.get(),
1713 log.bound());
1714 EXPECT_EQ(ERR_IO_PENDING, rv); 1708 EXPECT_EQ(ERR_IO_PENDING, rv);
1715 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1709 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
1716 TestLoadTimingInfoNotConnected(handle); 1710 TestLoadTimingInfoNotConnected(handle);
1717 1711
1718 EXPECT_EQ(OK, callback.WaitForResult()); 1712 EXPECT_EQ(OK, callback.WaitForResult());
1719 EXPECT_TRUE(handle.is_initialized()); 1713 EXPECT_TRUE(handle.is_initialized());
1720 EXPECT_TRUE(handle.socket()); 1714 EXPECT_TRUE(handle.socket());
1721 TestLoadTimingInfoConnectedNotReused(handle); 1715 TestLoadTimingInfoConnectedNotReused(handle);
1722 1716
1723 handle.Reset(); 1717 handle.Reset();
1724 TestLoadTimingInfoNotConnected(handle); 1718 TestLoadTimingInfoNotConnected(handle);
1725 1719
1726 CapturingNetLog::CapturedEntryList entries; 1720 CapturingNetLog::CapturedEntryList entries;
1727 log.GetEntries(&entries); 1721 log.GetEntries(&entries);
1728 1722
1729 EXPECT_EQ(4u, entries.size()); 1723 EXPECT_EQ(4u, entries.size());
1730 EXPECT_TRUE(LogContainsBeginEvent( 1724 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL));
1731 entries, 0, NetLog::TYPE_SOCKET_POOL)); 1725 EXPECT_TRUE(LogContainsEvent(entries,
1732 EXPECT_TRUE(LogContainsEvent( 1726 1,
1733 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 1727 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1734 NetLog::PHASE_NONE)); 1728 NetLog::PHASE_NONE));
1735 EXPECT_TRUE(LogContainsEvent( 1729 EXPECT_TRUE(LogContainsEvent(entries,
1736 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 1730 2,
1737 NetLog::PHASE_NONE)); 1731 NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
1738 EXPECT_TRUE(LogContainsEndEvent( 1732 NetLog::PHASE_NONE));
1739 entries, 3, NetLog::TYPE_SOCKET_POOL)); 1733 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLog::TYPE_SOCKET_POOL));
1740 } 1734 }
1741 1735
1742 TEST_F(ClientSocketPoolBaseTest, 1736 TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) {
1743 InitConnectionAsynchronousFailure) {
1744 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1737 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1745 1738
1746 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1739 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1747 ClientSocketHandle handle; 1740 ClientSocketHandle handle;
1748 TestCompletionCallback callback; 1741 TestCompletionCallback callback;
1749 CapturingBoundNetLog log; 1742 CapturingBoundNetLog log;
1750 // Set the additional error state members to ensure that they get cleared. 1743 // Set the additional error state members to ensure that they get cleared.
1751 handle.set_is_ssl_error(true); 1744 handle.set_is_ssl_error(true);
1752 HttpResponseInfo info; 1745 HttpResponseInfo info;
1753 info.headers = new HttpResponseHeaders(std::string()); 1746 info.headers = new HttpResponseHeaders(std::string());
1754 handle.set_ssl_error_response_info(info); 1747 handle.set_ssl_error_response_info(info);
1755 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1748 EXPECT_EQ(ERR_IO_PENDING,
1756 params_, 1749 handle.Init("a",
1757 DEFAULT_PRIORITY, 1750 params_,
1758 callback.callback(), 1751 DEFAULT_PRIORITY,
1759 pool_.get(), 1752 callback.callback(),
1760 log.bound())); 1753 pool_.get(),
1754 log.bound()));
1761 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1755 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
1762 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 1756 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
1763 EXPECT_FALSE(handle.is_ssl_error()); 1757 EXPECT_FALSE(handle.is_ssl_error());
1764 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 1758 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
1765 1759
1766 CapturingNetLog::CapturedEntryList entries; 1760 CapturingNetLog::CapturedEntryList entries;
1767 log.GetEntries(&entries); 1761 log.GetEntries(&entries);
1768 1762
1769 EXPECT_EQ(3u, entries.size()); 1763 EXPECT_EQ(3u, entries.size());
1770 EXPECT_TRUE(LogContainsBeginEvent( 1764 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKET_POOL));
1771 entries, 0, NetLog::TYPE_SOCKET_POOL)); 1765 EXPECT_TRUE(LogContainsEvent(entries,
1772 EXPECT_TRUE(LogContainsEvent( 1766 1,
1773 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 1767 NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1774 NetLog::PHASE_NONE)); 1768 NetLog::PHASE_NONE));
1775 EXPECT_TRUE(LogContainsEndEvent( 1769 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLog::TYPE_SOCKET_POOL));
1776 entries, 2, NetLog::TYPE_SOCKET_POOL));
1777 } 1770 }
1778 1771
1779 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { 1772 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
1780 // TODO(eroman): Add back the log expectations! Removed them because the 1773 // TODO(eroman): Add back the log expectations! Removed them because the
1781 // ordering is difficult, and some may fire during destructor. 1774 // ordering is difficult, and some may fire during destructor.
1782 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1775 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1783 1776
1784 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1777 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1785 ClientSocketHandle handle; 1778 ClientSocketHandle handle;
1786 TestCompletionCallback callback; 1779 TestCompletionCallback callback;
(...skipping 11 matching lines...) Expand all
1798 EXPECT_EQ(ERR_IO_PENDING, 1791 EXPECT_EQ(ERR_IO_PENDING,
1799 handle2.Init("a", 1792 handle2.Init("a",
1800 params_, 1793 params_,
1801 DEFAULT_PRIORITY, 1794 DEFAULT_PRIORITY,
1802 callback2.callback(), 1795 callback2.callback(),
1803 pool_.get(), 1796 pool_.get(),
1804 BoundNetLog())); 1797 BoundNetLog()));
1805 1798
1806 handle.Reset(); 1799 handle.Reset();
1807 1800
1808
1809 // At this point, request 2 is just waiting for the connect job to finish. 1801 // At this point, request 2 is just waiting for the connect job to finish.
1810 1802
1811 EXPECT_EQ(OK, callback2.WaitForResult()); 1803 EXPECT_EQ(OK, callback2.WaitForResult());
1812 handle2.Reset(); 1804 handle2.Reset();
1813 1805
1814 // Now request 2 has actually finished. 1806 // Now request 2 has actually finished.
1815 // TODO(eroman): Add back log expectations. 1807 // TODO(eroman): Add back log expectations.
1816 } 1808 }
1817 1809
1818 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { 1810 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
(...skipping 25 matching lines...) Expand all
1844 1836
1845 // Start job 1 (async OK) 1837 // Start job 1 (async OK)
1846 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1838 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1847 1839
1848 std::vector<TestSocketRequest*> request_order; 1840 std::vector<TestSocketRequest*> request_order;
1849 size_t completion_count; // unused 1841 size_t completion_count; // unused
1850 TestSocketRequest req1(&request_order, &completion_count); 1842 TestSocketRequest req1(&request_order, &completion_count);
1851 int rv = req1.handle()->Init("a", 1843 int rv = req1.handle()->Init("a",
1852 params_, 1844 params_,
1853 DEFAULT_PRIORITY, 1845 DEFAULT_PRIORITY,
1854 req1.callback(), pool_.get(), 1846 req1.callback(),
1847 pool_.get(),
1855 BoundNetLog()); 1848 BoundNetLog());
1856 EXPECT_EQ(ERR_IO_PENDING, rv); 1849 EXPECT_EQ(ERR_IO_PENDING, rv);
1857 EXPECT_EQ(OK, req1.WaitForResult()); 1850 EXPECT_EQ(OK, req1.WaitForResult());
1858 1851
1859 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending 1852 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1860 // without a job. 1853 // without a job.
1861 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1854 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1862 1855
1863 TestSocketRequest req2(&request_order, &completion_count); 1856 TestSocketRequest req2(&request_order, &completion_count);
1864 rv = req2.handle()->Init("a", 1857 rv = req2.handle()->Init("a",
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
2015 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); 2008 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2016 } 2009 }
2017 2010
2018 // Test GetLoadState in the case the per-group limit is reached. 2011 // Test GetLoadState in the case the per-group limit is reached.
2019 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { 2012 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2020 CreatePool(2, 1); 2013 CreatePool(2, 1);
2021 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2014 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2022 2015
2023 ClientSocketHandle handle; 2016 ClientSocketHandle handle;
2024 TestCompletionCallback callback; 2017 TestCompletionCallback callback;
2025 int rv = handle.Init("a", 2018 int rv = handle.Init(
2026 params_, 2019 "a", params_, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
2027 MEDIUM,
2028 callback.callback(),
2029 pool_.get(),
2030 BoundNetLog());
2031 EXPECT_EQ(ERR_IO_PENDING, rv); 2020 EXPECT_EQ(ERR_IO_PENDING, rv);
2032 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 2021 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2033 2022
2034 // Request another socket from the same pool, buth with a higher priority. 2023 // Request another socket from the same pool, buth with a higher priority.
2035 // The first request should now be stalled at the socket group limit. 2024 // The first request should now be stalled at the socket group limit.
2036 ClientSocketHandle handle2; 2025 ClientSocketHandle handle2;
2037 TestCompletionCallback callback2; 2026 TestCompletionCallback callback2;
2038 rv = handle2.Init("a", 2027 rv = handle2.Init(
2039 params_, 2028 "a", params_, HIGHEST, callback2.callback(), pool_.get(), BoundNetLog());
2040 HIGHEST,
2041 callback2.callback(),
2042 pool_.get(),
2043 BoundNetLog());
2044 EXPECT_EQ(ERR_IO_PENDING, rv); 2029 EXPECT_EQ(ERR_IO_PENDING, rv);
2045 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); 2030 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2046 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); 2031 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2047 2032
2048 // The first handle should remain stalled as the other socket goes through 2033 // The first handle should remain stalled as the other socket goes through
2049 // the connect process. 2034 // the connect process.
2050 2035
2051 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); 2036 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2052 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); 2037 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2053 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); 2038 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); 2107 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
2123 } 2108 }
2124 2109
2125 TEST_F(ClientSocketPoolBaseTest, Recoverable) { 2110 TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2126 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2127 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); 2112 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2128 2113
2129 ClientSocketHandle handle; 2114 ClientSocketHandle handle;
2130 TestCompletionCallback callback; 2115 TestCompletionCallback callback;
2131 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, 2116 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
2132 handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), 2117 handle.Init("a",
2133 pool_.get(), BoundNetLog())); 2118 params_,
2119 DEFAULT_PRIORITY,
2120 callback.callback(),
2121 pool_.get(),
2122 BoundNetLog()));
2134 EXPECT_TRUE(handle.is_initialized()); 2123 EXPECT_TRUE(handle.is_initialized());
2135 EXPECT_TRUE(handle.socket()); 2124 EXPECT_TRUE(handle.socket());
2136 } 2125 }
2137 2126
2138 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { 2127 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2128 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2140 2129
2141 connect_job_factory_->set_job_type( 2130 connect_job_factory_->set_job_type(
2142 TestConnectJob::kMockPendingRecoverableJob); 2131 TestConnectJob::kMockPendingRecoverableJob);
2143 ClientSocketHandle handle; 2132 ClientSocketHandle handle;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2196 EXPECT_TRUE(handle.is_ssl_error()); 2185 EXPECT_TRUE(handle.is_ssl_error());
2197 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 2186 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
2198 } 2187 }
2199 2188
2200 // Make sure we can reuse sockets when the cleanup timer is disabled. 2189 // Make sure we can reuse sockets when the cleanup timer is disabled.
2201 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) { 2190 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) {
2202 // Disable cleanup timer. 2191 // Disable cleanup timer.
2203 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); 2192 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false);
2204 2193
2205 CreatePoolWithIdleTimeouts( 2194 CreatePoolWithIdleTimeouts(
2206 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2195 kDefaultMaxSockets,
2207 base::TimeDelta(), // Time out unused sockets immediately. 2196 kDefaultMaxSocketsPerGroup,
2197 base::TimeDelta(), // Time out unused sockets immediately.
2208 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2198 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2209 2199
2210 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2200 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2211 2201
2212 ClientSocketHandle handle; 2202 ClientSocketHandle handle;
2213 TestCompletionCallback callback; 2203 TestCompletionCallback callback;
2214 int rv = handle.Init("a", 2204 int rv = handle.Init(
2215 params_, 2205 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog());
2216 LOWEST,
2217 callback.callback(),
2218 pool_.get(),
2219 BoundNetLog());
2220 ASSERT_EQ(ERR_IO_PENDING, rv); 2206 ASSERT_EQ(ERR_IO_PENDING, rv);
2221 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2207 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2222 ASSERT_EQ(OK, callback.WaitForResult()); 2208 ASSERT_EQ(OK, callback.WaitForResult());
2223 2209
2224 // Use and release the socket. 2210 // Use and release the socket.
2225 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); 2211 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
2226 TestLoadTimingInfoConnectedNotReused(handle); 2212 TestLoadTimingInfoConnectedNotReused(handle);
2227 handle.Reset(); 2213 handle.Reset();
2228 2214
2229 // Should now have one idle socket. 2215 // Should now have one idle socket.
2230 ASSERT_EQ(1, pool_->IdleSocketCount()); 2216 ASSERT_EQ(1, pool_->IdleSocketCount());
2231 2217
2232 // Request a new socket. This should reuse the old socket and complete 2218 // Request a new socket. This should reuse the old socket and complete
2233 // synchronously. 2219 // synchronously.
2234 CapturingBoundNetLog log; 2220 CapturingBoundNetLog log;
2235 rv = handle.Init("a", 2221 rv = handle.Init(
2236 params_, 2222 "a", params_, LOWEST, CompletionCallback(), pool_.get(), log.bound());
2237 LOWEST,
2238 CompletionCallback(),
2239 pool_.get(),
2240 log.bound());
2241 ASSERT_EQ(OK, rv); 2223 ASSERT_EQ(OK, rv);
2242 EXPECT_TRUE(handle.is_reused()); 2224 EXPECT_TRUE(handle.is_reused());
2243 TestLoadTimingInfoConnectedReused(handle); 2225 TestLoadTimingInfoConnectedReused(handle);
2244 2226
2245 ASSERT_TRUE(pool_->HasGroup("a")); 2227 ASSERT_TRUE(pool_->HasGroup("a"));
2246 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2228 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2247 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 2229 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2248 2230
2249 CapturingNetLog::CapturedEntryList entries; 2231 CapturingNetLog::CapturedEntryList entries;
2250 log.GetEntries(&entries); 2232 log.GetEntries(&entries);
2251 EXPECT_TRUE(LogContainsEntryWithType( 2233 EXPECT_TRUE(LogContainsEntryWithType(
2252 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2234 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2253 } 2235 }
2254 2236
2255 // Make sure we cleanup old unused sockets when the cleanup timer is disabled. 2237 // Make sure we cleanup old unused sockets when the cleanup timer is disabled.
2256 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerNoReuse) { 2238 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerNoReuse) {
2257 // Disable cleanup timer. 2239 // Disable cleanup timer.
2258 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); 2240 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false);
2259 2241
2260 CreatePoolWithIdleTimeouts( 2242 CreatePoolWithIdleTimeouts(
2261 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2243 kDefaultMaxSockets,
2262 base::TimeDelta(), // Time out unused sockets immediately 2244 kDefaultMaxSocketsPerGroup,
2245 base::TimeDelta(), // Time out unused sockets immediately
2263 base::TimeDelta()); // Time out used sockets immediately 2246 base::TimeDelta()); // Time out used sockets immediately
2264 2247
2265 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2248 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2266 2249
2267 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 2250 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2268 2251
2269 ClientSocketHandle handle; 2252 ClientSocketHandle handle;
2270 TestCompletionCallback callback; 2253 TestCompletionCallback callback;
2271 int rv = handle.Init("a", 2254 int rv = handle.Init(
2272 params_, 2255 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog());
2273 LOWEST,
2274 callback.callback(),
2275 pool_.get(),
2276 BoundNetLog());
2277 ASSERT_EQ(ERR_IO_PENDING, rv); 2256 ASSERT_EQ(ERR_IO_PENDING, rv);
2278 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2257 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2279 2258
2280 ClientSocketHandle handle2; 2259 ClientSocketHandle handle2;
2281 TestCompletionCallback callback2; 2260 TestCompletionCallback callback2;
2282 rv = handle2.Init("a", 2261 rv = handle2.Init(
2283 params_, 2262 "a", params_, LOWEST, callback2.callback(), pool_.get(), BoundNetLog());
2284 LOWEST,
2285 callback2.callback(),
2286 pool_.get(),
2287 BoundNetLog());
2288 ASSERT_EQ(ERR_IO_PENDING, rv); 2263 ASSERT_EQ(ERR_IO_PENDING, rv);
2289 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); 2264 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2290 2265
2291 // Cancel one of the requests. Wait for the other, which will get the first 2266 // Cancel one of the requests. Wait for the other, which will get the first
2292 // job. Release the socket. Run the loop again to make sure the second 2267 // job. Release the socket. Run the loop again to make sure the second
2293 // socket is sitting idle and the first one is released (since ReleaseSocket() 2268 // socket is sitting idle and the first one is released (since ReleaseSocket()
2294 // just posts a DoReleaseSocket() task). 2269 // just posts a DoReleaseSocket() task).
2295 2270
2296 handle.Reset(); 2271 handle.Reset();
2297 ASSERT_EQ(OK, callback2.WaitForResult()); 2272 ASSERT_EQ(OK, callback2.WaitForResult());
2298 // Use the socket. 2273 // Use the socket.
2299 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); 2274 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
2300 handle2.Reset(); 2275 handle2.Reset();
2301 2276
2302 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 2277 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2303 // actually become pending until 2ms after they have been created. In order 2278 // actually become pending until 2ms after they have been created. In order
2304 // to flush all tasks, we need to wait so that we know there are no 2279 // to flush all tasks, we need to wait so that we know there are no
2305 // soon-to-be-pending tasks waiting. 2280 // soon-to-be-pending tasks waiting.
2306 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 2281 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
2307 base::MessageLoop::current()->RunUntilIdle(); 2282 base::MessageLoop::current()->RunUntilIdle();
2308 2283
2309 // Both sockets should now be idle. 2284 // Both sockets should now be idle.
2310 ASSERT_EQ(2, pool_->IdleSocketCount()); 2285 ASSERT_EQ(2, pool_->IdleSocketCount());
2311 2286
2312 // Request a new socket. This should cleanup the unused and timed out ones. 2287 // Request a new socket. This should cleanup the unused and timed out ones.
2313 // A new socket will be created rather than reusing the idle one. 2288 // A new socket will be created rather than reusing the idle one.
2314 CapturingBoundNetLog log; 2289 CapturingBoundNetLog log;
2315 TestCompletionCallback callback3; 2290 TestCompletionCallback callback3;
2316 rv = handle.Init("a", 2291 rv = handle.Init(
2317 params_, 2292 "a", params_, LOWEST, callback3.callback(), pool_.get(), log.bound());
2318 LOWEST,
2319 callback3.callback(),
2320 pool_.get(),
2321 log.bound());
2322 ASSERT_EQ(ERR_IO_PENDING, rv); 2293 ASSERT_EQ(ERR_IO_PENDING, rv);
2323 ASSERT_EQ(OK, callback3.WaitForResult()); 2294 ASSERT_EQ(OK, callback3.WaitForResult());
2324 EXPECT_FALSE(handle.is_reused()); 2295 EXPECT_FALSE(handle.is_reused());
2325 2296
2326 // Make sure the idle socket is closed. 2297 // Make sure the idle socket is closed.
2327 ASSERT_TRUE(pool_->HasGroup("a")); 2298 ASSERT_TRUE(pool_->HasGroup("a"));
2328 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2299 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2329 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 2300 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2330 2301
2331 CapturingNetLog::CapturedEntryList entries; 2302 CapturingNetLog::CapturedEntryList entries;
2332 log.GetEntries(&entries); 2303 log.GetEntries(&entries);
2333 EXPECT_FALSE(LogContainsEntryWithType( 2304 EXPECT_FALSE(LogContainsEntryWithType(
2334 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2305 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2335 } 2306 }
2336 2307
2337 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { 2308 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) {
2338 CreatePoolWithIdleTimeouts( 2309 CreatePoolWithIdleTimeouts(
2339 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2310 kDefaultMaxSockets,
2340 base::TimeDelta(), // Time out unused sockets immediately. 2311 kDefaultMaxSocketsPerGroup,
2312 base::TimeDelta(), // Time out unused sockets immediately.
2341 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2313 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2342 2314
2343 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2315 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2344 2316
2345 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 2317 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2346 2318
2347 ClientSocketHandle handle; 2319 ClientSocketHandle handle;
2348 TestCompletionCallback callback; 2320 TestCompletionCallback callback;
2349 int rv = handle.Init("a", 2321 int rv = handle.Init(
2350 params_, 2322 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog());
2351 LOWEST,
2352 callback.callback(),
2353 pool_.get(),
2354 BoundNetLog());
2355 EXPECT_EQ(ERR_IO_PENDING, rv); 2323 EXPECT_EQ(ERR_IO_PENDING, rv);
2356 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2324 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2357 2325
2358 ClientSocketHandle handle2; 2326 ClientSocketHandle handle2;
2359 TestCompletionCallback callback2; 2327 TestCompletionCallback callback2;
2360 rv = handle2.Init("a", 2328 rv = handle2.Init(
2361 params_, 2329 "a", params_, LOWEST, callback2.callback(), pool_.get(), BoundNetLog());
2362 LOWEST,
2363 callback2.callback(),
2364 pool_.get(),
2365 BoundNetLog());
2366 EXPECT_EQ(ERR_IO_PENDING, rv); 2330 EXPECT_EQ(ERR_IO_PENDING, rv);
2367 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); 2331 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2368 2332
2369 // Cancel one of the requests. Wait for the other, which will get the first 2333 // Cancel one of the requests. Wait for the other, which will get the first
2370 // job. Release the socket. Run the loop again to make sure the second 2334 // job. Release the socket. Run the loop again to make sure the second
2371 // socket is sitting idle and the first one is released (since ReleaseSocket() 2335 // socket is sitting idle and the first one is released (since ReleaseSocket()
2372 // just posts a DoReleaseSocket() task). 2336 // just posts a DoReleaseSocket() task).
2373 2337
2374 handle.Reset(); 2338 handle.Reset();
2375 EXPECT_EQ(OK, callback2.WaitForResult()); 2339 EXPECT_EQ(OK, callback2.WaitForResult());
2376 // Use the socket. 2340 // Use the socket.
2377 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); 2341 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
2378 handle2.Reset(); 2342 handle2.Reset();
2379 2343
2380 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 2344 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2381 // actually become pending until 2ms after they have been created. In order 2345 // actually become pending until 2ms after they have been created. In order
2382 // to flush all tasks, we need to wait so that we know there are no 2346 // to flush all tasks, we need to wait so that we know there are no
2383 // soon-to-be-pending tasks waiting. 2347 // soon-to-be-pending tasks waiting.
2384 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 2348 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
2385 base::MessageLoop::current()->RunUntilIdle(); 2349 base::MessageLoop::current()->RunUntilIdle();
2386 2350
2387 ASSERT_EQ(2, pool_->IdleSocketCount()); 2351 ASSERT_EQ(2, pool_->IdleSocketCount());
2388 2352
2389 // Invoke the idle socket cleanup check. Only one socket should be left, the 2353 // Invoke the idle socket cleanup check. Only one socket should be left, the
2390 // used socket. Request it to make sure that it's used. 2354 // used socket. Request it to make sure that it's used.
2391 2355
2392 pool_->CleanupTimedOutIdleSockets(); 2356 pool_->CleanupTimedOutIdleSockets();
2393 CapturingBoundNetLog log; 2357 CapturingBoundNetLog log;
2394 rv = handle.Init("a", 2358 rv = handle.Init(
2395 params_, 2359 "a", params_, LOWEST, callback.callback(), pool_.get(), log.bound());
2396 LOWEST,
2397 callback.callback(),
2398 pool_.get(),
2399 log.bound());
2400 EXPECT_EQ(OK, rv); 2360 EXPECT_EQ(OK, rv);
2401 EXPECT_TRUE(handle.is_reused()); 2361 EXPECT_TRUE(handle.is_reused());
2402 2362
2403 CapturingNetLog::CapturedEntryList entries; 2363 CapturingNetLog::CapturedEntryList entries;
2404 log.GetEntries(&entries); 2364 log.GetEntries(&entries);
2405 EXPECT_TRUE(LogContainsEntryWithType( 2365 EXPECT_TRUE(LogContainsEntryWithType(
2406 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2366 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2407 } 2367 }
2408 2368
2409 // Make sure that we process all pending requests even when we're stalling 2369 // Make sure that we process all pending requests even when we're stalling
2410 // because of multiple releasing disconnected sockets. 2370 // because of multiple releasing disconnected sockets.
2411 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { 2371 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2412 CreatePoolWithIdleTimeouts( 2372 CreatePoolWithIdleTimeouts(
2413 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2373 kDefaultMaxSockets,
2414 base::TimeDelta(), // Time out unused sockets immediately. 2374 kDefaultMaxSocketsPerGroup,
2375 base::TimeDelta(), // Time out unused sockets immediately.
2415 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2376 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2416 2377
2417 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2378 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2418 2379
2419 // Startup 4 connect jobs. Two of them will be pending. 2380 // Startup 4 connect jobs. Two of them will be pending.
2420 2381
2421 ClientSocketHandle handle; 2382 ClientSocketHandle handle;
2422 TestCompletionCallback callback; 2383 TestCompletionCallback callback;
2423 int rv = handle.Init("a", 2384 int rv = handle.Init(
2424 params_, 2385 "a", params_, LOWEST, callback.callback(), pool_.get(), BoundNetLog());
2425 LOWEST,
2426 callback.callback(),
2427 pool_.get(),
2428 BoundNetLog());
2429 EXPECT_EQ(OK, rv); 2386 EXPECT_EQ(OK, rv);
2430 2387
2431 ClientSocketHandle handle2; 2388 ClientSocketHandle handle2;
2432 TestCompletionCallback callback2; 2389 TestCompletionCallback callback2;
2433 rv = handle2.Init("a", 2390 rv = handle2.Init(
2434 params_, 2391 "a", params_, LOWEST, callback2.callback(), pool_.get(), BoundNetLog());
2435 LOWEST,
2436 callback2.callback(),
2437 pool_.get(),
2438 BoundNetLog());
2439 EXPECT_EQ(OK, rv); 2392 EXPECT_EQ(OK, rv);
2440 2393
2441 ClientSocketHandle handle3; 2394 ClientSocketHandle handle3;
2442 TestCompletionCallback callback3; 2395 TestCompletionCallback callback3;
2443 rv = handle3.Init("a", 2396 rv = handle3.Init(
2444 params_, 2397 "a", params_, LOWEST, callback3.callback(), pool_.get(), BoundNetLog());
2445 LOWEST,
2446 callback3.callback(),
2447 pool_.get(),
2448 BoundNetLog());
2449 EXPECT_EQ(ERR_IO_PENDING, rv); 2398 EXPECT_EQ(ERR_IO_PENDING, rv);
2450 2399
2451 ClientSocketHandle handle4; 2400 ClientSocketHandle handle4;
2452 TestCompletionCallback callback4; 2401 TestCompletionCallback callback4;
2453 rv = handle4.Init("a", 2402 rv = handle4.Init(
2454 params_, 2403 "a", params_, LOWEST, callback4.callback(), pool_.get(), BoundNetLog());
2455 LOWEST,
2456 callback4.callback(),
2457 pool_.get(),
2458 BoundNetLog());
2459 EXPECT_EQ(ERR_IO_PENDING, rv); 2404 EXPECT_EQ(ERR_IO_PENDING, rv);
2460 2405
2461 // Release two disconnected sockets. 2406 // Release two disconnected sockets.
2462 2407
2463 handle.socket()->Disconnect(); 2408 handle.socket()->Disconnect();
2464 handle.Reset(); 2409 handle.Reset();
2465 handle2.socket()->Disconnect(); 2410 handle2.socket()->Disconnect();
2466 handle2.Reset(); 2411 handle2.Reset();
2467 2412
2468 EXPECT_EQ(OK, callback3.WaitForResult()); 2413 EXPECT_EQ(OK, callback3.WaitForResult());
2469 EXPECT_FALSE(handle3.is_reused()); 2414 EXPECT_FALSE(handle3.is_reused());
2470 EXPECT_EQ(OK, callback4.WaitForResult()); 2415 EXPECT_EQ(OK, callback4.WaitForResult());
2471 EXPECT_FALSE(handle4.is_reused()); 2416 EXPECT_FALSE(handle4.is_reused());
2472 } 2417 }
2473 2418
2474 // Regression test for http://crbug.com/42267. 2419 // Regression test for http://crbug.com/42267.
2475 // When DoReleaseSocket() is processed for one socket, it is blocked because the 2420 // When DoReleaseSocket() is processed for one socket, it is blocked because the
2476 // other stalled groups all have releasing sockets, so no progress can be made. 2421 // other stalled groups all have releasing sockets, so no progress can be made.
2477 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { 2422 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2478 CreatePoolWithIdleTimeouts( 2423 CreatePoolWithIdleTimeouts(
2479 4 /* socket limit */, 4 /* socket limit per group */, 2424 4 /* socket limit */,
2480 base::TimeDelta(), // Time out unused sockets immediately. 2425 4 /* socket limit per group */,
2426 base::TimeDelta(), // Time out unused sockets immediately.
2481 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2427 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2482 2428
2483 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2429 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2484 2430
2485 // Max out the socket limit with 2 per group. 2431 // Max out the socket limit with 2 per group.
2486 2432
2487 ClientSocketHandle handle_a[4]; 2433 ClientSocketHandle handle_a[4];
2488 TestCompletionCallback callback_a[4]; 2434 TestCompletionCallback callback_a[4];
2489 ClientSocketHandle handle_b[4]; 2435 ClientSocketHandle handle_b[4];
2490 TestCompletionCallback callback_b[4]; 2436 TestCompletionCallback callback_b[4];
2491 2437
2492 for (int i = 0; i < 2; ++i) { 2438 for (int i = 0; i < 2; ++i) {
2493 EXPECT_EQ(OK, handle_a[i].Init("a", 2439 EXPECT_EQ(OK,
2494 params_, 2440 handle_a[i].Init("a",
2495 LOWEST, 2441 params_,
2496 callback_a[i].callback(), 2442 LOWEST,
2497 pool_.get(), 2443 callback_a[i].callback(),
2498 BoundNetLog())); 2444 pool_.get(),
2499 EXPECT_EQ(OK, handle_b[i].Init("b", 2445 BoundNetLog()));
2500 params_, 2446 EXPECT_EQ(OK,
2501 LOWEST, 2447 handle_b[i].Init("b",
2502 callback_b[i].callback(), 2448 params_,
2503 pool_.get(), 2449 LOWEST,
2504 BoundNetLog())); 2450 callback_b[i].callback(),
2451 pool_.get(),
2452 BoundNetLog()));
2505 } 2453 }
2506 2454
2507 // Make 4 pending requests, 2 per group. 2455 // Make 4 pending requests, 2 per group.
2508 2456
2509 for (int i = 2; i < 4; ++i) { 2457 for (int i = 2; i < 4; ++i) {
2510 EXPECT_EQ(ERR_IO_PENDING, 2458 EXPECT_EQ(ERR_IO_PENDING,
2511 handle_a[i].Init("a", 2459 handle_a[i].Init("a",
2512 params_, 2460 params_,
2513 LOWEST, 2461 LOWEST,
2514 callback_a[i].callback(), 2462 callback_a[i].callback(),
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2581 2529
2582 class TestReleasingSocketRequest : public TestCompletionCallbackBase { 2530 class TestReleasingSocketRequest : public TestCompletionCallbackBase {
2583 public: 2531 public:
2584 TestReleasingSocketRequest(TestClientSocketPool* pool, 2532 TestReleasingSocketRequest(TestClientSocketPool* pool,
2585 int expected_result, 2533 int expected_result,
2586 bool reset_releasing_handle) 2534 bool reset_releasing_handle)
2587 : pool_(pool), 2535 : pool_(pool),
2588 expected_result_(expected_result), 2536 expected_result_(expected_result),
2589 reset_releasing_handle_(reset_releasing_handle), 2537 reset_releasing_handle_(reset_releasing_handle),
2590 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete, 2538 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2591 base::Unretained(this))) { 2539 base::Unretained(this))) {}
2592 }
2593 2540
2594 virtual ~TestReleasingSocketRequest() {} 2541 virtual ~TestReleasingSocketRequest() {}
2595 2542
2596 ClientSocketHandle* handle() { return &handle_; } 2543 ClientSocketHandle* handle() { return &handle_; }
2597 2544
2598 const CompletionCallback& callback() const { return callback_; } 2545 const CompletionCallback& callback() const { return callback_; }
2599 2546
2600 private: 2547 private:
2601 void OnComplete(int result) { 2548 void OnComplete(int result) {
2602 SetResult(result); 2549 SetResult(result);
2603 if (reset_releasing_handle_) 2550 if (reset_releasing_handle_)
2604 handle_.Reset(); 2551 handle_.Reset();
2605 2552
2606 scoped_refptr<TestSocketParams> con_params( 2553 scoped_refptr<TestSocketParams> con_params(
2607 new TestSocketParams(false /* ignore_limits */)); 2554 new TestSocketParams(false /* ignore_limits */));
2608 EXPECT_EQ(expected_result_, 2555 EXPECT_EQ(expected_result_,
2609 handle2_.Init("a", con_params, DEFAULT_PRIORITY, 2556 handle2_.Init("a",
2610 callback2_.callback(), pool_, BoundNetLog())); 2557 con_params,
2558 DEFAULT_PRIORITY,
2559 callback2_.callback(),
2560 pool_,
2561 BoundNetLog()));
2611 } 2562 }
2612 2563
2613 TestClientSocketPool* const pool_; 2564 TestClientSocketPool* const pool_;
2614 int expected_result_; 2565 int expected_result_;
2615 bool reset_releasing_handle_; 2566 bool reset_releasing_handle_;
2616 ClientSocketHandle handle_; 2567 ClientSocketHandle handle_;
2617 ClientSocketHandle handle2_; 2568 ClientSocketHandle handle2_;
2618 CompletionCallback callback_; 2569 CompletionCallback callback_;
2619 TestCompletionCallback callback2_; 2570 TestCompletionCallback callback2_;
2620 }; 2571 };
2621 2572
2622
2623 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { 2573 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2574 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2625 2575
2626 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 2576 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
2627 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 2577 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
2628 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 2578 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
2629 2579
2630 EXPECT_EQ(static_cast<int>(requests_size()), 2580 EXPECT_EQ(static_cast<int>(requests_size()),
2631 client_socket_factory_.allocation_count()); 2581 client_socket_factory_.allocation_count());
2632 2582
2633 connect_job_factory_->set_job_type( 2583 connect_job_factory_->set_job_type(
2634 TestConnectJob::kMockPendingAdditionalErrorStateJob); 2584 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2635 TestReleasingSocketRequest req(pool_.get(), OK, false); 2585 TestReleasingSocketRequest req(pool_.get(), OK, false);
2636 EXPECT_EQ(ERR_IO_PENDING, 2586 EXPECT_EQ(ERR_IO_PENDING,
2637 req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(), 2587 req.handle()->Init("a",
2638 pool_.get(), BoundNetLog())); 2588 params_,
2589 DEFAULT_PRIORITY,
2590 req.callback(),
2591 pool_.get(),
2592 BoundNetLog()));
2639 // The next job should complete synchronously 2593 // The next job should complete synchronously
2640 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2594 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2641 2595
2642 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 2596 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
2643 EXPECT_FALSE(req.handle()->is_initialized()); 2597 EXPECT_FALSE(req.handle()->is_initialized());
2644 EXPECT_FALSE(req.handle()->socket()); 2598 EXPECT_FALSE(req.handle()->socket());
2645 EXPECT_TRUE(req.handle()->is_ssl_error()); 2599 EXPECT_TRUE(req.handle()->is_ssl_error());
2646 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); 2600 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
2647 } 2601 }
2648 2602
2649 // http://crbug.com/44724 regression test. 2603 // http://crbug.com/44724 regression test.
2650 // We start releasing the pool when we flush on network change. When that 2604 // We start releasing the pool when we flush on network change. When that
2651 // happens, the only active references are in the ClientSocketHandles. When a 2605 // happens, the only active references are in the ClientSocketHandles. When a
2652 // ConnectJob completes and calls back into the last ClientSocketHandle, that 2606 // ConnectJob completes and calls back into the last ClientSocketHandle, that
2653 // callback can release the last reference and delete the pool. After the 2607 // callback can release the last reference and delete the pool. After the
2654 // callback finishes, we go back to the stack frame within the now-deleted pool. 2608 // callback finishes, we go back to the stack frame within the now-deleted pool.
2655 // Executing any code that refers to members of the now-deleted pool can cause 2609 // Executing any code that refers to members of the now-deleted pool can cause
2656 // crashes. 2610 // crashes.
2657 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { 2611 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2658 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2612 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2659 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 2613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2660 2614
2661 ClientSocketHandle handle; 2615 ClientSocketHandle handle;
2662 TestCompletionCallback callback; 2616 TestCompletionCallback callback;
2663 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2617 EXPECT_EQ(ERR_IO_PENDING,
2664 params_, 2618 handle.Init("a",
2665 DEFAULT_PRIORITY, 2619 params_,
2666 callback.callback(), 2620 DEFAULT_PRIORITY,
2667 pool_.get(), 2621 callback.callback(),
2668 BoundNetLog())); 2622 pool_.get(),
2623 BoundNetLog()));
2669 2624
2670 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2625 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2671 2626
2672 // We'll call back into this now. 2627 // We'll call back into this now.
2673 callback.WaitForResult(); 2628 callback.WaitForResult();
2674 } 2629 }
2675 2630
2676 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { 2631 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2677 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2632 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2633 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2679 2634
2680 ClientSocketHandle handle; 2635 ClientSocketHandle handle;
2681 TestCompletionCallback callback; 2636 TestCompletionCallback callback;
2682 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2637 EXPECT_EQ(ERR_IO_PENDING,
2683 params_, 2638 handle.Init("a",
2684 DEFAULT_PRIORITY, 2639 params_,
2685 callback.callback(), 2640 DEFAULT_PRIORITY,
2686 pool_.get(), 2641 callback.callback(),
2687 BoundNetLog())); 2642 pool_.get(),
2643 BoundNetLog()));
2688 EXPECT_EQ(OK, callback.WaitForResult()); 2644 EXPECT_EQ(OK, callback.WaitForResult());
2689 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2645 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2690 2646
2691 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2647 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2692 2648
2693 handle.Reset(); 2649 handle.Reset();
2694 base::MessageLoop::current()->RunUntilIdle(); 2650 base::MessageLoop::current()->RunUntilIdle();
2695 2651
2696 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2652 EXPECT_EQ(ERR_IO_PENDING,
2697 params_, 2653 handle.Init("a",
2698 DEFAULT_PRIORITY, 2654 params_,
2699 callback.callback(), 2655 DEFAULT_PRIORITY,
2700 pool_.get(), 2656 callback.callback(),
2701 BoundNetLog())); 2657 pool_.get(),
2658 BoundNetLog()));
2702 EXPECT_EQ(OK, callback.WaitForResult()); 2659 EXPECT_EQ(OK, callback.WaitForResult());
2703 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2660 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2704 } 2661 }
2705 2662
2706 class ConnectWithinCallback : public TestCompletionCallbackBase { 2663 class ConnectWithinCallback : public TestCompletionCallbackBase {
2707 public: 2664 public:
2708 ConnectWithinCallback( 2665 ConnectWithinCallback(const std::string& group_name,
2709 const std::string& group_name, 2666 const scoped_refptr<TestSocketParams>& params,
2710 const scoped_refptr<TestSocketParams>& params, 2667 TestClientSocketPool* pool)
2711 TestClientSocketPool* pool)
2712 : group_name_(group_name), 2668 : group_name_(group_name),
2713 params_(params), 2669 params_(params),
2714 pool_(pool), 2670 pool_(pool),
2715 callback_(base::Bind(&ConnectWithinCallback::OnComplete, 2671 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2716 base::Unretained(this))) { 2672 base::Unretained(this))) {}
2717 }
2718 2673
2719 virtual ~ConnectWithinCallback() {} 2674 virtual ~ConnectWithinCallback() {}
2720 2675
2721 int WaitForNestedResult() { 2676 int WaitForNestedResult() { return nested_callback_.WaitForResult(); }
2722 return nested_callback_.WaitForResult();
2723 }
2724 2677
2725 const CompletionCallback& callback() const { return callback_; } 2678 const CompletionCallback& callback() const { return callback_; }
2726 2679
2727 private: 2680 private:
2728 void OnComplete(int result) { 2681 void OnComplete(int result) {
2729 SetResult(result); 2682 SetResult(result);
2730 EXPECT_EQ(ERR_IO_PENDING, 2683 EXPECT_EQ(ERR_IO_PENDING,
2731 handle_.Init(group_name_, 2684 handle_.Init(group_name_,
2732 params_, 2685 params_,
2733 DEFAULT_PRIORITY, 2686 DEFAULT_PRIORITY,
(...skipping 13 matching lines...) Expand all
2747 }; 2700 };
2748 2701
2749 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { 2702 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2750 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2703 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2751 2704
2752 // First job will be waiting until it gets aborted. 2705 // First job will be waiting until it gets aborted.
2753 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2706 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2754 2707
2755 ClientSocketHandle handle; 2708 ClientSocketHandle handle;
2756 ConnectWithinCallback callback("a", params_, pool_.get()); 2709 ConnectWithinCallback callback("a", params_, pool_.get());
2757 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2710 EXPECT_EQ(ERR_IO_PENDING,
2758 params_, 2711 handle.Init("a",
2759 DEFAULT_PRIORITY, 2712 params_,
2760 callback.callback(), 2713 DEFAULT_PRIORITY,
2761 pool_.get(), 2714 callback.callback(),
2762 BoundNetLog())); 2715 pool_.get(),
2716 BoundNetLog()));
2763 2717
2764 // Second job will be started during the first callback, and will 2718 // Second job will be started during the first callback, and will
2765 // asynchronously complete with OK. 2719 // asynchronously complete with OK.
2766 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2720 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2767 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2721 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2768 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); 2722 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult());
2769 EXPECT_EQ(OK, callback.WaitForNestedResult()); 2723 EXPECT_EQ(OK, callback.WaitForNestedResult());
2770 } 2724 }
2771 2725
2772 // Cancel a pending socket request while we're at max sockets, 2726 // Cancel a pending socket request while we're at max sockets,
2773 // and verify that the backup socket firing doesn't cause a crash. 2727 // and verify that the backup socket firing doesn't cause a crash.
2774 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { 2728 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2775 // Max 4 sockets globally, max 4 sockets per group. 2729 // Max 4 sockets globally, max 4 sockets per group.
2776 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2730 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2777 pool_->EnableConnectBackupJobs(); 2731 pool_->EnableConnectBackupJobs();
2778 2732
2779 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2733 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2780 // timer. 2734 // timer.
2781 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2735 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2782 ClientSocketHandle handle; 2736 ClientSocketHandle handle;
2783 TestCompletionCallback callback; 2737 TestCompletionCallback callback;
2784 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2738 EXPECT_EQ(ERR_IO_PENDING,
2785 params_, 2739 handle.Init("bar",
2786 DEFAULT_PRIORITY, 2740 params_,
2787 callback.callback(), 2741 DEFAULT_PRIORITY,
2788 pool_.get(), 2742 callback.callback(),
2789 BoundNetLog())); 2743 pool_.get(),
2744 BoundNetLog()));
2790 2745
2791 // Start (MaxSockets - 1) connected sockets to reach max sockets. 2746 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2792 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2747 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2793 ClientSocketHandle handles[kDefaultMaxSockets]; 2748 ClientSocketHandle handles[kDefaultMaxSockets];
2794 for (int i = 1; i < kDefaultMaxSockets; ++i) { 2749 for (int i = 1; i < kDefaultMaxSockets; ++i) {
2795 TestCompletionCallback callback; 2750 TestCompletionCallback callback;
2796 EXPECT_EQ(OK, handles[i].Init("bar", 2751 EXPECT_EQ(OK,
2797 params_, 2752 handles[i].Init("bar",
2798 DEFAULT_PRIORITY, 2753 params_,
2799 callback.callback(), 2754 DEFAULT_PRIORITY,
2800 pool_.get(), 2755 callback.callback(),
2801 BoundNetLog())); 2756 pool_.get(),
2757 BoundNetLog()));
2802 } 2758 }
2803 2759
2804 base::MessageLoop::current()->RunUntilIdle(); 2760 base::MessageLoop::current()->RunUntilIdle();
2805 2761
2806 // Cancel the pending request. 2762 // Cancel the pending request.
2807 handle.Reset(); 2763 handle.Reset();
2808 2764
2809 // Wait for the backup timer to fire (add some slop to ensure it fires) 2765 // Wait for the backup timer to fire (add some slop to ensure it fires)
2810 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2766 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2811 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2767 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
2812 2768
2813 base::MessageLoop::current()->RunUntilIdle(); 2769 base::MessageLoop::current()->RunUntilIdle();
2814 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 2770 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2815 } 2771 }
2816 2772
2817 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { 2773 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
2818 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2774 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2819 pool_->EnableConnectBackupJobs(); 2775 pool_->EnableConnectBackupJobs();
2820 2776
2821 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2777 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2822 // timer. 2778 // timer.
2823 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2779 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2824 ClientSocketHandle handle; 2780 ClientSocketHandle handle;
2825 TestCompletionCallback callback; 2781 TestCompletionCallback callback;
2826 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2782 EXPECT_EQ(ERR_IO_PENDING,
2827 params_, 2783 handle.Init("bar",
2828 DEFAULT_PRIORITY, 2784 params_,
2829 callback.callback(), 2785 DEFAULT_PRIORITY,
2830 pool_.get(), 2786 callback.callback(),
2831 BoundNetLog())); 2787 pool_.get(),
2788 BoundNetLog()));
2832 ASSERT_TRUE(pool_->HasGroup("bar")); 2789 ASSERT_TRUE(pool_->HasGroup("bar"));
2833 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2790 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2834 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); 2791 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
2835 2792
2836 // Cancel the socket request. This should cancel the backup timer. Wait for 2793 // Cancel the socket request. This should cancel the backup timer. Wait for
2837 // the backup time to see if it indeed got canceled. 2794 // the backup time to see if it indeed got canceled.
2838 handle.Reset(); 2795 handle.Reset();
2839 // Wait for the backup timer to fire (add some slop to ensure it fires) 2796 // Wait for the backup timer to fire (add some slop to ensure it fires)
2840 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2797 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2841 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2798 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
2842 base::MessageLoop::current()->RunUntilIdle(); 2799 base::MessageLoop::current()->RunUntilIdle();
2843 ASSERT_TRUE(pool_->HasGroup("bar")); 2800 ASSERT_TRUE(pool_->HasGroup("bar"));
2844 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2801 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2845 } 2802 }
2846 2803
2847 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { 2804 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2848 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2805 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2849 pool_->EnableConnectBackupJobs(); 2806 pool_->EnableConnectBackupJobs();
2850 2807
2851 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2808 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2852 // timer. 2809 // timer.
2853 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2810 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2854 ClientSocketHandle handle; 2811 ClientSocketHandle handle;
2855 TestCompletionCallback callback; 2812 TestCompletionCallback callback;
2856 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2813 EXPECT_EQ(ERR_IO_PENDING,
2857 params_, 2814 handle.Init("bar",
2858 DEFAULT_PRIORITY, 2815 params_,
2859 callback.callback(), 2816 DEFAULT_PRIORITY,
2860 pool_.get(), 2817 callback.callback(),
2861 BoundNetLog())); 2818 pool_.get(),
2819 BoundNetLog()));
2862 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2863 ClientSocketHandle handle2; 2821 ClientSocketHandle handle2;
2864 TestCompletionCallback callback2; 2822 TestCompletionCallback callback2;
2865 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", 2823 EXPECT_EQ(ERR_IO_PENDING,
2866 params_, 2824 handle2.Init("bar",
2867 DEFAULT_PRIORITY, 2825 params_,
2868 callback2.callback(), 2826 DEFAULT_PRIORITY,
2869 pool_.get(), 2827 callback2.callback(),
2870 BoundNetLog())); 2828 pool_.get(),
2829 BoundNetLog()));
2871 ASSERT_TRUE(pool_->HasGroup("bar")); 2830 ASSERT_TRUE(pool_->HasGroup("bar"));
2872 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); 2831 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2873 2832
2874 // Cancel request 1 and then complete request 2. With the requests finished, 2833 // Cancel request 1 and then complete request 2. With the requests finished,
2875 // the backup timer should be cancelled. 2834 // the backup timer should be cancelled.
2876 handle.Reset(); 2835 handle.Reset();
2877 EXPECT_EQ(OK, callback2.WaitForResult()); 2836 EXPECT_EQ(OK, callback2.WaitForResult());
2878 // Wait for the backup timer to fire (add some slop to ensure it fires) 2837 // Wait for the backup timer to fire (add some slop to ensure it fires)
2879 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2838 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2880 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2839 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
3103 EXPECT_FALSE(pool_->HasGroup("a")); 3062 EXPECT_FALSE(pool_->HasGroup("a"));
3104 } 3063 }
3105 3064
3106 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { 3065 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3107 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3066 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3108 3067
3109 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3068 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3110 3069
3111 ClientSocketHandle handle1; 3070 ClientSocketHandle handle1;
3112 TestCompletionCallback callback1; 3071 TestCompletionCallback callback1;
3113 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3072 EXPECT_EQ(ERR_IO_PENDING,
3114 params_, 3073 handle1.Init("a",
3115 DEFAULT_PRIORITY, 3074 params_,
3116 callback1.callback(), 3075 DEFAULT_PRIORITY,
3117 pool_.get(), 3076 callback1.callback(),
3118 BoundNetLog())); 3077 pool_.get(),
3078 BoundNetLog()));
3119 3079
3120 ClientSocketHandle handle2; 3080 ClientSocketHandle handle2;
3121 TestCompletionCallback callback2; 3081 TestCompletionCallback callback2;
3122 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3082 EXPECT_EQ(ERR_IO_PENDING,
3123 params_, 3083 handle2.Init("a",
3124 DEFAULT_PRIORITY, 3084 params_,
3125 callback2.callback(), 3085 DEFAULT_PRIORITY,
3126 pool_.get(), 3086 callback2.callback(),
3127 BoundNetLog())); 3087 pool_.get(),
3088 BoundNetLog()));
3128 ClientSocketHandle handle3; 3089 ClientSocketHandle handle3;
3129 TestCompletionCallback callback3; 3090 TestCompletionCallback callback3;
3130 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 3091 EXPECT_EQ(ERR_IO_PENDING,
3131 params_, 3092 handle3.Init("a",
3132 DEFAULT_PRIORITY, 3093 params_,
3133 callback3.callback(), 3094 DEFAULT_PRIORITY,
3134 pool_.get(), 3095 callback3.callback(),
3135 BoundNetLog())); 3096 pool_.get(),
3097 BoundNetLog()));
3136 3098
3137 EXPECT_EQ(OK, callback1.WaitForResult()); 3099 EXPECT_EQ(OK, callback1.WaitForResult());
3138 EXPECT_EQ(OK, callback2.WaitForResult()); 3100 EXPECT_EQ(OK, callback2.WaitForResult());
3139 EXPECT_EQ(OK, callback3.WaitForResult()); 3101 EXPECT_EQ(OK, callback3.WaitForResult());
3140 3102
3141 // Use the socket. 3103 // Use the socket.
3142 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); 3104 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
3143 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); 3105 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
3144 3106
3145 handle1.Reset(); 3107 handle1.Reset();
3146 handle2.Reset(); 3108 handle2.Reset();
3147 handle3.Reset(); 3109 handle3.Reset();
3148 3110
3149 EXPECT_EQ(OK, handle1.Init("a", 3111 EXPECT_EQ(OK,
3150 params_, 3112 handle1.Init("a",
3151 DEFAULT_PRIORITY, 3113 params_,
3152 callback1.callback(), 3114 DEFAULT_PRIORITY,
3153 pool_.get(), 3115 callback1.callback(),
3154 BoundNetLog())); 3116 pool_.get(),
3155 EXPECT_EQ(OK, handle2.Init("a", 3117 BoundNetLog()));
3156 params_, 3118 EXPECT_EQ(OK,
3157 DEFAULT_PRIORITY, 3119 handle2.Init("a",
3158 callback2.callback(), 3120 params_,
3159 pool_.get(), 3121 DEFAULT_PRIORITY,
3160 BoundNetLog())); 3122 callback2.callback(),
3161 EXPECT_EQ(OK, handle3.Init("a", 3123 pool_.get(),
3162 params_, 3124 BoundNetLog()));
3163 DEFAULT_PRIORITY, 3125 EXPECT_EQ(OK,
3164 callback3.callback(), 3126 handle3.Init("a",
3165 pool_.get(), 3127 params_,
3166 BoundNetLog())); 3128 DEFAULT_PRIORITY,
3129 callback3.callback(),
3130 pool_.get(),
3131 BoundNetLog()));
3167 3132
3168 EXPECT_TRUE(handle1.socket()->WasEverUsed()); 3133 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3169 EXPECT_TRUE(handle2.socket()->WasEverUsed()); 3134 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3170 EXPECT_FALSE(handle3.socket()->WasEverUsed()); 3135 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3171 } 3136 }
3172 3137
3173 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { 3138 TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3175 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3140 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3176 3141
3177 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3142 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3178 3143
3179 ASSERT_TRUE(pool_->HasGroup("a")); 3144 ASSERT_TRUE(pool_->HasGroup("a"));
3180 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3145 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3181 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3146 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
3182 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3147 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3183 3148
3184 ClientSocketHandle handle1; 3149 ClientSocketHandle handle1;
3185 TestCompletionCallback callback1; 3150 TestCompletionCallback callback1;
3186 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3151 EXPECT_EQ(ERR_IO_PENDING,
3187 params_, 3152 handle1.Init("a",
3188 DEFAULT_PRIORITY, 3153 params_,
3189 callback1.callback(), 3154 DEFAULT_PRIORITY,
3190 pool_.get(), 3155 callback1.callback(),
3191 BoundNetLog())); 3156 pool_.get(),
3157 BoundNetLog()));
3192 3158
3193 ClientSocketHandle handle2; 3159 ClientSocketHandle handle2;
3194 TestCompletionCallback callback2; 3160 TestCompletionCallback callback2;
3195 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3161 EXPECT_EQ(ERR_IO_PENDING,
3196 params_, 3162 handle2.Init("a",
3197 DEFAULT_PRIORITY, 3163 params_,
3198 callback2.callback(), 3164 DEFAULT_PRIORITY,
3199 pool_.get(), 3165 callback2.callback(),
3200 BoundNetLog())); 3166 pool_.get(),
3167 BoundNetLog()));
3201 3168
3202 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3169 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3203 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3170 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3204 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3171 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3205 3172
3206 EXPECT_EQ(OK, callback1.WaitForResult()); 3173 EXPECT_EQ(OK, callback1.WaitForResult());
3207 EXPECT_EQ(OK, callback2.WaitForResult()); 3174 EXPECT_EQ(OK, callback2.WaitForResult());
3208 handle1.Reset(); 3175 handle1.Reset();
3209 handle2.Reset(); 3176 handle2.Reset();
3210 3177
3211 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3178 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3212 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3179 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3213 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3180 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3214 } 3181 }
3215 3182
3216 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { 3183 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3217 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3184 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3218 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3185 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3219 3186
3220 ClientSocketHandle handle1; 3187 ClientSocketHandle handle1;
3221 TestCompletionCallback callback1; 3188 TestCompletionCallback callback1;
3222 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3189 EXPECT_EQ(ERR_IO_PENDING,
3223 params_, 3190 handle1.Init("a",
3224 DEFAULT_PRIORITY, 3191 params_,
3225 callback1.callback(), 3192 DEFAULT_PRIORITY,
3226 pool_.get(), 3193 callback1.callback(),
3227 BoundNetLog())); 3194 pool_.get(),
3195 BoundNetLog()));
3228 3196
3229 ASSERT_TRUE(pool_->HasGroup("a")); 3197 ASSERT_TRUE(pool_->HasGroup("a"));
3230 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3198 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3231 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3199 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3232 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3200 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3233 3201
3234 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3202 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3235 3203
3236 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3204 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3237 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3205 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3238 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3206 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3239 3207
3240 ClientSocketHandle handle2; 3208 ClientSocketHandle handle2;
3241 TestCompletionCallback callback2; 3209 TestCompletionCallback callback2;
3242 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3210 EXPECT_EQ(ERR_IO_PENDING,
3243 params_, 3211 handle2.Init("a",
3244 DEFAULT_PRIORITY, 3212 params_,
3245 callback2.callback(), 3213 DEFAULT_PRIORITY,
3246 pool_.get(), 3214 callback2.callback(),
3247 BoundNetLog())); 3215 pool_.get(),
3216 BoundNetLog()));
3248 3217
3249 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3218 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3250 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3219 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3251 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3220 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3252 3221
3253 EXPECT_EQ(OK, callback1.WaitForResult()); 3222 EXPECT_EQ(OK, callback1.WaitForResult());
3254 EXPECT_EQ(OK, callback2.WaitForResult()); 3223 EXPECT_EQ(OK, callback2.WaitForResult());
3255 handle1.Reset(); 3224 handle1.Reset();
3256 handle2.Reset(); 3225 handle2.Reset();
3257 3226
3258 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3227 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3259 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3228 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3260 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3229 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3261 } 3230 }
3262 3231
3263 TEST_F(ClientSocketPoolBaseTest, 3232 TEST_F(ClientSocketPoolBaseTest,
3264 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { 3233 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3265 CreatePool(4, 4); 3234 CreatePool(4, 4);
3266 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3235 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3267 3236
3268 ClientSocketHandle handle1; 3237 ClientSocketHandle handle1;
3269 TestCompletionCallback callback1; 3238 TestCompletionCallback callback1;
3270 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3239 EXPECT_EQ(ERR_IO_PENDING,
3271 params_, 3240 handle1.Init("a",
3272 DEFAULT_PRIORITY, 3241 params_,
3273 callback1.callback(), 3242 DEFAULT_PRIORITY,
3274 pool_.get(), 3243 callback1.callback(),
3275 BoundNetLog())); 3244 pool_.get(),
3245 BoundNetLog()));
3276 3246
3277 ClientSocketHandle handle2; 3247 ClientSocketHandle handle2;
3278 TestCompletionCallback callback2; 3248 TestCompletionCallback callback2;
3279 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3249 EXPECT_EQ(ERR_IO_PENDING,
3280 params_, 3250 handle2.Init("a",
3281 DEFAULT_PRIORITY, 3251 params_,
3282 callback2.callback(), 3252 DEFAULT_PRIORITY,
3283 pool_.get(), 3253 callback2.callback(),
3284 BoundNetLog())); 3254 pool_.get(),
3255 BoundNetLog()));
3285 3256
3286 ClientSocketHandle handle3; 3257 ClientSocketHandle handle3;
3287 TestCompletionCallback callback3; 3258 TestCompletionCallback callback3;
3288 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 3259 EXPECT_EQ(ERR_IO_PENDING,
3289 params_, 3260 handle3.Init("a",
3290 DEFAULT_PRIORITY, 3261 params_,
3291 callback3.callback(), 3262 DEFAULT_PRIORITY,
3292 pool_.get(), 3263 callback3.callback(),
3293 BoundNetLog())); 3264 pool_.get(),
3265 BoundNetLog()));
3294 3266
3295 ASSERT_TRUE(pool_->HasGroup("a")); 3267 ASSERT_TRUE(pool_->HasGroup("a"));
3296 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3268 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3297 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3269 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3298 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3270 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3299 3271
3300 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3272 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3301 3273
3302 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3274 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3303 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3275 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
(...skipping 10 matching lines...) Expand all
3314 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3286 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3315 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); 3287 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3316 } 3288 }
3317 3289
3318 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { 3290 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3319 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3291 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3320 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3292 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3321 3293
3322 ASSERT_FALSE(pool_->HasGroup("a")); 3294 ASSERT_FALSE(pool_->HasGroup("a"));
3323 3295
3324 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, 3296 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, BoundNetLog());
3325 BoundNetLog());
3326 3297
3327 ASSERT_TRUE(pool_->HasGroup("a")); 3298 ASSERT_TRUE(pool_->HasGroup("a"));
3328 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a")); 3299 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
3329 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a")); 3300 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
3330 3301
3331 ASSERT_FALSE(pool_->HasGroup("b")); 3302 ASSERT_FALSE(pool_->HasGroup("b"));
3332 3303
3333 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, 3304 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, BoundNetLog());
3334 BoundNetLog());
3335 3305
3336 ASSERT_FALSE(pool_->HasGroup("b")); 3306 ASSERT_FALSE(pool_->HasGroup("b"));
3337 } 3307 }
3338 3308
3339 TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) { 3309 TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3340 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3310 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3341 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3311 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3342 3312
3343 ASSERT_FALSE(pool_->HasGroup("a")); 3313 ASSERT_FALSE(pool_->HasGroup("a"));
3344 3314
3345 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1, 3315 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1, BoundNetLog());
3346 BoundNetLog());
3347 3316
3348 ASSERT_TRUE(pool_->HasGroup("a")); 3317 ASSERT_TRUE(pool_->HasGroup("a"));
3349 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a")); 3318 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
3350 EXPECT_EQ(kDefaultMaxSockets - 1, 3319 EXPECT_EQ(kDefaultMaxSockets - 1,
3351 pool_->NumUnassignedConnectJobsInGroup("a")); 3320 pool_->NumUnassignedConnectJobsInGroup("a"));
3352 EXPECT_FALSE(pool_->IsStalled()); 3321 EXPECT_FALSE(pool_->IsStalled());
3353 3322
3354 ASSERT_FALSE(pool_->HasGroup("b")); 3323 ASSERT_FALSE(pool_->HasGroup("b"));
3355 3324
3356 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, 3325 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, BoundNetLog());
3357 BoundNetLog());
3358 3326
3359 ASSERT_TRUE(pool_->HasGroup("b")); 3327 ASSERT_TRUE(pool_->HasGroup("b"));
3360 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); 3328 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
3361 EXPECT_FALSE(pool_->IsStalled()); 3329 EXPECT_FALSE(pool_->IsStalled());
3362 } 3330 }
3363 3331
3364 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { 3332 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3365 CreatePool(4, 4); 3333 CreatePool(4, 4);
3366 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3334 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3367 3335
3368 ClientSocketHandle handle1; 3336 ClientSocketHandle handle1;
3369 TestCompletionCallback callback1; 3337 TestCompletionCallback callback1;
3370 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3338 EXPECT_EQ(ERR_IO_PENDING,
3371 params_, 3339 handle1.Init("a",
3372 DEFAULT_PRIORITY, 3340 params_,
3373 callback1.callback(), 3341 DEFAULT_PRIORITY,
3374 pool_.get(), 3342 callback1.callback(),
3375 BoundNetLog())); 3343 pool_.get(),
3344 BoundNetLog()));
3376 ASSERT_EQ(OK, callback1.WaitForResult()); 3345 ASSERT_EQ(OK, callback1.WaitForResult());
3377 handle1.Reset(); 3346 handle1.Reset();
3378 3347
3379 ASSERT_TRUE(pool_->HasGroup("a")); 3348 ASSERT_TRUE(pool_->HasGroup("a"));
3380 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3349 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3381 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3350 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3382 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3351 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3383 3352
3384 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3353 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3385 3354
3386 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3355 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3387 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3356 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3388 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3357 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3389 } 3358 }
3390 3359
3391 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { 3360 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3392 CreatePool(4, 4); 3361 CreatePool(4, 4);
3393 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3362 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3394 3363
3395 ClientSocketHandle handle1; 3364 ClientSocketHandle handle1;
3396 TestCompletionCallback callback1; 3365 TestCompletionCallback callback1;
3397 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3366 EXPECT_EQ(ERR_IO_PENDING,
3398 params_, 3367 handle1.Init("a",
3399 DEFAULT_PRIORITY, 3368 params_,
3400 callback1.callback(), 3369 DEFAULT_PRIORITY,
3401 pool_.get(), 3370 callback1.callback(),
3402 BoundNetLog())); 3371 pool_.get(),
3372 BoundNetLog()));
3403 ASSERT_EQ(OK, callback1.WaitForResult()); 3373 ASSERT_EQ(OK, callback1.WaitForResult());
3404 3374
3405 ASSERT_TRUE(pool_->HasGroup("a")); 3375 ASSERT_TRUE(pool_->HasGroup("a"));
3406 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3376 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3407 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3377 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3408 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3378 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3409 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3379 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3410 3380
3411 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3381 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3412 3382
3413 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3383 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3414 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3384 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3415 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3385 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3416 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3386 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3417 } 3387 }
3418 3388
3419 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) { 3389 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3420 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3390 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3421 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3391 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3422 3392
3423 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup, 3393 pool_->RequestSockets(
3424 BoundNetLog()); 3394 "a", &params_, kDefaultMaxSocketsPerGroup, BoundNetLog());
3425 3395
3426 ASSERT_TRUE(pool_->HasGroup("a")); 3396 ASSERT_TRUE(pool_->HasGroup("a"));
3427 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3397 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3428 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3398 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3429 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a")); 3399 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3430 3400
3431 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup, 3401 pool_->RequestSockets(
3432 BoundNetLog()); 3402 "b", &params_, kDefaultMaxSocketsPerGroup, BoundNetLog());
3433 3403
3434 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3404 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
3435 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3405 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
3436 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b")); 3406 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3437 } 3407 }
3438 3408
3439 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) { 3409 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3440 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3410 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3441 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3411 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3442 3412
3443 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup, 3413 pool_->RequestSockets(
3444 BoundNetLog()); 3414 "a", &params_, kDefaultMaxSocketsPerGroup, BoundNetLog());
3445 3415
3446 ASSERT_FALSE(pool_->HasGroup("a")); 3416 ASSERT_FALSE(pool_->HasGroup("a"));
3447 3417
3448 connect_job_factory_->set_job_type( 3418 connect_job_factory_->set_job_type(
3449 TestConnectJob::kMockAdditionalErrorStateJob); 3419 TestConnectJob::kMockAdditionalErrorStateJob);
3450 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup, 3420 pool_->RequestSockets(
3451 BoundNetLog()); 3421 "a", &params_, kDefaultMaxSocketsPerGroup, BoundNetLog());
3452 3422
3453 ASSERT_FALSE(pool_->HasGroup("a")); 3423 ASSERT_FALSE(pool_->HasGroup("a"));
3454 } 3424 }
3455 3425
3456 TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) { 3426 TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
3457 CreatePool(4, 4); 3427 CreatePool(4, 4);
3458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3428 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3459 3429
3460 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3430 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3461 3431
3462 ASSERT_TRUE(pool_->HasGroup("a")); 3432 ASSERT_TRUE(pool_->HasGroup("a"));
3463 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3433 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3464 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3434 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
3465 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3435 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3466 3436
3467 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3437 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3468 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3438 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3469 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3439 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
3470 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3440 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3471 3441
3472 ClientSocketHandle handle1; 3442 ClientSocketHandle handle1;
3473 TestCompletionCallback callback1; 3443 TestCompletionCallback callback1;
3474 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3444 EXPECT_EQ(ERR_IO_PENDING,
3475 params_, 3445 handle1.Init("a",
3476 DEFAULT_PRIORITY, 3446 params_,
3477 callback1.callback(), 3447 DEFAULT_PRIORITY,
3478 pool_.get(), 3448 callback1.callback(),
3479 BoundNetLog())); 3449 pool_.get(),
3450 BoundNetLog()));
3480 ASSERT_EQ(OK, callback1.WaitForResult()); 3451 ASSERT_EQ(OK, callback1.WaitForResult());
3481 3452
3482 ClientSocketHandle handle2; 3453 ClientSocketHandle handle2;
3483 TestCompletionCallback callback2; 3454 TestCompletionCallback callback2;
3484 int rv = handle2.Init("a", 3455 int rv = handle2.Init("a",
3485 params_, 3456 params_,
3486 DEFAULT_PRIORITY, 3457 DEFAULT_PRIORITY,
3487 callback2.callback(), 3458 callback2.callback(),
3488 pool_.get(), 3459 pool_.get(),
3489 BoundNetLog()); 3460 BoundNetLog());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3543 3514
3544 pool_->RequestSockets("a", &params_, 1, BoundNetLog()); 3515 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3545 3516
3546 ASSERT_TRUE(pool_->HasGroup("a")); 3517 ASSERT_TRUE(pool_->HasGroup("a"));
3547 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3518 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3548 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3519 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3549 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3520 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3550 3521
3551 ClientSocketHandle handle1; 3522 ClientSocketHandle handle1;
3552 TestCompletionCallback callback1; 3523 TestCompletionCallback callback1;
3553 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3524 EXPECT_EQ(ERR_IO_PENDING,
3554 params_, 3525 handle1.Init("a",
3555 DEFAULT_PRIORITY, 3526 params_,
3556 callback1.callback(), 3527 DEFAULT_PRIORITY,
3557 pool_.get(), 3528 callback1.callback(),
3558 BoundNetLog())); 3529 pool_.get(),
3530 BoundNetLog()));
3559 3531
3560 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3532 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3561 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3533 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3562 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3534 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3563 3535
3564 ASSERT_EQ(OK, callback1.WaitForResult()); 3536 ASSERT_EQ(OK, callback1.WaitForResult());
3565 3537
3566 // Make sure if a preconnected socket is not fully connected when a request 3538 // Make sure if a preconnected socket is not fully connected when a request
3567 // starts, it has a connect start time. 3539 // starts, it has a connect start time.
3568 TestLoadTimingInfoConnectedNotReused(handle1); 3540 TestLoadTimingInfoConnectedNotReused(handle1);
3569 handle1.Reset(); 3541 handle1.Reset();
3570 3542
3571 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3543 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3572 } 3544 }
3573 3545
3574 // Checks that fully connected preconnect jobs have no connect times, and are 3546 // Checks that fully connected preconnect jobs have no connect times, and are
3575 // marked as reused. 3547 // marked as reused.
3576 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) { 3548 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3549 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3578 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3550 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3579 pool_->RequestSockets("a", &params_, 1, BoundNetLog()); 3551 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3580 3552
3581 ASSERT_TRUE(pool_->HasGroup("a")); 3553 ASSERT_TRUE(pool_->HasGroup("a"));
3582 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3554 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3583 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3555 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3584 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3556 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3585 3557
3586 ClientSocketHandle handle; 3558 ClientSocketHandle handle;
3587 TestCompletionCallback callback; 3559 TestCompletionCallback callback;
3588 EXPECT_EQ(OK, handle.Init("a", 3560 EXPECT_EQ(OK,
3589 params_, 3561 handle.Init("a",
3590 DEFAULT_PRIORITY, 3562 params_,
3591 callback.callback(), 3563 DEFAULT_PRIORITY,
3592 pool_.get(), 3564 callback.callback(),
3593 BoundNetLog())); 3565 pool_.get(),
3566 BoundNetLog()));
3594 3567
3595 // Make sure the idle socket was used. 3568 // Make sure the idle socket was used.
3596 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3569 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3597 3570
3598 TestLoadTimingInfoConnectedReused(handle); 3571 TestLoadTimingInfoConnectedReused(handle);
3599 handle.Reset(); 3572 handle.Reset();
3600 TestLoadTimingInfoNotConnected(handle); 3573 TestLoadTimingInfoNotConnected(handle);
3601 } 3574 }
3602 3575
3603 // http://crbug.com/64940 regression test. 3576 // http://crbug.com/64940 regression test.
3604 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { 3577 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3605 const int kMaxTotalSockets = 3; 3578 const int kMaxTotalSockets = 3;
3606 const int kMaxSocketsPerGroup = 2; 3579 const int kMaxSocketsPerGroup = 2;
3607 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); 3580 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3608 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3581 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3609 3582
3610 // Note that group name ordering matters here. "a" comes before "b", so 3583 // Note that group name ordering matters here. "a" comes before "b", so
3611 // CloseOneIdleSocket() will try to close "a"'s idle socket. 3584 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3612 3585
3613 // Set up one idle socket in "a". 3586 // Set up one idle socket in "a".
3614 ClientSocketHandle handle1; 3587 ClientSocketHandle handle1;
3615 TestCompletionCallback callback1; 3588 TestCompletionCallback callback1;
3616 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3589 EXPECT_EQ(ERR_IO_PENDING,
3617 params_, 3590 handle1.Init("a",
3618 DEFAULT_PRIORITY, 3591 params_,
3619 callback1.callback(), 3592 DEFAULT_PRIORITY,
3620 pool_.get(), 3593 callback1.callback(),
3621 BoundNetLog())); 3594 pool_.get(),
3595 BoundNetLog()));
3622 3596
3623 ASSERT_EQ(OK, callback1.WaitForResult()); 3597 ASSERT_EQ(OK, callback1.WaitForResult());
3624 handle1.Reset(); 3598 handle1.Reset();
3625 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3599 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3626 3600
3627 // Set up two active sockets in "b". 3601 // Set up two active sockets in "b".
3628 ClientSocketHandle handle2; 3602 ClientSocketHandle handle2;
3629 TestCompletionCallback callback2; 3603 TestCompletionCallback callback2;
3630 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", 3604 EXPECT_EQ(ERR_IO_PENDING,
3631 params_, 3605 handle1.Init("b",
3632 DEFAULT_PRIORITY, 3606 params_,
3633 callback1.callback(), 3607 DEFAULT_PRIORITY,
3634 pool_.get(), 3608 callback1.callback(),
3635 BoundNetLog())); 3609 pool_.get(),
3636 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", 3610 BoundNetLog()));
3637 params_, 3611 EXPECT_EQ(ERR_IO_PENDING,
3638 DEFAULT_PRIORITY, 3612 handle2.Init("b",
3639 callback2.callback(), 3613 params_,
3640 pool_.get(), 3614 DEFAULT_PRIORITY,
3641 BoundNetLog())); 3615 callback2.callback(),
3616 pool_.get(),
3617 BoundNetLog()));
3642 3618
3643 ASSERT_EQ(OK, callback1.WaitForResult()); 3619 ASSERT_EQ(OK, callback1.WaitForResult());
3644 ASSERT_EQ(OK, callback2.WaitForResult()); 3620 ASSERT_EQ(OK, callback2.WaitForResult());
3645 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); 3621 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3646 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3622 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
3647 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); 3623 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3648 3624
3649 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means 3625 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3650 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. 3626 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3651 // Requesting 2 preconnected sockets for "a" should fail to allocate any more 3627 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
3714 pool_->RequestSockets("a", &params_, 1, BoundNetLog()); 3690 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3715 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3691 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3716 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3692 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3717 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3693 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3718 base::MessageLoop::current()->RunUntilIdle(); 3694 base::MessageLoop::current()->RunUntilIdle();
3719 3695
3720 // Make the backup job be a pending job, so it completes normally. 3696 // Make the backup job be a pending job, so it completes normally.
3721 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3697 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3722 ClientSocketHandle handle; 3698 ClientSocketHandle handle;
3723 TestCompletionCallback callback; 3699 TestCompletionCallback callback;
3724 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3700 EXPECT_EQ(ERR_IO_PENDING,
3725 params_, 3701 handle.Init("a",
3726 DEFAULT_PRIORITY, 3702 params_,
3727 callback.callback(), 3703 DEFAULT_PRIORITY,
3728 pool_.get(), 3704 callback.callback(),
3729 BoundNetLog())); 3705 pool_.get(),
3706 BoundNetLog()));
3730 // Timer has started, but the backup connect job shouldn't be created yet. 3707 // Timer has started, but the backup connect job shouldn't be created yet.
3731 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3708 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3732 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3709 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3733 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3710 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3734 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3711 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3735 ASSERT_EQ(OK, callback.WaitForResult()); 3712 ASSERT_EQ(OK, callback.WaitForResult());
3736 3713
3737 // The hung connect job should still be there, but everything else should be 3714 // The hung connect job should still be there, but everything else should be
3738 // complete. 3715 // complete.
3739 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3716 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
(...skipping 13 matching lines...) Expand all
3753 ASSERT_TRUE(pool_->HasGroup("a")); 3730 ASSERT_TRUE(pool_->HasGroup("a"));
3754 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3731 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3755 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3732 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3756 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3733 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3757 3734
3758 // Fail future jobs to be sure that handle receives the preconnected socket 3735 // Fail future jobs to be sure that handle receives the preconnected socket
3759 // rather than closing it and making a new one. 3736 // rather than closing it and making a new one.
3760 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3737 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3761 ClientSocketHandle handle; 3738 ClientSocketHandle handle;
3762 TestCompletionCallback callback; 3739 TestCompletionCallback callback;
3763 EXPECT_EQ(OK, handle.Init("a", 3740 EXPECT_EQ(OK,
3764 params_, 3741 handle.Init("a",
3765 DEFAULT_PRIORITY, 3742 params_,
3766 callback.callback(), 3743 DEFAULT_PRIORITY,
3767 pool_.get(), 3744 callback.callback(),
3768 BoundNetLog())); 3745 pool_.get(),
3746 BoundNetLog()));
3769 3747
3770 ASSERT_TRUE(pool_->HasGroup("a")); 3748 ASSERT_TRUE(pool_->HasGroup("a"));
3771 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3749 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3772 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3750 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3773 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3751 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3774 3752
3775 // Drain the pending read. 3753 // Drain the pending read.
3776 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback())); 3754 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3777 3755
3778 TestLoadTimingInfoConnectedReused(handle); 3756 TestLoadTimingInfoConnectedReused(handle);
3779 handle.Reset(); 3757 handle.Reset();
3780 3758
3781 // The socket should be usable now that it's idle again. 3759 // The socket should be usable now that it's idle again.
3782 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3760 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3783 } 3761 }
3784 3762
3785 class MockLayeredPool : public HigherLayeredPool { 3763 class MockLayeredPool : public HigherLayeredPool {
3786 public: 3764 public:
3787 MockLayeredPool(TestClientSocketPool* pool, 3765 MockLayeredPool(TestClientSocketPool* pool, const std::string& group_name)
3788 const std::string& group_name) 3766 : pool_(pool), group_name_(group_name), can_release_connection_(true) {
3789 : pool_(pool),
3790 group_name_(group_name),
3791 can_release_connection_(true) {
3792 pool_->AddHigherLayeredPool(this); 3767 pool_->AddHigherLayeredPool(this);
3793 } 3768 }
3794 3769
3795 ~MockLayeredPool() { 3770 ~MockLayeredPool() { pool_->RemoveHigherLayeredPool(this); }
3796 pool_->RemoveHigherLayeredPool(this);
3797 }
3798 3771
3799 int RequestSocket(TestClientSocketPool* pool) { 3772 int RequestSocket(TestClientSocketPool* pool) {
3800 scoped_refptr<TestSocketParams> params( 3773 scoped_refptr<TestSocketParams> params(
3801 new TestSocketParams(false /* ignore_limits */)); 3774 new TestSocketParams(false /* ignore_limits */));
3802 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, 3775 return handle_.Init(group_name_,
3803 callback_.callback(), pool, BoundNetLog()); 3776 params,
3777 DEFAULT_PRIORITY,
3778 callback_.callback(),
3779 pool,
3780 BoundNetLog());
3804 } 3781 }
3805 3782
3806 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { 3783 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
3807 scoped_refptr<TestSocketParams> params( 3784 scoped_refptr<TestSocketParams> params(
3808 new TestSocketParams(true /* ignore_limits */)); 3785 new TestSocketParams(true /* ignore_limits */));
3809 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, 3786 return handle_.Init(group_name_,
3810 callback_.callback(), pool, BoundNetLog()); 3787 params,
3788 MAXIMUM_PRIORITY,
3789 callback_.callback(),
3790 pool,
3791 BoundNetLog());
3811 } 3792 }
3812 3793
3813 bool ReleaseOneConnection() { 3794 bool ReleaseOneConnection() {
3814 if (!handle_.is_initialized() || !can_release_connection_) { 3795 if (!handle_.is_initialized() || !can_release_connection_) {
3815 return false; 3796 return false;
3816 } 3797 }
3817 handle_.socket()->Disconnect(); 3798 handle_.socket()->Disconnect();
3818 handle_.Reset(); 3799 handle_.Reset();
3819 return true; 3800 return true;
3820 } 3801 }
(...skipping 22 matching lines...) Expand all
3843 .WillOnce(Return(false)); 3824 .WillOnce(Return(false));
3844 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); 3825 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
3845 } 3826 }
3846 3827
3847 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { 3828 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3829 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3849 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3830 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3850 3831
3851 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); 3832 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
3852 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3833 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3853 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3834 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillOnce(
3854 .WillOnce(Invoke(&mock_layered_pool, 3835 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection));
3855 &MockLayeredPool::ReleaseOneConnection));
3856 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); 3836 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
3857 } 3837 }
3858 3838
3859 // Tests the basic case of closing an idle socket in a higher layered pool when 3839 // Tests the basic case of closing an idle socket in a higher layered pool when
3860 // a new request is issued and the lower layer pool is stalled. 3840 // a new request is issued and the lower layer pool is stalled.
3861 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { 3841 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3862 CreatePool(1, 1); 3842 CreatePool(1, 1);
3863 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3843 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3864 3844
3865 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); 3845 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
3866 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3846 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3867 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3847 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillOnce(
3868 .WillOnce(Invoke(&mock_layered_pool, 3848 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection));
3869 &MockLayeredPool::ReleaseOneConnection));
3870 ClientSocketHandle handle; 3849 ClientSocketHandle handle;
3871 TestCompletionCallback callback; 3850 TestCompletionCallback callback;
3872 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3851 EXPECT_EQ(ERR_IO_PENDING,
3873 params_, 3852 handle.Init("a",
3874 DEFAULT_PRIORITY, 3853 params_,
3875 callback.callback(), 3854 DEFAULT_PRIORITY,
3876 pool_.get(), 3855 callback.callback(),
3877 BoundNetLog())); 3856 pool_.get(),
3857 BoundNetLog()));
3878 EXPECT_EQ(OK, callback.WaitForResult()); 3858 EXPECT_EQ(OK, callback.WaitForResult());
3879 } 3859 }
3880 3860
3881 // Same as above, but the idle socket is in the same group as the stalled 3861 // Same as above, but the idle socket is in the same group as the stalled
3882 // socket, and closes the only other request in its group when closing requests 3862 // socket, and closes the only other request in its group when closing requests
3883 // in higher layered pools. This generally shouldn't happen, but it may be 3863 // in higher layered pools. This generally shouldn't happen, but it may be
3884 // possible if a higher level pool issues a request and the request is 3864 // possible if a higher level pool issues a request and the request is
3885 // subsequently cancelled. Even if it's not possible, best not to crash. 3865 // subsequently cancelled. Even if it's not possible, best not to crash.
3886 TEST_F(ClientSocketPoolBaseTest, 3866 TEST_F(ClientSocketPoolBaseTest,
3887 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { 3867 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3888 CreatePool(2, 2); 3868 CreatePool(2, 2);
3889 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3869 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3890 3870
3891 // Need a socket in another group for the pool to be stalled (If a group 3871 // Need a socket in another group for the pool to be stalled (If a group
3892 // has the maximum number of connections already, it's not stalled). 3872 // has the maximum number of connections already, it's not stalled).
3893 ClientSocketHandle handle1; 3873 ClientSocketHandle handle1;
3894 TestCompletionCallback callback1; 3874 TestCompletionCallback callback1;
3895 EXPECT_EQ(OK, handle1.Init("group1", 3875 EXPECT_EQ(OK,
3896 params_, 3876 handle1.Init("group1",
3897 DEFAULT_PRIORITY, 3877 params_,
3898 callback1.callback(), 3878 DEFAULT_PRIORITY,
3899 pool_.get(), 3879 callback1.callback(),
3900 BoundNetLog())); 3880 pool_.get(),
3881 BoundNetLog()));
3901 3882
3902 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3883 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3903 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3884 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3904 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3885 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillOnce(
3905 .WillOnce(Invoke(&mock_layered_pool, 3886 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection));
3906 &MockLayeredPool::ReleaseOneConnection));
3907 ClientSocketHandle handle; 3887 ClientSocketHandle handle;
3908 TestCompletionCallback callback2; 3888 TestCompletionCallback callback2;
3909 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2", 3889 EXPECT_EQ(ERR_IO_PENDING,
3910 params_, 3890 handle.Init("group2",
3911 DEFAULT_PRIORITY, 3891 params_,
3912 callback2.callback(), 3892 DEFAULT_PRIORITY,
3913 pool_.get(), 3893 callback2.callback(),
3914 BoundNetLog())); 3894 pool_.get(),
3895 BoundNetLog()));
3915 EXPECT_EQ(OK, callback2.WaitForResult()); 3896 EXPECT_EQ(OK, callback2.WaitForResult());
3916 } 3897 }
3917 3898
3918 // Tests the case when an idle socket can be closed when a new request is 3899 // Tests the case when an idle socket can be closed when a new request is
3919 // issued, and the new request belongs to a group that was previously stalled. 3900 // issued, and the new request belongs to a group that was previously stalled.
3920 TEST_F(ClientSocketPoolBaseTest, 3901 TEST_F(ClientSocketPoolBaseTest,
3921 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { 3902 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3922 CreatePool(2, 2); 3903 CreatePool(2, 2);
3923 std::list<TestConnectJob::JobType> job_types; 3904 std::list<TestConnectJob::JobType> job_types;
3924 job_types.push_back(TestConnectJob::kMockJob); 3905 job_types.push_back(TestConnectJob::kMockJob);
3925 job_types.push_back(TestConnectJob::kMockJob); 3906 job_types.push_back(TestConnectJob::kMockJob);
3926 job_types.push_back(TestConnectJob::kMockJob); 3907 job_types.push_back(TestConnectJob::kMockJob);
3927 job_types.push_back(TestConnectJob::kMockJob); 3908 job_types.push_back(TestConnectJob::kMockJob);
3928 connect_job_factory_->set_job_types(&job_types); 3909 connect_job_factory_->set_job_types(&job_types);
3929 3910
3930 ClientSocketHandle handle1; 3911 ClientSocketHandle handle1;
3931 TestCompletionCallback callback1; 3912 TestCompletionCallback callback1;
3932 EXPECT_EQ(OK, handle1.Init("group1", 3913 EXPECT_EQ(OK,
3933 params_, 3914 handle1.Init("group1",
3934 DEFAULT_PRIORITY, 3915 params_,
3935 callback1.callback(), 3916 DEFAULT_PRIORITY,
3936 pool_.get(), 3917 callback1.callback(),
3937 BoundNetLog())); 3918 pool_.get(),
3919 BoundNetLog()));
3938 3920
3939 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3921 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3940 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3922 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3941 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3923 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillRepeatedly(
3942 .WillRepeatedly(Invoke(&mock_layered_pool, 3924 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection));
3943 &MockLayeredPool::ReleaseOneConnection));
3944 mock_layered_pool.set_can_release_connection(false); 3925 mock_layered_pool.set_can_release_connection(false);
3945 3926
3946 // The third request is made when the socket pool is in a stalled state. 3927 // The third request is made when the socket pool is in a stalled state.
3947 ClientSocketHandle handle3; 3928 ClientSocketHandle handle3;
3948 TestCompletionCallback callback3; 3929 TestCompletionCallback callback3;
3949 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", 3930 EXPECT_EQ(ERR_IO_PENDING,
3950 params_, 3931 handle3.Init("group3",
3951 DEFAULT_PRIORITY, 3932 params_,
3952 callback3.callback(), 3933 DEFAULT_PRIORITY,
3953 pool_.get(), 3934 callback3.callback(),
3954 BoundNetLog())); 3935 pool_.get(),
3936 BoundNetLog()));
3955 3937
3956 base::RunLoop().RunUntilIdle(); 3938 base::RunLoop().RunUntilIdle();
3957 EXPECT_FALSE(callback3.have_result()); 3939 EXPECT_FALSE(callback3.have_result());
3958 3940
3959 // The fourth request is made when the pool is no longer stalled. The third 3941 // The fourth request is made when the pool is no longer stalled. The third
3960 // request should be serviced first, since it was issued first and has the 3942 // request should be serviced first, since it was issued first and has the
3961 // same priority. 3943 // same priority.
3962 mock_layered_pool.set_can_release_connection(true); 3944 mock_layered_pool.set_can_release_connection(true);
3963 ClientSocketHandle handle4; 3945 ClientSocketHandle handle4;
3964 TestCompletionCallback callback4; 3946 TestCompletionCallback callback4;
3965 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", 3947 EXPECT_EQ(ERR_IO_PENDING,
3966 params_, 3948 handle4.Init("group3",
3967 DEFAULT_PRIORITY, 3949 params_,
3968 callback4.callback(), 3950 DEFAULT_PRIORITY,
3969 pool_.get(), 3951 callback4.callback(),
3970 BoundNetLog())); 3952 pool_.get(),
3953 BoundNetLog()));
3971 EXPECT_EQ(OK, callback3.WaitForResult()); 3954 EXPECT_EQ(OK, callback3.WaitForResult());
3972 EXPECT_FALSE(callback4.have_result()); 3955 EXPECT_FALSE(callback4.have_result());
3973 3956
3974 // Closing a handle should free up another socket slot. 3957 // Closing a handle should free up another socket slot.
3975 handle1.Reset(); 3958 handle1.Reset();
3976 EXPECT_EQ(OK, callback4.WaitForResult()); 3959 EXPECT_EQ(OK, callback4.WaitForResult());
3977 } 3960 }
3978 3961
3979 // Tests the case when an idle socket can be closed when a new request is 3962 // Tests the case when an idle socket can be closed when a new request is
3980 // issued, and the new request belongs to a group that was previously stalled. 3963 // issued, and the new request belongs to a group that was previously stalled.
3981 // 3964 //
3982 // The two differences from the above test are that the stalled requests are not 3965 // The two differences from the above test are that the stalled requests are not
3983 // in the same group as the layered pool's request, and the the fourth request 3966 // in the same group as the layered pool's request, and the the fourth request
3984 // has a higher priority than the third one, so gets a socket first. 3967 // has a higher priority than the third one, so gets a socket first.
3985 TEST_F(ClientSocketPoolBaseTest, 3968 TEST_F(ClientSocketPoolBaseTest,
3986 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { 3969 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3987 CreatePool(2, 2); 3970 CreatePool(2, 2);
3988 std::list<TestConnectJob::JobType> job_types; 3971 std::list<TestConnectJob::JobType> job_types;
3989 job_types.push_back(TestConnectJob::kMockJob); 3972 job_types.push_back(TestConnectJob::kMockJob);
3990 job_types.push_back(TestConnectJob::kMockJob); 3973 job_types.push_back(TestConnectJob::kMockJob);
3991 job_types.push_back(TestConnectJob::kMockJob); 3974 job_types.push_back(TestConnectJob::kMockJob);
3992 job_types.push_back(TestConnectJob::kMockJob); 3975 job_types.push_back(TestConnectJob::kMockJob);
3993 connect_job_factory_->set_job_types(&job_types); 3976 connect_job_factory_->set_job_types(&job_types);
3994 3977
3995 ClientSocketHandle handle1; 3978 ClientSocketHandle handle1;
3996 TestCompletionCallback callback1; 3979 TestCompletionCallback callback1;
3997 EXPECT_EQ(OK, handle1.Init("group1", 3980 EXPECT_EQ(OK,
3998 params_, 3981 handle1.Init("group1",
3999 DEFAULT_PRIORITY, 3982 params_,
4000 callback1.callback(), 3983 DEFAULT_PRIORITY,
4001 pool_.get(), 3984 callback1.callback(),
4002 BoundNetLog())); 3985 pool_.get(),
3986 BoundNetLog()));
4003 3987
4004 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3988 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
4005 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3989 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
4006 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3990 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()).WillRepeatedly(
4007 .WillRepeatedly(Invoke(&mock_layered_pool, 3991 Invoke(&mock_layered_pool, &MockLayeredPool::ReleaseOneConnection));
4008 &MockLayeredPool::ReleaseOneConnection));
4009 mock_layered_pool.set_can_release_connection(false); 3992 mock_layered_pool.set_can_release_connection(false);
4010 3993
4011 // The third request is made when the socket pool is in a stalled state. 3994 // The third request is made when the socket pool is in a stalled state.
4012 ClientSocketHandle handle3; 3995 ClientSocketHandle handle3;
4013 TestCompletionCallback callback3; 3996 TestCompletionCallback callback3;
4014 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", 3997 EXPECT_EQ(ERR_IO_PENDING,
4015 params_, 3998 handle3.Init("group3",
4016 MEDIUM, 3999 params_,
4017 callback3.callback(), 4000 MEDIUM,
4018 pool_.get(), 4001 callback3.callback(),
4019 BoundNetLog())); 4002 pool_.get(),
4003 BoundNetLog()));
4020 4004
4021 base::RunLoop().RunUntilIdle(); 4005 base::RunLoop().RunUntilIdle();
4022 EXPECT_FALSE(callback3.have_result()); 4006 EXPECT_FALSE(callback3.have_result());
4023 4007
4024 // The fourth request is made when the pool is no longer stalled. This 4008 // The fourth request is made when the pool is no longer stalled. This
4025 // request has a higher priority than the third request, so is serviced first. 4009 // request has a higher priority than the third request, so is serviced first.
4026 mock_layered_pool.set_can_release_connection(true); 4010 mock_layered_pool.set_can_release_connection(true);
4027 ClientSocketHandle handle4; 4011 ClientSocketHandle handle4;
4028 TestCompletionCallback callback4; 4012 TestCompletionCallback callback4;
4029 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", 4013 EXPECT_EQ(ERR_IO_PENDING,
4030 params_, 4014 handle4.Init("group3",
4031 HIGHEST, 4015 params_,
4032 callback4.callback(), 4016 HIGHEST,
4033 pool_.get(), 4017 callback4.callback(),
4034 BoundNetLog())); 4018 pool_.get(),
4019 BoundNetLog()));
4035 EXPECT_EQ(OK, callback4.WaitForResult()); 4020 EXPECT_EQ(OK, callback4.WaitForResult());
4036 EXPECT_FALSE(callback3.have_result()); 4021 EXPECT_FALSE(callback3.have_result());
4037 4022
4038 // Closing a handle should free up another socket slot. 4023 // Closing a handle should free up another socket slot.
4039 handle1.Reset(); 4024 handle1.Reset();
4040 EXPECT_EQ(OK, callback3.WaitForResult()); 4025 EXPECT_EQ(OK, callback3.WaitForResult());
4041 } 4026 }
4042 4027
4043 TEST_F(ClientSocketPoolBaseTest, 4028 TEST_F(ClientSocketPoolBaseTest,
4044 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { 4029 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4045 CreatePool(1, 1); 4030 CreatePool(1, 1);
4046 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 4031 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4047 4032
4048 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); 4033 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
4049 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); 4034 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get()));
4050 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) 4035 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()).WillRepeatedly(
4051 .WillRepeatedly(Invoke(&mock_layered_pool1, 4036 Invoke(&mock_layered_pool1, &MockLayeredPool::ReleaseOneConnection));
4052 &MockLayeredPool::ReleaseOneConnection));
4053 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); 4037 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
4054 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); 4038 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()));
4055 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) 4039 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()).WillRepeatedly(
4056 .WillRepeatedly(Invoke(&mock_layered_pool2, 4040 Invoke(&mock_layered_pool2, &MockLayeredPool::ReleaseOneConnection));
4057 &MockLayeredPool::ReleaseOneConnection));
4058 ClientSocketHandle handle; 4041 ClientSocketHandle handle;
4059 TestCompletionCallback callback; 4042 TestCompletionCallback callback;
4060 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 4043 EXPECT_EQ(ERR_IO_PENDING,
4061 params_, 4044 handle.Init("a",
4062 DEFAULT_PRIORITY, 4045 params_,
4063 callback.callback(), 4046 DEFAULT_PRIORITY,
4064 pool_.get(), 4047 callback.callback(),
4065 BoundNetLog())); 4048 pool_.get(),
4049 BoundNetLog()));
4066 EXPECT_EQ(OK, callback.WaitForResult()); 4050 EXPECT_EQ(OK, callback.WaitForResult());
4067 } 4051 }
4068 4052
4069 // Test that when a socket pool and group are at their limits, a request 4053 // Test that when a socket pool and group are at their limits, a request
4070 // with |ignore_limits| triggers creation of a new socket, and gets the socket 4054 // with |ignore_limits| triggers creation of a new socket, and gets the socket
4071 // instead of a request with the same priority that was issued earlier, but 4055 // instead of a request with the same priority that was issued earlier, but
4072 // that does not have |ignore_limits| set. 4056 // that does not have |ignore_limits| set.
4073 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { 4057 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
4074 scoped_refptr<TestSocketParams> params_ignore_limits( 4058 scoped_refptr<TestSocketParams> params_ignore_limits(
4075 new TestSocketParams(true /* ignore_limits */)); 4059 new TestSocketParams(true /* ignore_limits */));
4076 CreatePool(1, 1); 4060 CreatePool(1, 1);
4077 4061
4078 // Issue a request to reach the socket pool limit. 4062 // Issue a request to reach the socket pool limit.
4079 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); 4063 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
4080 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4064 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4081 4065
4082 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 4066 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4083 4067
4084 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4068 EXPECT_EQ(ERR_IO_PENDING,
4085 params_)); 4069 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
4086 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4070 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4087 4071
4088 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4072 EXPECT_EQ(
4089 params_ignore_limits)); 4073 ERR_IO_PENDING,
4074 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_ignore_limits));
4090 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4075 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4091 4076
4092 EXPECT_EQ(OK, request(2)->WaitForResult()); 4077 EXPECT_EQ(OK, request(2)->WaitForResult());
4093 EXPECT_FALSE(request(1)->have_result()); 4078 EXPECT_FALSE(request(1)->have_result());
4094 } 4079 }
4095 4080
4096 // Test that when a socket pool and group are at their limits, a ConnectJob 4081 // Test that when a socket pool and group are at their limits, a ConnectJob
4097 // issued for a request with |ignore_limits| set is not cancelled when a request 4082 // issued for a request with |ignore_limits| set is not cancelled when a request
4098 // without |ignore_limits| issued to the same group is cancelled. 4083 // without |ignore_limits| issued to the same group is cancelled.
4099 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { 4084 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
4100 scoped_refptr<TestSocketParams> params_ignore_limits( 4085 scoped_refptr<TestSocketParams> params_ignore_limits(
4101 new TestSocketParams(true /* ignore_limits */)); 4086 new TestSocketParams(true /* ignore_limits */));
4102 CreatePool(1, 1); 4087 CreatePool(1, 1);
4103 4088
4104 // Issue a request to reach the socket pool limit. 4089 // Issue a request to reach the socket pool limit.
4105 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); 4090 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
4106 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4091 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4107 4092
4108 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 4093 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4109 4094
4110 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4095 EXPECT_EQ(ERR_IO_PENDING,
4111 params_)); 4096 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
4112 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4097 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4113 4098
4114 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4099 EXPECT_EQ(
4115 params_ignore_limits)); 4100 ERR_IO_PENDING,
4101 StartRequestWithParams("a", MAXIMUM_PRIORITY, params_ignore_limits));
4116 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4102 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4117 4103
4118 // Cancel the pending request without ignore_limits set. The ConnectJob 4104 // Cancel the pending request without ignore_limits set. The ConnectJob
4119 // should not be cancelled. 4105 // should not be cancelled.
4120 request(1)->handle()->Reset(); 4106 request(1)->handle()->Reset();
4121 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4107 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4122 4108
4123 EXPECT_EQ(OK, request(2)->WaitForResult()); 4109 EXPECT_EQ(OK, request(2)->WaitForResult());
4124 EXPECT_FALSE(request(1)->have_result()); 4110 EXPECT_FALSE(request(1)->have_result());
4125 } 4111 }
4126 4112
4127 } // namespace 4113 } // namespace
4128 4114
4129 } // namespace net 4115 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698