OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/callback.h" | 7 #include "base/callback.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/platform_thread.h" | 10 #include "base/platform_thread.h" |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 "a", | 613 "a", |
614 request, | 614 request, |
615 base::TimeDelta::FromMicroseconds(1), | 615 base::TimeDelta::FromMicroseconds(1), |
616 &delegate, | 616 &delegate, |
617 &client_socket_factory_, | 617 &client_socket_factory_, |
618 &log); | 618 &log); |
619 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); | 619 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); |
620 PlatformThread::Sleep(1); | 620 PlatformThread::Sleep(1); |
621 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); | 621 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); |
622 | 622 |
623 EXPECT_EQ(6u, log.entries().size()); | 623 net::CapturingNetLog::EntryList entries; |
| 624 log.GetEntries(&entries); |
| 625 |
| 626 EXPECT_EQ(6u, entries.size()); |
624 EXPECT_TRUE(LogContainsBeginEvent( | 627 EXPECT_TRUE(LogContainsBeginEvent( |
625 log.entries(), 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); | 628 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); |
626 EXPECT_TRUE(LogContainsBeginEvent( | 629 EXPECT_TRUE(LogContainsBeginEvent( |
627 log.entries(), 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); | 630 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); |
628 EXPECT_TRUE(LogContainsEvent( | 631 EXPECT_TRUE(LogContainsEvent( |
629 log.entries(), 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, | 632 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, |
630 NetLog::PHASE_NONE)); | 633 NetLog::PHASE_NONE)); |
631 EXPECT_TRUE(LogContainsEvent( | 634 EXPECT_TRUE(LogContainsEvent( |
632 log.entries(), 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, | 635 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, |
633 NetLog::PHASE_NONE)); | 636 NetLog::PHASE_NONE)); |
634 EXPECT_TRUE(LogContainsEndEvent( | 637 EXPECT_TRUE(LogContainsEndEvent( |
635 log.entries(), 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); | 638 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); |
636 EXPECT_TRUE(LogContainsEndEvent( | 639 EXPECT_TRUE(LogContainsEndEvent( |
637 log.entries(), 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); | 640 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); |
638 } | 641 } |
639 | 642 |
640 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { | 643 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { |
641 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 644 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
642 | 645 |
643 TestCompletionCallback callback; | 646 TestCompletionCallback callback; |
644 ClientSocketHandle handle; | 647 ClientSocketHandle handle; |
645 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 648 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
646 | 649 |
647 EXPECT_EQ(OK, | 650 EXPECT_EQ(OK, |
648 handle.Init("a", | 651 handle.Init("a", |
649 params_, | 652 params_, |
650 kDefaultPriority, | 653 kDefaultPriority, |
651 &callback, | 654 &callback, |
652 pool_.get(), | 655 pool_.get(), |
653 log.bound())); | 656 log.bound())); |
654 EXPECT_TRUE(handle.is_initialized()); | 657 EXPECT_TRUE(handle.is_initialized()); |
655 EXPECT_TRUE(handle.socket()); | 658 EXPECT_TRUE(handle.socket()); |
656 handle.Reset(); | 659 handle.Reset(); |
657 | 660 |
658 EXPECT_EQ(4u, log.entries().size()); | 661 net::CapturingNetLog::EntryList entries; |
| 662 log.GetEntries(&entries); |
| 663 |
| 664 EXPECT_EQ(4u, entries.size()); |
659 EXPECT_TRUE(LogContainsBeginEvent( | 665 EXPECT_TRUE(LogContainsBeginEvent( |
660 log.entries(), 0, NetLog::TYPE_SOCKET_POOL)); | 666 entries, 0, NetLog::TYPE_SOCKET_POOL)); |
661 EXPECT_TRUE(LogContainsEvent( | 667 EXPECT_TRUE(LogContainsEvent( |
662 log.entries(), 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 668 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
663 NetLog::PHASE_NONE)); | 669 NetLog::PHASE_NONE)); |
664 EXPECT_TRUE(LogContainsEvent( | 670 EXPECT_TRUE(LogContainsEvent( |
665 log.entries(), 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 671 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
666 NetLog::PHASE_NONE)); | 672 NetLog::PHASE_NONE)); |
667 EXPECT_TRUE(LogContainsEndEvent( | 673 EXPECT_TRUE(LogContainsEndEvent( |
668 log.entries(), 3, NetLog::TYPE_SOCKET_POOL)); | 674 entries, 3, NetLog::TYPE_SOCKET_POOL)); |
669 } | 675 } |
670 | 676 |
671 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { | 677 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { |
672 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 678 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
673 | 679 |
674 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 680 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
675 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 681 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
676 | 682 |
677 ClientSocketHandle handle; | 683 ClientSocketHandle handle; |
678 TestCompletionCallback callback; | 684 TestCompletionCallback callback; |
679 // Set the additional error state members to ensure that they get cleared. | 685 // Set the additional error state members to ensure that they get cleared. |
680 handle.set_is_ssl_error(true); | 686 handle.set_is_ssl_error(true); |
681 HttpResponseInfo info; | 687 HttpResponseInfo info; |
682 info.headers = new HttpResponseHeaders(""); | 688 info.headers = new HttpResponseHeaders(""); |
683 handle.set_ssl_error_response_info(info); | 689 handle.set_ssl_error_response_info(info); |
684 EXPECT_EQ(ERR_CONNECTION_FAILED, | 690 EXPECT_EQ(ERR_CONNECTION_FAILED, |
685 handle.Init("a", | 691 handle.Init("a", |
686 params_, | 692 params_, |
687 kDefaultPriority, | 693 kDefaultPriority, |
688 &callback, | 694 &callback, |
689 pool_.get(), | 695 pool_.get(), |
690 log.bound())); | 696 log.bound())); |
691 EXPECT_FALSE(handle.socket()); | 697 EXPECT_FALSE(handle.socket()); |
692 EXPECT_FALSE(handle.is_ssl_error()); | 698 EXPECT_FALSE(handle.is_ssl_error()); |
693 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 699 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
694 | 700 |
695 EXPECT_EQ(3u, log.entries().size()); | 701 net::CapturingNetLog::EntryList entries; |
| 702 log.GetEntries(&entries); |
| 703 |
| 704 EXPECT_EQ(3u, entries.size()); |
696 EXPECT_TRUE(LogContainsBeginEvent( | 705 EXPECT_TRUE(LogContainsBeginEvent( |
697 log.entries(), 0, NetLog::TYPE_SOCKET_POOL)); | 706 entries, 0, NetLog::TYPE_SOCKET_POOL)); |
698 EXPECT_TRUE(LogContainsEvent( | 707 EXPECT_TRUE(LogContainsEvent( |
699 log.entries(), 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 708 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
700 NetLog::PHASE_NONE)); | 709 NetLog::PHASE_NONE)); |
701 EXPECT_TRUE(LogContainsEndEvent( | 710 EXPECT_TRUE(LogContainsEndEvent( |
702 log.entries(), 2, NetLog::TYPE_SOCKET_POOL)); | 711 entries, 2, NetLog::TYPE_SOCKET_POOL)); |
703 } | 712 } |
704 | 713 |
705 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { | 714 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { |
706 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 715 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
707 | 716 |
708 // TODO(eroman): Check that the NetLog contains this event. | 717 // TODO(eroman): Check that the NetLog contains this event. |
709 | 718 |
710 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 719 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
711 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); | 720 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
712 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); | 721 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1496 &callback, | 1505 &callback, |
1497 pool_.get(), | 1506 pool_.get(), |
1498 log.bound()); | 1507 log.bound()); |
1499 EXPECT_EQ(ERR_IO_PENDING, rv); | 1508 EXPECT_EQ(ERR_IO_PENDING, rv); |
1500 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1509 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
1501 EXPECT_EQ(OK, callback.WaitForResult()); | 1510 EXPECT_EQ(OK, callback.WaitForResult()); |
1502 EXPECT_TRUE(handle.is_initialized()); | 1511 EXPECT_TRUE(handle.is_initialized()); |
1503 EXPECT_TRUE(handle.socket()); | 1512 EXPECT_TRUE(handle.socket()); |
1504 handle.Reset(); | 1513 handle.Reset(); |
1505 | 1514 |
1506 EXPECT_EQ(4u, log.entries().size()); | 1515 net::CapturingNetLog::EntryList entries; |
| 1516 log.GetEntries(&entries); |
| 1517 |
| 1518 EXPECT_EQ(4u, entries.size()); |
1507 EXPECT_TRUE(LogContainsBeginEvent( | 1519 EXPECT_TRUE(LogContainsBeginEvent( |
1508 log.entries(), 0, NetLog::TYPE_SOCKET_POOL)); | 1520 entries, 0, NetLog::TYPE_SOCKET_POOL)); |
1509 EXPECT_TRUE(LogContainsEvent( | 1521 EXPECT_TRUE(LogContainsEvent( |
1510 log.entries(), 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 1522 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
1511 NetLog::PHASE_NONE)); | 1523 NetLog::PHASE_NONE)); |
1512 EXPECT_TRUE(LogContainsEvent( | 1524 EXPECT_TRUE(LogContainsEvent( |
1513 log.entries(), 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, | 1525 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
1514 NetLog::PHASE_NONE)); | 1526 NetLog::PHASE_NONE)); |
1515 EXPECT_TRUE(LogContainsEndEvent( | 1527 EXPECT_TRUE(LogContainsEndEvent( |
1516 log.entries(), 3, NetLog::TYPE_SOCKET_POOL)); | 1528 entries, 3, NetLog::TYPE_SOCKET_POOL)); |
1517 } | 1529 } |
1518 | 1530 |
1519 TEST_F(ClientSocketPoolBaseTest, | 1531 TEST_F(ClientSocketPoolBaseTest, |
1520 InitConnectionAsynchronousFailure) { | 1532 InitConnectionAsynchronousFailure) { |
1521 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1533 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1522 | 1534 |
1523 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1535 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
1524 ClientSocketHandle handle; | 1536 ClientSocketHandle handle; |
1525 TestCompletionCallback callback; | 1537 TestCompletionCallback callback; |
1526 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 1538 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
1527 // Set the additional error state members to ensure that they get cleared. | 1539 // Set the additional error state members to ensure that they get cleared. |
1528 handle.set_is_ssl_error(true); | 1540 handle.set_is_ssl_error(true); |
1529 HttpResponseInfo info; | 1541 HttpResponseInfo info; |
1530 info.headers = new HttpResponseHeaders(""); | 1542 info.headers = new HttpResponseHeaders(""); |
1531 handle.set_ssl_error_response_info(info); | 1543 handle.set_ssl_error_response_info(info); |
1532 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1544 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", |
1533 params_, | 1545 params_, |
1534 kDefaultPriority, | 1546 kDefaultPriority, |
1535 &callback, | 1547 &callback, |
1536 pool_.get(), | 1548 pool_.get(), |
1537 log.bound())); | 1549 log.bound())); |
1538 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1550 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
1539 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 1551 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
1540 EXPECT_FALSE(handle.is_ssl_error()); | 1552 EXPECT_FALSE(handle.is_ssl_error()); |
1541 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 1553 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
1542 | 1554 |
1543 EXPECT_EQ(3u, log.entries().size()); | 1555 net::CapturingNetLog::EntryList entries; |
| 1556 log.GetEntries(&entries); |
| 1557 |
| 1558 EXPECT_EQ(3u, entries.size()); |
1544 EXPECT_TRUE(LogContainsBeginEvent( | 1559 EXPECT_TRUE(LogContainsBeginEvent( |
1545 log.entries(), 0, NetLog::TYPE_SOCKET_POOL)); | 1560 entries, 0, NetLog::TYPE_SOCKET_POOL)); |
1546 EXPECT_TRUE(LogContainsEvent( | 1561 EXPECT_TRUE(LogContainsEvent( |
1547 log.entries(), 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 1562 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
1548 NetLog::PHASE_NONE)); | 1563 NetLog::PHASE_NONE)); |
1549 EXPECT_TRUE(LogContainsEndEvent( | 1564 EXPECT_TRUE(LogContainsEndEvent( |
1550 log.entries(), 2, NetLog::TYPE_SOCKET_POOL)); | 1565 entries, 2, NetLog::TYPE_SOCKET_POOL)); |
1551 } | 1566 } |
1552 | 1567 |
1553 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { | 1568 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { |
1554 // TODO(eroman): Add back the log expectations! Removed them because the | 1569 // TODO(eroman): Add back the log expectations! Removed them because the |
1555 // ordering is difficult, and some may fire during destructor. | 1570 // ordering is difficult, and some may fire during destructor. |
1556 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1571 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
1557 | 1572 |
1558 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1573 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
1559 ClientSocketHandle handle; | 1574 ClientSocketHandle handle; |
1560 TestCompletionCallback callback; | 1575 TestCompletionCallback callback; |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1885 pool_->CleanupTimedOutIdleSockets(); | 1900 pool_->CleanupTimedOutIdleSockets(); |
1886 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 1901 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
1887 rv = handle.Init("a", | 1902 rv = handle.Init("a", |
1888 params_, | 1903 params_, |
1889 LOWEST, | 1904 LOWEST, |
1890 &callback, | 1905 &callback, |
1891 pool_.get(), | 1906 pool_.get(), |
1892 log.bound()); | 1907 log.bound()); |
1893 EXPECT_EQ(OK, rv); | 1908 EXPECT_EQ(OK, rv); |
1894 EXPECT_TRUE(handle.is_reused()); | 1909 EXPECT_TRUE(handle.is_reused()); |
| 1910 |
| 1911 net::CapturingNetLog::EntryList entries; |
| 1912 log.GetEntries(&entries); |
1895 EXPECT_TRUE(LogContainsEntryWithType( | 1913 EXPECT_TRUE(LogContainsEntryWithType( |
1896 log.entries(), 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); | 1914 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); |
1897 } | 1915 } |
1898 | 1916 |
1899 // Make sure that we process all pending requests even when we're stalling | 1917 // Make sure that we process all pending requests even when we're stalling |
1900 // because of multiple releasing disconnected sockets. | 1918 // because of multiple releasing disconnected sockets. |
1901 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { | 1919 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { |
1902 CreatePoolWithIdleTimeouts( | 1920 CreatePoolWithIdleTimeouts( |
1903 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 1921 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, |
1904 base::TimeDelta(), // Time out unused sockets immediately. | 1922 base::TimeDelta(), // Time out unused sockets immediately. |
1905 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 1923 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
1906 | 1924 |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2993 ASSERT_EQ(OK, callback1.WaitForResult()); | 3011 ASSERT_EQ(OK, callback1.WaitForResult()); |
2994 | 3012 |
2995 handle1.Reset(); | 3013 handle1.Reset(); |
2996 | 3014 |
2997 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3015 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
2998 } | 3016 } |
2999 | 3017 |
3000 } // namespace | 3018 } // namespace |
3001 | 3019 |
3002 } // namespace net | 3020 } // namespace net |
OLD | NEW |