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

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

Issue 149027: Limit total number of sockets in the system.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: reorder Created 11 years, 5 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
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | net/socket/tcp_client_socket_pool.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/scoped_vector.h" 9 #include "base/scoped_vector.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
11 #include "net/base/test_completion_callback.h" 11 #include "net/base/test_completion_callback.h"
12 #include "net/socket/client_socket.h" 12 #include "net/socket/client_socket.h"
13 #include "net/socket/client_socket_factory.h" 13 #include "net/socket/client_socket_factory.h"
14 #include "net/socket/client_socket_handle.h" 14 #include "net/socket/client_socket_handle.h"
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 16
17 namespace net { 17 namespace net {
18 18
19 namespace { 19 namespace {
20 20
21 const int kDefaultMaxSockets = 4;
22
21 const int kDefaultMaxSocketsPerGroup = 2; 23 const int kDefaultMaxSocketsPerGroup = 2;
22 24
23 const int kDefaultPriority = 5; 25 const int kDefaultPriority = 5;
24 26
25 class MockClientSocket : public ClientSocket { 27 class MockClientSocket : public ClientSocket {
26 public: 28 public:
27 MockClientSocket() : connected_(false) {} 29 MockClientSocket() : connected_(false) {}
28 30
29 // Socket methods: 31 // Socket methods:
30 virtual int Read( 32 virtual int Read(
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 private: 250 private:
249 TestConnectJob::JobType job_type_; 251 TestConnectJob::JobType job_type_;
250 MockClientSocketFactory* const client_socket_factory_; 252 MockClientSocketFactory* const client_socket_factory_;
251 253
252 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory); 254 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
253 }; 255 };
254 256
255 class TestClientSocketPool : public ClientSocketPool { 257 class TestClientSocketPool : public ClientSocketPool {
256 public: 258 public:
257 TestClientSocketPool( 259 TestClientSocketPool(
260 int max_sockets,
258 int max_sockets_per_group, 261 int max_sockets_per_group,
259 ClientSocketPoolBase::ConnectJobFactory* connect_job_factory) 262 ClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
260 : base_(new ClientSocketPoolBase( 263 : base_(new ClientSocketPoolBase(
261 max_sockets_per_group, connect_job_factory)) {} 264 max_sockets, max_sockets_per_group, connect_job_factory)) {}
262 265
263 virtual int RequestSocket( 266 virtual int RequestSocket(
264 const std::string& group_name, 267 const std::string& group_name,
265 const HostResolver::RequestInfo& resolve_info, 268 const HostResolver::RequestInfo& resolve_info,
266 int priority, 269 int priority,
267 ClientSocketHandle* handle, 270 ClientSocketHandle* handle,
268 CompletionCallback* callback) { 271 CompletionCallback* callback) {
269 return base_->RequestSocket( 272 return base_->RequestSocket(
270 group_name, resolve_info, priority, handle, callback); 273 group_name, resolve_info, priority, handle, callback);
271 } 274 }
(...skipping 18 matching lines...) Expand all
290 293
291 virtual int IdleSocketCountInGroup(const std::string& group_name) const { 294 virtual int IdleSocketCountInGroup(const std::string& group_name) const {
292 return base_->IdleSocketCountInGroup(group_name); 295 return base_->IdleSocketCountInGroup(group_name);
293 } 296 }
294 297
295 virtual LoadState GetLoadState(const std::string& group_name, 298 virtual LoadState GetLoadState(const std::string& group_name,
296 const ClientSocketHandle* handle) const { 299 const ClientSocketHandle* handle) const {
297 return base_->GetLoadState(group_name, handle); 300 return base_->GetLoadState(group_name, handle);
298 } 301 }
299 302
300 int MaxSocketsPerGroup() const { 303 const ClientSocketPoolBase* base() const { return base_.get(); }
301 return base_->max_sockets_per_group();
302 }
303 304
304 private: 305 private:
305 const scoped_refptr<ClientSocketPoolBase> base_; 306 const scoped_refptr<ClientSocketPoolBase> base_;
306 307
307 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); 308 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
308 }; 309 };
309 310
310 void MockClientSocketFactory::SignalJobs() { 311 void MockClientSocketFactory::SignalJobs() {
311 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); 312 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
312 it != waiting_jobs_.end(); ++it) { 313 it != waiting_jobs_.end(); ++it) {
313 (*it)->Signal(); 314 (*it)->Signal();
314 } 315 }
315 waiting_jobs_.clear(); 316 waiting_jobs_.clear();
316 } 317 }
317 318
318 class ClientSocketPoolBaseTest : public testing::Test { 319 class ClientSocketPoolBaseTest : public testing::Test {
319 protected: 320 protected:
320 ClientSocketPoolBaseTest() 321 ClientSocketPoolBaseTest()
321 : ignored_request_info_("ignored", 80), 322 : ignored_request_info_("ignored", 80),
322 connect_job_factory_( 323 connect_job_factory_(
323 new TestConnectJobFactory(&client_socket_factory_)) {} 324 new TestConnectJobFactory(&client_socket_factory_)) {}
324 325
325 void CreatePool(int max_sockets_per_group) { 326 void CreatePool(int max_sockets, int max_sockets_per_group) {
326 DCHECK(!pool_.get()); 327 DCHECK(!pool_.get());
327 pool_ = new TestClientSocketPool(max_sockets_per_group, 328 pool_ = new TestClientSocketPool(max_sockets,
329 max_sockets_per_group,
328 connect_job_factory_); 330 connect_job_factory_);
329 } 331 }
330 332
331 virtual void SetUp() { 333 virtual void SetUp() {
332 TestSocketRequest::completion_count = 0; 334 TestSocketRequest::completion_count = 0;
333 } 335 }
334 336
335 virtual void TearDown() { 337 virtual void TearDown() {
336 // The tests often call Reset() on handles at the end which may post 338 // The tests often call Reset() on handles at the end which may post
337 // DoReleaseSocket() tasks. 339 // DoReleaseSocket() tasks.
338 MessageLoop::current()->RunAllPending(); 340 MessageLoop::current()->RunAllPending();
339 // Need to delete |pool_| before we turn late binding back off. 341
340 // TODO(willchan): Remove this line when late binding becomes the default. 342 // Need to delete |pool_| before we turn late binding back off. We also need
343 // to delete |requests_| because the pool is reference counted and requests
344 // keep reference to it.
345 // TODO(willchan): Remove this part when late binding becomes the default.
341 pool_ = NULL; 346 pool_ = NULL;
347 requests_.reset();
348
342 ClientSocketPoolBase::EnableLateBindingOfSockets(false); 349 ClientSocketPoolBase::EnableLateBindingOfSockets(false);
343 } 350 }
344 351
345 int StartRequest(const std::string& group_name, int priority) { 352 int StartRequest(const std::string& group_name, int priority) {
346 DCHECK(pool_.get()); 353 DCHECK(pool_.get());
347 TestSocketRequest* request = new TestSocketRequest(pool_.get(), 354 TestSocketRequest* request = new TestSocketRequest(pool_.get(),
348 &request_order_); 355 &request_order_);
349 requests_.push_back(request); 356 requests_.push_back(request);
350 int rv = request->handle.Init(group_name, ignored_request_info_, priority, 357 int rv = request->handle.Init(group_name, ignored_request_info_, priority,
351 request); 358 request);
(...skipping 15 matching lines...) Expand all
367 return i + 1; 374 return i + 1;
368 375
369 return kRequestNotFound; 376 return kRequestNotFound;
370 } 377 }
371 378
372 enum KeepAlive { 379 enum KeepAlive {
373 KEEP_ALIVE, 380 KEEP_ALIVE,
374 NO_KEEP_ALIVE, 381 NO_KEEP_ALIVE,
375 }; 382 };
376 383
384 bool ReleaseOneConnection(KeepAlive keep_alive) {
385 ScopedVector<TestSocketRequest>::iterator i;
386 for (i = requests_.begin(); i != requests_.end(); ++i) {
387 if ((*i)->handle.is_initialized()) {
388 if (keep_alive == NO_KEEP_ALIVE)
389 (*i)->handle.socket()->Disconnect();
390 (*i)->handle.Reset();
391 MessageLoop::current()->RunAllPending();
392 return true;
393 }
394 }
395 return false;
396 }
397
377 void ReleaseAllConnections(KeepAlive keep_alive) { 398 void ReleaseAllConnections(KeepAlive keep_alive) {
378 bool released_one; 399 bool released_one;
379 do { 400 do {
380 released_one = false; 401 released_one = ReleaseOneConnection(keep_alive);
381 ScopedVector<TestSocketRequest>::iterator i;
382 for (i = requests_.begin(); i != requests_.end(); ++i) {
383 if ((*i)->handle.is_initialized()) {
384 if (keep_alive == NO_KEEP_ALIVE)
385 (*i)->handle.socket()->Disconnect();
386 (*i)->handle.Reset();
387 MessageLoop::current()->RunAllPending();
388 released_one = true;
389 }
390 }
391 } while (released_one); 402 } while (released_one);
392 } 403 }
393 404
394 HostResolver::RequestInfo ignored_request_info_; 405 HostResolver::RequestInfo ignored_request_info_;
395 MockClientSocketFactory client_socket_factory_; 406 MockClientSocketFactory client_socket_factory_;
396 TestConnectJobFactory* const connect_job_factory_; 407 TestConnectJobFactory* const connect_job_factory_;
397 scoped_refptr<TestClientSocketPool> pool_; 408 scoped_refptr<TestClientSocketPool> pool_;
398 ScopedVector<TestSocketRequest> requests_; 409 ScopedVector<TestSocketRequest> requests_;
399 std::vector<TestSocketRequest*> request_order_; 410 std::vector<TestSocketRequest*> request_order_;
400 }; 411 };
401 412
402 // static 413 // static
403 const int ClientSocketPoolBaseTest::kIndexOutOfBounds = -1; 414 const int ClientSocketPoolBaseTest::kIndexOutOfBounds = -1;
404 415
405 // static 416 // static
406 const int ClientSocketPoolBaseTest::kRequestNotFound = -2; 417 const int ClientSocketPoolBaseTest::kRequestNotFound = -2;
407 418
408 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { 419 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
409 CreatePool(kDefaultMaxSocketsPerGroup); 420 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
410 421
411 TestCompletionCallback callback; 422 TestCompletionCallback callback;
412 ClientSocketHandle handle(pool_.get()); 423 ClientSocketHandle handle(pool_.get());
413 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, 424 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority,
414 &callback)); 425 &callback));
415 EXPECT_TRUE(handle.is_initialized()); 426 EXPECT_TRUE(handle.is_initialized());
416 EXPECT_TRUE(handle.socket()); 427 EXPECT_TRUE(handle.socket());
417 handle.Reset(); 428 handle.Reset();
418 } 429 }
419 430
420 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { 431 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
421 CreatePool(kDefaultMaxSocketsPerGroup); 432 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
422 433
423 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 434 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
424 TestSocketRequest req(pool_.get(), &request_order_); 435 TestSocketRequest req(pool_.get(), &request_order_);
425 int rv = req.handle.Init("a", ignored_request_info_, 0, &req); 436 int rv = req.handle.Init("a", ignored_request_info_, 0, &req);
426 EXPECT_EQ(ERR_IO_PENDING, rv); 437 EXPECT_EQ(ERR_IO_PENDING, rv);
427 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); 438 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle));
428 EXPECT_EQ(OK, req.WaitForResult()); 439 EXPECT_EQ(OK, req.WaitForResult());
429 EXPECT_TRUE(req.handle.is_initialized()); 440 EXPECT_TRUE(req.handle.is_initialized());
430 EXPECT_TRUE(req.handle.socket()); 441 EXPECT_TRUE(req.handle.socket());
431 req.handle.Reset(); 442 req.handle.Reset();
432 } 443 }
433 444
434 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { 445 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
435 CreatePool(kDefaultMaxSocketsPerGroup); 446 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
436 447
437 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 448 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
438 TestSocketRequest req(pool_.get(), &request_order_); 449 TestSocketRequest req(pool_.get(), &request_order_);
439 EXPECT_EQ(ERR_CONNECTION_FAILED, 450 EXPECT_EQ(ERR_CONNECTION_FAILED,
440 req.handle.Init("a", ignored_request_info_, 451 req.handle.Init("a", ignored_request_info_,
441 kDefaultPriority, &req)); 452 kDefaultPriority, &req));
442 } 453 }
443 454
444 TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) { 455 TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) {
445 CreatePool(kDefaultMaxSocketsPerGroup); 456 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
446 457
447 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
448 TestSocketRequest req(pool_.get(), &request_order_); 459 TestSocketRequest req(pool_.get(), &request_order_);
449 EXPECT_EQ(ERR_IO_PENDING, 460 EXPECT_EQ(ERR_IO_PENDING,
450 req.handle.Init("a", ignored_request_info_, 5, &req)); 461 req.handle.Init("a", ignored_request_info_, 5, &req));
451 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); 462 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle));
452 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 463 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
453 } 464 }
454 465
466 TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
467 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
468
469 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
470 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
471 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority));
472 EXPECT_EQ(OK, StartRequest("d", kDefaultPriority));
473
474 EXPECT_EQ(static_cast<int>(requests_.size()),
475 client_socket_factory_.allocation_count());
476 EXPECT_EQ(requests_.size() - kDefaultMaxSockets,
477 TestSocketRequest::completion_count);
478
479 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority));
480 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", kDefaultPriority));
481 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", kDefaultPriority));
482
483 ReleaseAllConnections(KEEP_ALIVE);
484
485 EXPECT_EQ(static_cast<int>(requests_.size()),
486 client_socket_factory_.allocation_count());
487 EXPECT_EQ(requests_.size() - kDefaultMaxSockets,
488 TestSocketRequest::completion_count);
489
490 EXPECT_EQ(1, GetOrderOfRequest(1));
491 EXPECT_EQ(2, GetOrderOfRequest(2));
492 EXPECT_EQ(3, GetOrderOfRequest(3));
493 EXPECT_EQ(4, GetOrderOfRequest(4));
494 EXPECT_EQ(5, GetOrderOfRequest(5));
495 EXPECT_EQ(6, GetOrderOfRequest(6));
496 EXPECT_EQ(7, GetOrderOfRequest(7));
497 }
498
499 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
500 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
501
502 // Reach all limits: max total sockets, and max sockets per group.
503 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
504 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
505 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
506 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
507
508 EXPECT_EQ(static_cast<int>(requests_.size()),
509 client_socket_factory_.allocation_count());
510 EXPECT_EQ(requests_.size() - kDefaultMaxSockets,
511 TestSocketRequest::completion_count);
512
513 // Now create a new group and verify that we don't starve it.
514 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority));
515
516 ReleaseAllConnections(KEEP_ALIVE);
517
518 EXPECT_EQ(static_cast<int>(requests_.size()),
519 client_socket_factory_.allocation_count());
520 EXPECT_EQ(requests_.size() - kDefaultMaxSockets,
521 TestSocketRequest::completion_count);
522
523 EXPECT_EQ(1, GetOrderOfRequest(1));
524 EXPECT_EQ(2, GetOrderOfRequest(2));
525 EXPECT_EQ(3, GetOrderOfRequest(3));
526 EXPECT_EQ(4, GetOrderOfRequest(4));
527 EXPECT_EQ(5, GetOrderOfRequest(5));
528 }
529
530 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
531 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
532
533 EXPECT_EQ(OK, StartRequest("b", 3));
534 EXPECT_EQ(OK, StartRequest("a", 3));
535 EXPECT_EQ(OK, StartRequest("b", 6));
536 EXPECT_EQ(OK, StartRequest("a", 6));
537
538 EXPECT_EQ(static_cast<int>(requests_.size()),
539 client_socket_factory_.allocation_count());
540
541 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", 4));
542 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 5));
543 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", 7));
544
545 ReleaseAllConnections(KEEP_ALIVE);
546
547 // We're re-using one socket for group "a", and one for "b".
548 EXPECT_EQ(static_cast<int>(requests_.size()) - 2,
549 client_socket_factory_.allocation_count());
550 EXPECT_EQ(requests_.size() - kDefaultMaxSockets,
551 TestSocketRequest::completion_count);
552
553 // First 4 requests don't have to wait, and finish in order.
554 EXPECT_EQ(1, GetOrderOfRequest(1));
555 EXPECT_EQ(2, GetOrderOfRequest(2));
556 EXPECT_EQ(3, GetOrderOfRequest(3));
557 EXPECT_EQ(4, GetOrderOfRequest(4));
558
559 // Request ("b", 7) has the highest priority, then ("a", 5),
560 // and then ("c", 4).
561 EXPECT_EQ(7, GetOrderOfRequest(5));
562 EXPECT_EQ(6, GetOrderOfRequest(6));
563 EXPECT_EQ(5, GetOrderOfRequest(7));
564 }
565
566 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
567 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
568
569 EXPECT_EQ(OK, StartRequest("a", 3));
570 EXPECT_EQ(OK, StartRequest("a", 6));
571 EXPECT_EQ(OK, StartRequest("b", 3));
572 EXPECT_EQ(OK, StartRequest("b", 6));
573
574 EXPECT_EQ(static_cast<int>(requests_.size()),
575 client_socket_factory_.allocation_count());
576
577 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", 6));
578 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
579 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", 7));
580
581 ReleaseAllConnections(KEEP_ALIVE);
582
583 // We're re-using one socket for group "a", and one for "b".
584 EXPECT_EQ(static_cast<int>(requests_.size()) - 2,
585 client_socket_factory_.allocation_count());
586 EXPECT_EQ(requests_.size() - kDefaultMaxSockets,
587 TestSocketRequest::completion_count);
588
589 // First 4 requests don't have to wait, and finish in order.
590 EXPECT_EQ(1, GetOrderOfRequest(1));
591 EXPECT_EQ(2, GetOrderOfRequest(2));
592 EXPECT_EQ(3, GetOrderOfRequest(3));
593 EXPECT_EQ(4, GetOrderOfRequest(4));
594
595 // Request ("b", 7) has the highest priority, but we can't make new socket for
596 // group "b", because it has reached the per-group limit. Then we make
597 // socket for ("c", 6), because it has higher priority than ("a", 4),
598 // and we still can't make a socket for group "b".
599 EXPECT_EQ(5, GetOrderOfRequest(5));
600 EXPECT_EQ(6, GetOrderOfRequest(6));
601 EXPECT_EQ(7, GetOrderOfRequest(7));
602 }
603
604 // Make sure that we count connecting sockets against the total limit.
605 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
606 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
607
608 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
609 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
610 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority));
611
612 // Create one asynchronous request.
613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
614 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority));
615
616 // The next synchronous request should wait for its turn.
617 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
618 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority));
619
620 ReleaseAllConnections(KEEP_ALIVE);
621
622 EXPECT_EQ(static_cast<int>(requests_.size()),
623 client_socket_factory_.allocation_count());
624
625 EXPECT_EQ(1, GetOrderOfRequest(1));
626 EXPECT_EQ(2, GetOrderOfRequest(2));
627 EXPECT_EQ(3, GetOrderOfRequest(3));
628 EXPECT_EQ(4, GetOrderOfRequest(4));
629 }
630
631 // Inside ClientSocketPoolBase we have a may_have_stalled_group flag,
632 // which tells it to use more expensive, but accurate, group selection
633 // algorithm. Make sure it doesn't get stuck in the "on" state.
634 TEST_F(ClientSocketPoolBaseTest, MayHaveStalledGroupReset) {
635 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
636
637 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
638
639 // Reach group socket limit.
640 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
641 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
642 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
643
644 // Reach total limit, but don't request more sockets.
645 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
646 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority));
647 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
648
649 // Request one more socket while we are at the maximum sockets limit.
650 // This should flip the may_have_stalled_group flag.
651 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority));
652 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
653
654 // After releasing first connection for "a", we're still at the
655 // maximum sockets limit, but every group's pending queue is empty,
656 // so we reset the flag.
657 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
658 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
659
660 // Requesting additional socket while at the total limit should
661 // flip the flag back to "on".
662 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority));
663 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
664
665 // We'll request one more socket to verify that we don't reset the flag
666 // too eagerly.
667 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority));
668 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
669
670 // We're at the maximum socket limit, and still have one request pending
671 // for "d". Flag should be "on".
672 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
673 EXPECT_TRUE(pool_->base()->may_have_stalled_group());
674
675 // Now every group's pending queue should be empty again.
676 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE));
677 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
678
679 ReleaseAllConnections(KEEP_ALIVE);
680 EXPECT_FALSE(pool_->base()->may_have_stalled_group());
681 }
682
455 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { 683 TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
456 CreatePool(kDefaultMaxSocketsPerGroup); 684 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
457 685
458 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 686 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
459 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 687 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
460 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 688 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
461 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); 689 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
462 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); 690 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
463 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); 691 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
464 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 692 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
465 693
466 ReleaseAllConnections(KEEP_ALIVE); 694 ReleaseAllConnections(KEEP_ALIVE);
467 695
468 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 696 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
469 client_socket_factory_.allocation_count()); 697 client_socket_factory_.allocation_count());
470 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, 698 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup,
471 TestSocketRequest::completion_count); 699 TestSocketRequest::completion_count);
472 700
473 EXPECT_EQ(1, GetOrderOfRequest(1)); 701 EXPECT_EQ(1, GetOrderOfRequest(1));
474 EXPECT_EQ(2, GetOrderOfRequest(2)); 702 EXPECT_EQ(2, GetOrderOfRequest(2));
475 EXPECT_EQ(6, GetOrderOfRequest(3)); 703 EXPECT_EQ(6, GetOrderOfRequest(3));
476 EXPECT_EQ(4, GetOrderOfRequest(4)); 704 EXPECT_EQ(4, GetOrderOfRequest(4));
477 EXPECT_EQ(3, GetOrderOfRequest(5)); 705 EXPECT_EQ(3, GetOrderOfRequest(5));
478 EXPECT_EQ(5, GetOrderOfRequest(6)); 706 EXPECT_EQ(5, GetOrderOfRequest(6));
479 EXPECT_EQ(7, GetOrderOfRequest(7)); 707 EXPECT_EQ(7, GetOrderOfRequest(7));
480 } 708 }
481 709
482 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { 710 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
483 CreatePool(kDefaultMaxSocketsPerGroup); 711 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
484 712
485 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 713 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
486 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 714 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
487 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 715 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
488 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); 716 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
489 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); 717 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
490 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); 718 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
491 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 719 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
492 720
493 ReleaseAllConnections(NO_KEEP_ALIVE); 721 ReleaseAllConnections(NO_KEEP_ALIVE);
494 722
495 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) 723 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i)
496 EXPECT_EQ(OK, requests_[i]->WaitForResult()); 724 EXPECT_EQ(OK, requests_[i]->WaitForResult());
497 725
498 EXPECT_EQ(static_cast<int>(requests_.size()), 726 EXPECT_EQ(static_cast<int>(requests_.size()),
499 client_socket_factory_.allocation_count()); 727 client_socket_factory_.allocation_count());
500 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, 728 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup,
501 TestSocketRequest::completion_count); 729 TestSocketRequest::completion_count);
502 } 730 }
503 731
504 // This test will start up a RequestSocket() and then immediately Cancel() it. 732 // This test will start up a RequestSocket() and then immediately Cancel() it.
505 // The pending connect job will be cancelled and should not call back into 733 // The pending connect job will be cancelled and should not call back into
506 // ClientSocketPoolBase. 734 // ClientSocketPoolBase.
507 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { 735 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
508 CreatePool(kDefaultMaxSocketsPerGroup); 736 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
509 737
510 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 738 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
511 TestSocketRequest req(pool_.get(), &request_order_); 739 TestSocketRequest req(pool_.get(), &request_order_);
512 EXPECT_EQ(ERR_IO_PENDING, 740 EXPECT_EQ(ERR_IO_PENDING,
513 req.handle.Init("a", ignored_request_info_, 741 req.handle.Init("a", ignored_request_info_,
514 kDefaultPriority, &req)); 742 kDefaultPriority, &req));
515 req.handle.Reset(); 743 req.handle.Reset();
516 } 744 }
517 745
518 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { 746 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
519 CreatePool(kDefaultMaxSocketsPerGroup); 747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
520 748
521 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 749 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
522 TestSocketRequest req(pool_.get(), &request_order_); 750 TestSocketRequest req(pool_.get(), &request_order_);
523 TestSocketRequest req2(pool_.get(), &request_order_); 751 TestSocketRequest req2(pool_.get(), &request_order_);
524 752
525 EXPECT_EQ(ERR_IO_PENDING, 753 EXPECT_EQ(ERR_IO_PENDING,
526 req.handle.Init("a", ignored_request_info_, 754 req.handle.Init("a", ignored_request_info_,
527 kDefaultPriority, &req)); 755 kDefaultPriority, &req));
528 EXPECT_EQ(ERR_IO_PENDING, 756 EXPECT_EQ(ERR_IO_PENDING,
529 req2.handle.Init("a", ignored_request_info_, 757 req2.handle.Init("a", ignored_request_info_,
530 kDefaultPriority, &req2)); 758 kDefaultPriority, &req2));
531 759
532 req.handle.Reset(); 760 req.handle.Reset();
533 761
534 EXPECT_EQ(OK, req2.WaitForResult()); 762 EXPECT_EQ(OK, req2.WaitForResult());
535 req2.handle.Reset(); 763 req2.handle.Reset();
536 } 764 }
537 765
538 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { 766 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
539 CreatePool(kDefaultMaxSocketsPerGroup); 767 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
540 768
541 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 769 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
542 ClientSocketHandle handle(pool_.get()); 770 ClientSocketHandle handle(pool_.get());
543 TestCompletionCallback callback; 771 TestCompletionCallback callback;
544 TestSocketRequest req(pool_.get(), &request_order_); 772 TestSocketRequest req(pool_.get(), &request_order_);
545 773
546 EXPECT_EQ(ERR_IO_PENDING, 774 EXPECT_EQ(ERR_IO_PENDING,
547 handle.Init("a", ignored_request_info_, 775 handle.Init("a", ignored_request_info_,
548 kDefaultPriority, &callback)); 776 kDefaultPriority, &callback));
549 777
550 handle.Reset(); 778 handle.Reset();
551 779
552 TestCompletionCallback callback2; 780 TestCompletionCallback callback2;
553 EXPECT_EQ(ERR_IO_PENDING, 781 EXPECT_EQ(ERR_IO_PENDING,
554 handle.Init("a", ignored_request_info_, 782 handle.Init("a", ignored_request_info_,
555 kDefaultPriority, &callback2)); 783 kDefaultPriority, &callback2));
556 784
557 EXPECT_EQ(OK, callback2.WaitForResult()); 785 EXPECT_EQ(OK, callback2.WaitForResult());
558 EXPECT_FALSE(callback.have_result()); 786 EXPECT_FALSE(callback.have_result());
559 787
560 handle.Reset(); 788 handle.Reset();
561 } 789 }
562 790
563 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { 791 TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
564 CreatePool(kDefaultMaxSocketsPerGroup); 792 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
565 793
566 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 794 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
567 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 795 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
568 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 796 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
569 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); 797 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
570 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); 798 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
571 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); 799 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
572 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 800 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
573 801
574 // Cancel a request. 802 // Cancel a request.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 861
634 private: 862 private:
635 ClientSocketHandle* const handle_; 863 ClientSocketHandle* const handle_;
636 bool within_callback_; 864 bool within_callback_;
637 TestConnectJobFactory* const test_connect_job_factory_; 865 TestConnectJobFactory* const test_connect_job_factory_;
638 TestConnectJob::JobType next_job_type_; 866 TestConnectJob::JobType next_job_type_;
639 TestCompletionCallback callback_; 867 TestCompletionCallback callback_;
640 }; 868 };
641 869
642 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { 870 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
643 CreatePool(kDefaultMaxSocketsPerGroup); 871 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
644 872
645 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 873 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
646 ClientSocketHandle handle(pool_.get()); 874 ClientSocketHandle handle(pool_.get());
647 RequestSocketCallback callback( 875 RequestSocketCallback callback(
648 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); 876 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob);
649 int rv = handle.Init( 877 int rv = handle.Init(
650 "a", ignored_request_info_, kDefaultPriority, &callback); 878 "a", ignored_request_info_, kDefaultPriority, &callback);
651 ASSERT_EQ(ERR_IO_PENDING, rv); 879 ASSERT_EQ(ERR_IO_PENDING, rv);
652 880
653 EXPECT_EQ(OK, callback.WaitForResult()); 881 EXPECT_EQ(OK, callback.WaitForResult());
654 handle.Reset(); 882 handle.Reset();
655 } 883 }
656 884
657 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { 885 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
658 CreatePool(kDefaultMaxSocketsPerGroup); 886 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
659 887
660 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 888 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
661 ClientSocketHandle handle(pool_.get()); 889 ClientSocketHandle handle(pool_.get());
662 RequestSocketCallback callback( 890 RequestSocketCallback callback(
663 &handle, connect_job_factory_, TestConnectJob::kMockJob); 891 &handle, connect_job_factory_, TestConnectJob::kMockJob);
664 int rv = handle.Init( 892 int rv = handle.Init(
665 "a", ignored_request_info_, kDefaultPriority, &callback); 893 "a", ignored_request_info_, kDefaultPriority, &callback);
666 ASSERT_EQ(ERR_IO_PENDING, rv); 894 ASSERT_EQ(ERR_IO_PENDING, rv);
667 895
668 EXPECT_EQ(OK, callback.WaitForResult()); 896 EXPECT_EQ(OK, callback.WaitForResult());
669 handle.Reset(); 897 handle.Reset();
670 } 898 }
671 899
672 // Make sure that pending requests get serviced after active requests get 900 // Make sure that pending requests get serviced after active requests get
673 // cancelled. 901 // cancelled.
674 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { 902 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
675 CreatePool(kDefaultMaxSocketsPerGroup); 903 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
676 904
677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 905 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
678 906
679 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 907 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
680 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 908 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
681 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 909 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
682 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 910 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
683 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 911 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
684 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 912 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
685 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 913 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
(...skipping 10 matching lines...) Expand all
696 EXPECT_EQ(OK, requests_[i]->WaitForResult()); 924 EXPECT_EQ(OK, requests_[i]->WaitForResult());
697 requests_[i]->handle.Reset(); 925 requests_[i]->handle.Reset();
698 } 926 }
699 927
700 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, 928 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup,
701 TestSocketRequest::completion_count); 929 TestSocketRequest::completion_count);
702 } 930 }
703 931
704 // Make sure that pending requests get serviced after active requests fail. 932 // Make sure that pending requests get serviced after active requests fail.
705 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { 933 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
706 CreatePool(kDefaultMaxSocketsPerGroup); 934 const size_t kMaxSockets = 5;
935 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
707 936
708 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 937 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
709 938
710 scoped_ptr<TestSocketRequest> reqs[kDefaultMaxSocketsPerGroup * 2 + 1]; 939 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
940 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
711 941
712 // Queue up all the requests 942 // Queue up all the requests
713 for (size_t i = 0; i < arraysize(reqs); ++i) { 943 for (size_t i = 0; i < kNumberOfRequests; ++i)
714 reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); 944 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
715 int rv = reqs[i]->handle.Init("a", ignored_request_info_,
716 kDefaultPriority, reqs[i].get());
717 EXPECT_EQ(ERR_IO_PENDING, rv);
718 }
719 945
720 for (size_t i = 0; i < arraysize(reqs); ++i) 946 for (size_t i = 0; i < kNumberOfRequests; ++i)
721 EXPECT_EQ(ERR_CONNECTION_FAILED, reqs[i]->WaitForResult()); 947 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult());
722 } 948 }
723 949
724 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { 950 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
725 CreatePool(kDefaultMaxSocketsPerGroup); 951 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
726 952
727 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 953 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
728 954
729 TestSocketRequest req(pool_.get(), &request_order_); 955 TestSocketRequest req(pool_.get(), &request_order_);
730 int rv = req.handle.Init( 956 int rv = req.handle.Init(
731 "a", ignored_request_info_, kDefaultPriority, &req); 957 "a", ignored_request_info_, kDefaultPriority, &req);
732 EXPECT_EQ(ERR_IO_PENDING, rv); 958 EXPECT_EQ(ERR_IO_PENDING, rv);
733 959
734 // Cancel the active request. 960 // Cancel the active request.
735 req.handle.Reset(); 961 req.handle.Reset();
736 962
737 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req); 963 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req);
738 EXPECT_EQ(ERR_IO_PENDING, rv); 964 EXPECT_EQ(ERR_IO_PENDING, rv);
739 EXPECT_EQ(OK, req.WaitForResult()); 965 EXPECT_EQ(OK, req.WaitForResult());
740 966
741 EXPECT_FALSE(req.handle.is_reused()); 967 EXPECT_FALSE(req.handle.is_reused());
742 EXPECT_EQ(1U, TestSocketRequest::completion_count); 968 EXPECT_EQ(1U, TestSocketRequest::completion_count);
743 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 969 EXPECT_EQ(2, client_socket_factory_.allocation_count());
744 } 970 }
745 971
746 // A pending asynchronous job completes, which will free up a socket slot. The 972 // A pending asynchronous job completes, which will free up a socket slot. The
747 // next job finishes synchronously. The callback for the asynchronous job 973 // next job finishes synchronously. The callback for the asynchronous job
748 // should be first though. 974 // should be first though.
749 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { 975 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
750 CreatePool(kDefaultMaxSocketsPerGroup); 976 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
751 977
752 // First two jobs are async. 978 // First two jobs are async.
753 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 979 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
754 980
755 // Start job 1 (async error). 981 // Start job 1 (async error).
756 TestSocketRequest req1(pool_.get(), &request_order_); 982 TestSocketRequest req1(pool_.get(), &request_order_);
757 int rv = req1.handle.Init("a", ignored_request_info_, 983 int rv = req1.handle.Init("a", ignored_request_info_,
758 kDefaultPriority, &req1); 984 kDefaultPriority, &req1);
759 EXPECT_EQ(ERR_IO_PENDING, rv); 985 EXPECT_EQ(ERR_IO_PENDING, rv);
760 986
(...skipping 20 matching lines...) Expand all
781 // requests queue, so it starts up job 3 for request 3. This job 1007 // requests queue, so it starts up job 3 for request 3. This job
782 // synchronously succeeds, so the request order is 1, 3, 2. 1008 // synchronously succeeds, so the request order is 1, 3, 2.
783 EXPECT_EQ(&req1, request_order_[0]); 1009 EXPECT_EQ(&req1, request_order_[0]);
784 EXPECT_EQ(&req2, request_order_[2]); 1010 EXPECT_EQ(&req2, request_order_[2]);
785 EXPECT_EQ(&req3, request_order_[1]); 1011 EXPECT_EQ(&req3, request_order_[1]);
786 } 1012 }
787 1013
788 // When a ConnectJob is coupled to a request, even if a free socket becomes 1014 // When a ConnectJob is coupled to a request, even if a free socket becomes
789 // available, the request will be serviced by the ConnectJob. 1015 // available, the request will be serviced by the ConnectJob.
790 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { 1016 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
791 CreatePool(kDefaultMaxSocketsPerGroup); 1017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
792 ClientSocketPoolBase::EnableLateBindingOfSockets(false); 1018 ClientSocketPoolBase::EnableLateBindingOfSockets(false);
793 1019
794 // Start job 1 (async OK) 1020 // Start job 1 (async OK)
795 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1021 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
796 1022
797 TestSocketRequest req1(pool_.get(), &request_order_); 1023 TestSocketRequest req1(pool_.get(), &request_order_);
798 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); 1024 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1);
799 EXPECT_EQ(ERR_IO_PENDING, rv); 1025 EXPECT_EQ(ERR_IO_PENDING, rv);
800 EXPECT_EQ(OK, req1.WaitForResult()); 1026 EXPECT_EQ(OK, req1.WaitForResult());
801 1027
(...skipping 25 matching lines...) Expand all
827 1053
828 class ClientSocketPoolBaseTest_LateBinding : public ClientSocketPoolBaseTest { 1054 class ClientSocketPoolBaseTest_LateBinding : public ClientSocketPoolBaseTest {
829 protected: 1055 protected:
830 virtual void SetUp() { 1056 virtual void SetUp() {
831 ClientSocketPoolBaseTest::SetUp(); 1057 ClientSocketPoolBaseTest::SetUp();
832 ClientSocketPoolBase::EnableLateBindingOfSockets(true); 1058 ClientSocketPoolBase::EnableLateBindingOfSockets(true);
833 } 1059 }
834 }; 1060 };
835 1061
836 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicSynchronous) { 1062 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicSynchronous) {
837 CreatePool(kDefaultMaxSocketsPerGroup); 1063 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
838 1064
839 TestCompletionCallback callback; 1065 TestCompletionCallback callback;
840 ClientSocketHandle handle(pool_.get()); 1066 ClientSocketHandle handle(pool_.get());
841 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, 1067 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority,
842 &callback)); 1068 &callback));
843 EXPECT_TRUE(handle.is_initialized()); 1069 EXPECT_TRUE(handle.is_initialized());
844 EXPECT_TRUE(handle.socket()); 1070 EXPECT_TRUE(handle.socket());
845 handle.Reset(); 1071 handle.Reset();
846 } 1072 }
847 1073
848 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicAsynchronous) { 1074 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicAsynchronous) {
849 CreatePool(kDefaultMaxSocketsPerGroup); 1075 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
850 1076
851 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
852 TestSocketRequest req(pool_.get(), &request_order_); 1078 TestSocketRequest req(pool_.get(), &request_order_);
853 int rv = req.handle.Init("a", ignored_request_info_, 0, &req); 1079 int rv = req.handle.Init("a", ignored_request_info_, 0, &req);
854 EXPECT_EQ(ERR_IO_PENDING, rv); 1080 EXPECT_EQ(ERR_IO_PENDING, rv);
855 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); 1081 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle));
856 EXPECT_EQ(OK, req.WaitForResult()); 1082 EXPECT_EQ(OK, req.WaitForResult());
857 EXPECT_TRUE(req.handle.is_initialized()); 1083 EXPECT_TRUE(req.handle.is_initialized());
858 EXPECT_TRUE(req.handle.socket()); 1084 EXPECT_TRUE(req.handle.socket());
859 req.handle.Reset(); 1085 req.handle.Reset();
860 } 1086 }
861 1087
862 TEST_F(ClientSocketPoolBaseTest_LateBinding, InitConnectionFailure) { 1088 TEST_F(ClientSocketPoolBaseTest_LateBinding, InitConnectionFailure) {
863 CreatePool(kDefaultMaxSocketsPerGroup); 1089 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
864 1090
865 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 1091 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
866 TestSocketRequest req(pool_.get(), &request_order_); 1092 TestSocketRequest req(pool_.get(), &request_order_);
867 EXPECT_EQ(ERR_CONNECTION_FAILED, 1093 EXPECT_EQ(ERR_CONNECTION_FAILED,
868 req.handle.Init("a", ignored_request_info_, 1094 req.handle.Init("a", ignored_request_info_,
869 kDefaultPriority, &req)); 1095 kDefaultPriority, &req));
870 } 1096 }
871 1097
872 TEST_F(ClientSocketPoolBaseTest_LateBinding, 1098 TEST_F(ClientSocketPoolBaseTest_LateBinding,
873 InitConnectionAsynchronousFailure) { 1099 InitConnectionAsynchronousFailure) {
874 CreatePool(kDefaultMaxSocketsPerGroup); 1100 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
875 1101
876 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1102 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
877 TestSocketRequest req(pool_.get(), &request_order_); 1103 TestSocketRequest req(pool_.get(), &request_order_);
878 EXPECT_EQ(ERR_IO_PENDING, 1104 EXPECT_EQ(ERR_IO_PENDING,
879 req.handle.Init("a", ignored_request_info_, 5, &req)); 1105 req.handle.Init("a", ignored_request_info_, 5, &req));
880 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); 1106 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle));
881 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 1107 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
882 } 1108 }
883 1109
884 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests) { 1110 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests) {
885 CreatePool(kDefaultMaxSocketsPerGroup); 1111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
886 1112
887 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1113 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
888 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1114 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
889 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 1115 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
890 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); 1116 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
891 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); 1117 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
892 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); 1118 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
893 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 1119 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
894 1120
895 ReleaseAllConnections(KEEP_ALIVE); 1121 ReleaseAllConnections(KEEP_ALIVE);
896 1122
897 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1123 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
898 client_socket_factory_.allocation_count()); 1124 client_socket_factory_.allocation_count());
899 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, 1125 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup,
900 TestSocketRequest::completion_count); 1126 TestSocketRequest::completion_count);
901 1127
902 EXPECT_EQ(1, GetOrderOfRequest(1)); 1128 EXPECT_EQ(1, GetOrderOfRequest(1));
903 EXPECT_EQ(2, GetOrderOfRequest(2)); 1129 EXPECT_EQ(2, GetOrderOfRequest(2));
904 EXPECT_EQ(6, GetOrderOfRequest(3)); 1130 EXPECT_EQ(6, GetOrderOfRequest(3));
905 EXPECT_EQ(4, GetOrderOfRequest(4)); 1131 EXPECT_EQ(4, GetOrderOfRequest(4));
906 EXPECT_EQ(3, GetOrderOfRequest(5)); 1132 EXPECT_EQ(3, GetOrderOfRequest(5));
907 EXPECT_EQ(5, GetOrderOfRequest(6)); 1133 EXPECT_EQ(5, GetOrderOfRequest(6));
908 EXPECT_EQ(7, GetOrderOfRequest(7)); 1134 EXPECT_EQ(7, GetOrderOfRequest(7));
909 } 1135 }
910 1136
911 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests_NoKeepAlive) { 1137 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests_NoKeepAlive) {
912 CreatePool(kDefaultMaxSocketsPerGroup); 1138 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
913 1139
914 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1140 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
915 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1141 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
916 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 1142 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
917 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); 1143 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
918 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); 1144 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
919 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); 1145 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
920 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 1146 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
921 1147
922 ReleaseAllConnections(NO_KEEP_ALIVE); 1148 ReleaseAllConnections(NO_KEEP_ALIVE);
923 1149
924 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) 1150 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i)
925 EXPECT_EQ(OK, requests_[i]->WaitForResult()); 1151 EXPECT_EQ(OK, requests_[i]->WaitForResult());
926 1152
927 EXPECT_EQ(static_cast<int>(requests_.size()), 1153 EXPECT_EQ(static_cast<int>(requests_.size()),
928 client_socket_factory_.allocation_count()); 1154 client_socket_factory_.allocation_count());
929 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, 1155 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup,
930 TestSocketRequest::completion_count); 1156 TestSocketRequest::completion_count);
931 } 1157 }
932 1158
933 // This test will start up a RequestSocket() and then immediately Cancel() it. 1159 // This test will start up a RequestSocket() and then immediately Cancel() it.
934 // The pending connect job will be cancelled and should not call back into 1160 // The pending connect job will be cancelled and should not call back into
935 // ClientSocketPoolBase. 1161 // ClientSocketPoolBase.
936 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequestClearGroup) { 1162 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequestClearGroup) {
937 CreatePool(kDefaultMaxSocketsPerGroup); 1163 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
938 1164
939 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1165 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
940 TestSocketRequest req(pool_.get(), &request_order_); 1166 TestSocketRequest req(pool_.get(), &request_order_);
941 EXPECT_EQ(ERR_IO_PENDING, 1167 EXPECT_EQ(ERR_IO_PENDING,
942 req.handle.Init("a", ignored_request_info_, 1168 req.handle.Init("a", ignored_request_info_,
943 kDefaultPriority, &req)); 1169 kDefaultPriority, &req));
944 req.handle.Reset(); 1170 req.handle.Reset();
945 } 1171 }
946 1172
947 TEST_F(ClientSocketPoolBaseTest_LateBinding, TwoRequestsCancelOne) { 1173 TEST_F(ClientSocketPoolBaseTest_LateBinding, TwoRequestsCancelOne) {
948 CreatePool(kDefaultMaxSocketsPerGroup); 1174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
949 1175
950 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1176 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
951 TestSocketRequest req(pool_.get(), &request_order_); 1177 TestSocketRequest req(pool_.get(), &request_order_);
952 TestSocketRequest req2(pool_.get(), &request_order_); 1178 TestSocketRequest req2(pool_.get(), &request_order_);
953 1179
954 EXPECT_EQ(ERR_IO_PENDING, 1180 EXPECT_EQ(ERR_IO_PENDING,
955 req.handle.Init("a", ignored_request_info_, 1181 req.handle.Init("a", ignored_request_info_,
956 kDefaultPriority, &req)); 1182 kDefaultPriority, &req));
957 EXPECT_EQ(ERR_IO_PENDING, 1183 EXPECT_EQ(ERR_IO_PENDING,
958 req2.handle.Init("a", ignored_request_info_, 1184 req2.handle.Init("a", ignored_request_info_,
959 kDefaultPriority, &req2)); 1185 kDefaultPriority, &req2));
960 1186
961 req.handle.Reset(); 1187 req.handle.Reset();
962 1188
963 EXPECT_EQ(OK, req2.WaitForResult()); 1189 EXPECT_EQ(OK, req2.WaitForResult());
964 req2.handle.Reset(); 1190 req2.handle.Reset();
965 } 1191 }
966 1192
967 TEST_F(ClientSocketPoolBaseTest_LateBinding, ConnectCancelConnect) { 1193 TEST_F(ClientSocketPoolBaseTest_LateBinding, ConnectCancelConnect) {
968 CreatePool(kDefaultMaxSocketsPerGroup); 1194 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
969 1195
970 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1196 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
971 ClientSocketHandle handle(pool_.get()); 1197 ClientSocketHandle handle(pool_.get());
972 TestCompletionCallback callback; 1198 TestCompletionCallback callback;
973 TestSocketRequest req(pool_.get(), &request_order_); 1199 TestSocketRequest req(pool_.get(), &request_order_);
974 1200
975 EXPECT_EQ(ERR_IO_PENDING, 1201 EXPECT_EQ(ERR_IO_PENDING,
976 handle.Init("a", ignored_request_info_, 1202 handle.Init("a", ignored_request_info_,
977 kDefaultPriority, &callback)); 1203 kDefaultPriority, &callback));
978 1204
979 handle.Reset(); 1205 handle.Reset();
980 1206
981 TestCompletionCallback callback2; 1207 TestCompletionCallback callback2;
982 EXPECT_EQ(ERR_IO_PENDING, 1208 EXPECT_EQ(ERR_IO_PENDING,
983 handle.Init("a", ignored_request_info_, 1209 handle.Init("a", ignored_request_info_,
984 kDefaultPriority, &callback2)); 1210 kDefaultPriority, &callback2));
985 1211
986 EXPECT_EQ(OK, callback2.WaitForResult()); 1212 EXPECT_EQ(OK, callback2.WaitForResult());
987 EXPECT_FALSE(callback.have_result()); 1213 EXPECT_FALSE(callback.have_result());
988 1214
989 handle.Reset(); 1215 handle.Reset();
990 } 1216 }
991 1217
992 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequest) { 1218 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequest) {
993 CreatePool(kDefaultMaxSocketsPerGroup); 1219 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
994 1220
995 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1221 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
996 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1222 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
997 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 1223 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
998 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); 1224 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3));
999 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); 1225 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4));
1000 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); 1226 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2));
1001 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); 1227 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1));
1002 1228
1003 // Cancel a request. 1229 // Cancel a request.
(...skipping 11 matching lines...) Expand all
1015 EXPECT_EQ(1, GetOrderOfRequest(1)); 1241 EXPECT_EQ(1, GetOrderOfRequest(1));
1016 EXPECT_EQ(2, GetOrderOfRequest(2)); 1242 EXPECT_EQ(2, GetOrderOfRequest(2));
1017 EXPECT_EQ(5, GetOrderOfRequest(3)); 1243 EXPECT_EQ(5, GetOrderOfRequest(3));
1018 EXPECT_EQ(3, GetOrderOfRequest(4)); 1244 EXPECT_EQ(3, GetOrderOfRequest(4));
1019 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request. 1245 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request.
1020 EXPECT_EQ(4, GetOrderOfRequest(6)); 1246 EXPECT_EQ(4, GetOrderOfRequest(6));
1021 EXPECT_EQ(6, GetOrderOfRequest(7)); 1247 EXPECT_EQ(6, GetOrderOfRequest(7));
1022 } 1248 }
1023 1249
1024 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobTwice) { 1250 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobTwice) {
1025 CreatePool(kDefaultMaxSocketsPerGroup); 1251 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1026 1252
1027 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1253 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1028 ClientSocketHandle handle(pool_.get()); 1254 ClientSocketHandle handle(pool_.get());
1029 RequestSocketCallback callback( 1255 RequestSocketCallback callback(
1030 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); 1256 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob);
1031 int rv = handle.Init( 1257 int rv = handle.Init(
1032 "a", ignored_request_info_, kDefaultPriority, &callback); 1258 "a", ignored_request_info_, kDefaultPriority, &callback);
1033 ASSERT_EQ(ERR_IO_PENDING, rv); 1259 ASSERT_EQ(ERR_IO_PENDING, rv);
1034 1260
1035 EXPECT_EQ(OK, callback.WaitForResult()); 1261 EXPECT_EQ(OK, callback.WaitForResult());
1036 handle.Reset(); 1262 handle.Reset();
1037 } 1263 }
1038 1264
1039 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobThenSynchronous) { 1265 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobThenSynchronous) {
1040 CreatePool(kDefaultMaxSocketsPerGroup); 1266 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1041 1267
1042 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1268 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1043 ClientSocketHandle handle(pool_.get()); 1269 ClientSocketHandle handle(pool_.get());
1044 RequestSocketCallback callback( 1270 RequestSocketCallback callback(
1045 &handle, connect_job_factory_, TestConnectJob::kMockJob); 1271 &handle, connect_job_factory_, TestConnectJob::kMockJob);
1046 int rv = handle.Init( 1272 int rv = handle.Init(
1047 "a", ignored_request_info_, kDefaultPriority, &callback); 1273 "a", ignored_request_info_, kDefaultPriority, &callback);
1048 ASSERT_EQ(ERR_IO_PENDING, rv); 1274 ASSERT_EQ(ERR_IO_PENDING, rv);
1049 1275
1050 EXPECT_EQ(OK, callback.WaitForResult()); 1276 EXPECT_EQ(OK, callback.WaitForResult());
1051 handle.Reset(); 1277 handle.Reset();
1052 } 1278 }
1053 1279
1054 // Make sure that pending requests get serviced after active requests get 1280 // Make sure that pending requests get serviced after active requests get
1055 // cancelled. 1281 // cancelled.
1056 TEST_F(ClientSocketPoolBaseTest_LateBinding, 1282 TEST_F(ClientSocketPoolBaseTest_LateBinding,
1057 CancelActiveRequestWithPendingRequests) { 1283 CancelActiveRequestWithPendingRequests) {
1058 CreatePool(kDefaultMaxSocketsPerGroup); 1284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1059 1285
1060 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1286 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1061 1287
1062 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1288 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1063 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1289 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1064 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1290 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1065 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1291 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1066 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1292 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1067 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1293 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1068 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1294 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
(...skipping 11 matching lines...) Expand all
1080 requests_[i]->handle.Reset(); 1306 requests_[i]->handle.Reset();
1081 } 1307 }
1082 1308
1083 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, 1309 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup,
1084 TestSocketRequest::completion_count); 1310 TestSocketRequest::completion_count);
1085 } 1311 }
1086 1312
1087 // Make sure that pending requests get serviced after active requests fail. 1313 // Make sure that pending requests get serviced after active requests fail.
1088 TEST_F(ClientSocketPoolBaseTest_LateBinding, 1314 TEST_F(ClientSocketPoolBaseTest_LateBinding,
1089 FailingActiveRequestWithPendingRequests) { 1315 FailingActiveRequestWithPendingRequests) {
1090 CreatePool(kDefaultMaxSocketsPerGroup); 1316 const int kMaxSockets = 5;
1317 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
1091 1318
1092 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1319 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1093 1320
1094 scoped_ptr<TestSocketRequest> reqs[kDefaultMaxSocketsPerGroup * 2 + 1]; 1321 const int kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1322 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test hangs.
1095 1323
1096 // Queue up all the requests 1324 // Queue up all the requests
1097 for (size_t i = 0; i < arraysize(reqs); ++i) { 1325 for (int i = 0; i < kNumberOfRequests; ++i)
1098 reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); 1326 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
1099 int rv = reqs[i]->handle.Init("a", ignored_request_info_,
1100 kDefaultPriority, reqs[i].get());
1101 EXPECT_EQ(ERR_IO_PENDING, rv);
1102 }
1103 1327
1104 for (size_t i = 0; i < arraysize(reqs); ++i) 1328 for (int i = 0; i < kNumberOfRequests; ++i)
1105 EXPECT_EQ(ERR_CONNECTION_FAILED, reqs[i]->WaitForResult()); 1329 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult());
1106 } 1330 }
1107 1331
1108 TEST_F(ClientSocketPoolBaseTest_LateBinding, 1332 TEST_F(ClientSocketPoolBaseTest_LateBinding,
1109 CancelActiveRequestThenRequestSocket) { 1333 CancelActiveRequestThenRequestSocket) {
1110 CreatePool(kDefaultMaxSocketsPerGroup); 1334 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1111 1335
1112 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1336 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1113 1337
1114 TestSocketRequest req(pool_.get(), &request_order_); 1338 TestSocketRequest req(pool_.get(), &request_order_);
1115 int rv = req.handle.Init( 1339 int rv = req.handle.Init(
1116 "a", ignored_request_info_, kDefaultPriority, &req); 1340 "a", ignored_request_info_, kDefaultPriority, &req);
1117 EXPECT_EQ(ERR_IO_PENDING, rv); 1341 EXPECT_EQ(ERR_IO_PENDING, rv);
1118 1342
1119 // Cancel the active request. 1343 // Cancel the active request.
1120 req.handle.Reset(); 1344 req.handle.Reset();
1121 1345
1122 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req); 1346 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req);
1123 EXPECT_EQ(ERR_IO_PENDING, rv); 1347 EXPECT_EQ(ERR_IO_PENDING, rv);
1124 EXPECT_EQ(OK, req.WaitForResult()); 1348 EXPECT_EQ(OK, req.WaitForResult());
1125 1349
1126 EXPECT_FALSE(req.handle.is_reused()); 1350 EXPECT_FALSE(req.handle.is_reused());
1127 EXPECT_EQ(1U, TestSocketRequest::completion_count); 1351 EXPECT_EQ(1U, TestSocketRequest::completion_count);
1128 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 1352 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1129 } 1353 }
1130 1354
1131 // When requests and ConnectJobs are not coupled, the request will get serviced 1355 // When requests and ConnectJobs are not coupled, the request will get serviced
1132 // by whatever comes first. 1356 // by whatever comes first.
1133 TEST_F(ClientSocketPoolBaseTest_LateBinding, ReleaseSockets) { 1357 TEST_F(ClientSocketPoolBaseTest_LateBinding, ReleaseSockets) {
1134 CreatePool(kDefaultMaxSocketsPerGroup); 1358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1135 1359
1136 // Start job 1 (async OK) 1360 // Start job 1 (async OK)
1137 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1361 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1138 1362
1139 TestSocketRequest req1(pool_.get(), &request_order_); 1363 TestSocketRequest req1(pool_.get(), &request_order_);
1140 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); 1364 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1);
1141 EXPECT_EQ(ERR_IO_PENDING, rv); 1365 EXPECT_EQ(ERR_IO_PENDING, rv);
1142 EXPECT_EQ(OK, req1.WaitForResult()); 1366 EXPECT_EQ(OK, req1.WaitForResult());
1143 1367
1144 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending 1368 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
(...skipping 23 matching lines...) Expand all
1168 ASSERT_EQ(3U, request_order_.size()); 1392 ASSERT_EQ(3U, request_order_.size());
1169 EXPECT_EQ(&req1, request_order_[0]); 1393 EXPECT_EQ(&req1, request_order_[0]);
1170 EXPECT_EQ(&req2, request_order_[1]); 1394 EXPECT_EQ(&req2, request_order_[1]);
1171 EXPECT_EQ(&req3, request_order_[2]); 1395 EXPECT_EQ(&req3, request_order_[2]);
1172 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1396 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1173 } 1397 }
1174 1398
1175 // The requests are not coupled to the jobs. So, the requests should finish in 1399 // The requests are not coupled to the jobs. So, the requests should finish in
1176 // their priority / insertion order. 1400 // their priority / insertion order.
1177 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingJobCompletionOrder) { 1401 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingJobCompletionOrder) {
1178 CreatePool(kDefaultMaxSocketsPerGroup); 1402 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1179 // First two jobs are async. 1403 // First two jobs are async.
1180 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1404 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1181 1405
1182 TestSocketRequest req1(pool_.get(), &request_order_); 1406 TestSocketRequest req1(pool_.get(), &request_order_);
1183 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); 1407 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1);
1184 EXPECT_EQ(ERR_IO_PENDING, rv); 1408 EXPECT_EQ(ERR_IO_PENDING, rv);
1185 1409
1186 TestSocketRequest req2(pool_.get(), &request_order_); 1410 TestSocketRequest req2(pool_.get(), &request_order_);
1187 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); 1411 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2);
1188 EXPECT_EQ(ERR_IO_PENDING, rv); 1412 EXPECT_EQ(ERR_IO_PENDING, rv);
1189 1413
1190 // The pending job is sync. 1414 // The pending job is sync.
1191 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1415 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1192 1416
1193 TestSocketRequest req3(pool_.get(), &request_order_); 1417 TestSocketRequest req3(pool_.get(), &request_order_);
1194 rv = req3.handle.Init("a", ignored_request_info_, 5, &req3); 1418 rv = req3.handle.Init("a", ignored_request_info_, 5, &req3);
1195 EXPECT_EQ(ERR_IO_PENDING, rv); 1419 EXPECT_EQ(ERR_IO_PENDING, rv);
1196 1420
1197 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); 1421 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult());
1198 EXPECT_EQ(OK, req2.WaitForResult()); 1422 EXPECT_EQ(OK, req2.WaitForResult());
1199 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); 1423 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult());
1200 1424
1201 ASSERT_EQ(3U, request_order_.size()); 1425 ASSERT_EQ(3U, request_order_.size());
1202 EXPECT_EQ(&req1, request_order_[0]); 1426 EXPECT_EQ(&req1, request_order_[0]);
1203 EXPECT_EQ(&req2, request_order_[1]); 1427 EXPECT_EQ(&req2, request_order_[1]);
1204 EXPECT_EQ(&req3, request_order_[2]); 1428 EXPECT_EQ(&req3, request_order_[2]);
1205 } 1429 }
1206 1430
1207 TEST_F(ClientSocketPoolBaseTest_LateBinding, DISABLED_LoadState) { 1431 TEST_F(ClientSocketPoolBaseTest_LateBinding, DISABLED_LoadState) {
1208 CreatePool(kDefaultMaxSocketsPerGroup); 1432 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1209 connect_job_factory_->set_job_type( 1433 connect_job_factory_->set_job_type(
1210 TestConnectJob::kMockAdvancingLoadStateJob); 1434 TestConnectJob::kMockAdvancingLoadStateJob);
1211 1435
1212 TestSocketRequest req1(pool_.get(), &request_order_); 1436 TestSocketRequest req1(pool_.get(), &request_order_);
1213 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); 1437 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1);
1214 EXPECT_EQ(ERR_IO_PENDING, rv); 1438 EXPECT_EQ(ERR_IO_PENDING, rv);
1215 EXPECT_EQ(LOAD_STATE_IDLE, req1.handle.GetLoadState()); 1439 EXPECT_EQ(LOAD_STATE_IDLE, req1.handle.GetLoadState());
1216 1440
1217 MessageLoop::current()->RunAllPending(); 1441 MessageLoop::current()->RunAllPending();
1218 1442
1219 TestSocketRequest req2(pool_.get(), &request_order_); 1443 TestSocketRequest req2(pool_.get(), &request_order_);
1220 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); 1444 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2);
1221 EXPECT_EQ(ERR_IO_PENDING, rv); 1445 EXPECT_EQ(ERR_IO_PENDING, rv);
1222 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req1.handle.GetLoadState()); 1446 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req1.handle.GetLoadState());
1223 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req2.handle.GetLoadState()); 1447 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req2.handle.GetLoadState());
1224 } 1448 }
1225 1449
1226 } // namespace 1450 } // namespace
1227 1451
1228 } // namespace net 1452 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | net/socket/tcp_client_socket_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698