| OLD | NEW |
| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 #include "net/log/net_log.h" | 34 #include "net/log/net_log.h" |
| 35 #include "net/log/test_net_log.h" | 35 #include "net/log/test_net_log.h" |
| 36 #include "net/log/test_net_log_entry.h" | 36 #include "net/log/test_net_log_entry.h" |
| 37 #include "net/log/test_net_log_util.h" | 37 #include "net/log/test_net_log_util.h" |
| 38 #include "net/socket/client_socket_factory.h" | 38 #include "net/socket/client_socket_factory.h" |
| 39 #include "net/socket/client_socket_handle.h" | 39 #include "net/socket/client_socket_handle.h" |
| 40 #include "net/socket/socket_performance_watcher.h" | 40 #include "net/socket/socket_performance_watcher.h" |
| 41 #include "net/socket/socket_test_util.h" | 41 #include "net/socket/socket_test_util.h" |
| 42 #include "net/socket/ssl_client_socket.h" | 42 #include "net/socket/ssl_client_socket.h" |
| 43 #include "net/socket/stream_socket.h" | 43 #include "net/socket/stream_socket.h" |
| 44 #include "net/test/gtest_util.h" |
| 44 #include "net/udp/datagram_client_socket.h" | 45 #include "net/udp/datagram_client_socket.h" |
| 45 #include "testing/gmock/include/gmock/gmock.h" | 46 #include "testing/gmock/include/gmock/gmock.h" |
| 46 #include "testing/gtest/include/gtest/gtest.h" | 47 #include "testing/gtest/include/gtest/gtest.h" |
| 47 | 48 |
| 49 using net::test::IsError; |
| 50 using net::test::IsOk; |
| 51 |
| 48 using ::testing::Invoke; | 52 using ::testing::Invoke; |
| 49 using ::testing::Return; | 53 using ::testing::Return; |
| 50 | 54 |
| 51 namespace net { | 55 namespace net { |
| 52 | 56 |
| 53 namespace { | 57 namespace { |
| 54 | 58 |
| 55 const int kDefaultMaxSockets = 4; | 59 const int kDefaultMaxSockets = 4; |
| 56 const int kDefaultMaxSocketsPerGroup = 2; | 60 const int kDefaultMaxSocketsPerGroup = 2; |
| 57 | 61 |
| (...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 TestConnectJobDelegate delegate; | 744 TestConnectJobDelegate delegate; |
| 741 ClientSocketHandle ignored; | 745 ClientSocketHandle ignored; |
| 742 TestClientSocketPoolBase::Request request( | 746 TestClientSocketPoolBase::Request request( |
| 743 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 747 &ignored, CompletionCallback(), DEFAULT_PRIORITY, |
| 744 ClientSocketPool::RespectLimits::ENABLED, | 748 ClientSocketPool::RespectLimits::ENABLED, |
| 745 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); | 749 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); |
| 746 std::unique_ptr<TestConnectJob> job( | 750 std::unique_ptr<TestConnectJob> job( |
| 747 new TestConnectJob(TestConnectJob::kMockJob, "a", request, | 751 new TestConnectJob(TestConnectJob::kMockJob, "a", request, |
| 748 base::TimeDelta::FromMicroseconds(1), &delegate, | 752 base::TimeDelta::FromMicroseconds(1), &delegate, |
| 749 &client_socket_factory_, NULL)); | 753 &client_socket_factory_, NULL)); |
| 750 EXPECT_EQ(OK, job->Connect()); | 754 EXPECT_THAT(job->Connect(), IsOk()); |
| 751 } | 755 } |
| 752 | 756 |
| 753 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { | 757 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { |
| 754 TestConnectJobDelegate delegate; | 758 TestConnectJobDelegate delegate; |
| 755 ClientSocketHandle ignored; | 759 ClientSocketHandle ignored; |
| 756 TestNetLog log; | 760 TestNetLog log; |
| 757 | 761 |
| 758 TestClientSocketPoolBase::Request request( | 762 TestClientSocketPoolBase::Request request( |
| 759 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 763 &ignored, CompletionCallback(), DEFAULT_PRIORITY, |
| 760 ClientSocketPool::RespectLimits::ENABLED, | 764 ClientSocketPool::RespectLimits::ENABLED, |
| 761 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); | 765 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); |
| 762 // Deleted by TestConnectJobDelegate. | 766 // Deleted by TestConnectJobDelegate. |
| 763 TestConnectJob* job = | 767 TestConnectJob* job = |
| 764 new TestConnectJob(TestConnectJob::kMockPendingJob, | 768 new TestConnectJob(TestConnectJob::kMockPendingJob, |
| 765 "a", | 769 "a", |
| 766 request, | 770 request, |
| 767 base::TimeDelta::FromMicroseconds(1), | 771 base::TimeDelta::FromMicroseconds(1), |
| 768 &delegate, | 772 &delegate, |
| 769 &client_socket_factory_, | 773 &client_socket_factory_, |
| 770 &log); | 774 &log); |
| 771 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); | 775 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING)); |
| 772 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); | 776 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); |
| 773 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); | 777 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT)); |
| 774 | 778 |
| 775 TestNetLogEntry::List entries; | 779 TestNetLogEntry::List entries; |
| 776 log.GetEntries(&entries); | 780 log.GetEntries(&entries); |
| 777 | 781 |
| 778 EXPECT_EQ(6u, entries.size()); | 782 EXPECT_EQ(6u, entries.size()); |
| 779 EXPECT_TRUE(LogContainsBeginEvent( | 783 EXPECT_TRUE(LogContainsBeginEvent( |
| 780 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); | 784 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); |
| 781 EXPECT_TRUE(LogContainsBeginEvent( | 785 EXPECT_TRUE(LogContainsBeginEvent( |
| 782 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); | 786 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); |
| 783 EXPECT_TRUE(LogContainsEvent( | 787 EXPECT_TRUE(LogContainsEvent( |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 NetLog::PHASE_NONE)); | 863 NetLog::PHASE_NONE)); |
| 860 EXPECT_TRUE(LogContainsEndEvent( | 864 EXPECT_TRUE(LogContainsEndEvent( |
| 861 entries, 2, NetLog::TYPE_SOCKET_POOL)); | 865 entries, 2, NetLog::TYPE_SOCKET_POOL)); |
| 862 } | 866 } |
| 863 | 867 |
| 864 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { | 868 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { |
| 865 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 866 | 870 |
| 867 // TODO(eroman): Check that the NetLog contains this event. | 871 // TODO(eroman): Check that the NetLog contains this event. |
| 868 | 872 |
| 869 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 873 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 870 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 874 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 871 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); | 875 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk()); |
| 872 EXPECT_EQ(OK, StartRequest("d", DEFAULT_PRIORITY)); | 876 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk()); |
| 873 | 877 |
| 874 EXPECT_EQ(static_cast<int>(requests_size()), | 878 EXPECT_EQ(static_cast<int>(requests_size()), |
| 875 client_socket_factory_.allocation_count()); | 879 client_socket_factory_.allocation_count()); |
| 876 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); | 880 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); |
| 877 | 881 |
| 878 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY)); | 882 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 879 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", DEFAULT_PRIORITY)); | 883 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 880 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", DEFAULT_PRIORITY)); | 884 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 881 | 885 |
| 882 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 886 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
| 883 | 887 |
| 884 EXPECT_EQ(static_cast<int>(requests_size()), | 888 EXPECT_EQ(static_cast<int>(requests_size()), |
| 885 client_socket_factory_.allocation_count()); | 889 client_socket_factory_.allocation_count()); |
| 886 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); | 890 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); |
| 887 | 891 |
| 888 EXPECT_EQ(1, GetOrderOfRequest(1)); | 892 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 889 EXPECT_EQ(2, GetOrderOfRequest(2)); | 893 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 890 EXPECT_EQ(3, GetOrderOfRequest(3)); | 894 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 891 EXPECT_EQ(4, GetOrderOfRequest(4)); | 895 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 892 EXPECT_EQ(5, GetOrderOfRequest(5)); | 896 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 893 EXPECT_EQ(6, GetOrderOfRequest(6)); | 897 EXPECT_EQ(6, GetOrderOfRequest(6)); |
| 894 EXPECT_EQ(7, GetOrderOfRequest(7)); | 898 EXPECT_EQ(7, GetOrderOfRequest(7)); |
| 895 | 899 |
| 896 // Make sure we test order of all requests made. | 900 // Make sure we test order of all requests made. |
| 897 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); | 901 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); |
| 898 } | 902 } |
| 899 | 903 |
| 900 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { | 904 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { |
| 901 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 902 | 906 |
| 903 // TODO(eroman): Check that the NetLog contains this event. | 907 // TODO(eroman): Check that the NetLog contains this event. |
| 904 | 908 |
| 905 // Reach all limits: max total sockets, and max sockets per group. | 909 // Reach all limits: max total sockets, and max sockets per group. |
| 906 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 910 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 907 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 911 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 908 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 912 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 909 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 913 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 910 | 914 |
| 911 EXPECT_EQ(static_cast<int>(requests_size()), | 915 EXPECT_EQ(static_cast<int>(requests_size()), |
| 912 client_socket_factory_.allocation_count()); | 916 client_socket_factory_.allocation_count()); |
| 913 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); | 917 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); |
| 914 | 918 |
| 915 // Now create a new group and verify that we don't starve it. | 919 // Now create a new group and verify that we don't starve it. |
| 916 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY)); | 920 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 917 | 921 |
| 918 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 922 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
| 919 | 923 |
| 920 EXPECT_EQ(static_cast<int>(requests_size()), | 924 EXPECT_EQ(static_cast<int>(requests_size()), |
| 921 client_socket_factory_.allocation_count()); | 925 client_socket_factory_.allocation_count()); |
| 922 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); | 926 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); |
| 923 | 927 |
| 924 EXPECT_EQ(1, GetOrderOfRequest(1)); | 928 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 925 EXPECT_EQ(2, GetOrderOfRequest(2)); | 929 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 926 EXPECT_EQ(3, GetOrderOfRequest(3)); | 930 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 927 EXPECT_EQ(4, GetOrderOfRequest(4)); | 931 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 928 EXPECT_EQ(5, GetOrderOfRequest(5)); | 932 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 929 | 933 |
| 930 // Make sure we test order of all requests made. | 934 // Make sure we test order of all requests made. |
| 931 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); | 935 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); |
| 932 } | 936 } |
| 933 | 937 |
| 934 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) { | 938 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) { |
| 935 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 939 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 936 | 940 |
| 937 EXPECT_EQ(OK, StartRequest("b", LOWEST)); | 941 EXPECT_THAT(StartRequest("b", LOWEST), IsOk()); |
| 938 EXPECT_EQ(OK, StartRequest("a", MEDIUM)); | 942 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk()); |
| 939 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); | 943 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk()); |
| 940 EXPECT_EQ(OK, StartRequest("a", LOWEST)); | 944 EXPECT_THAT(StartRequest("a", LOWEST), IsOk()); |
| 941 | 945 |
| 942 EXPECT_EQ(static_cast<int>(requests_size()), | 946 EXPECT_EQ(static_cast<int>(requests_size()), |
| 943 client_socket_factory_.allocation_count()); | 947 client_socket_factory_.allocation_count()); |
| 944 | 948 |
| 945 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", LOWEST)); | 949 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING)); |
| 946 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); | 950 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING)); |
| 947 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); | 951 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING)); |
| 948 | 952 |
| 949 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 953 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
| 950 | 954 |
| 951 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); | 955 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); |
| 952 | 956 |
| 953 // First 4 requests don't have to wait, and finish in order. | 957 // First 4 requests don't have to wait, and finish in order. |
| 954 EXPECT_EQ(1, GetOrderOfRequest(1)); | 958 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 955 EXPECT_EQ(2, GetOrderOfRequest(2)); | 959 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 956 EXPECT_EQ(3, GetOrderOfRequest(3)); | 960 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 957 EXPECT_EQ(4, GetOrderOfRequest(4)); | 961 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 958 | 962 |
| 959 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM), | 963 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM), |
| 960 // and then ("c", LOWEST). | 964 // and then ("c", LOWEST). |
| 961 EXPECT_EQ(7, GetOrderOfRequest(5)); | 965 EXPECT_EQ(7, GetOrderOfRequest(5)); |
| 962 EXPECT_EQ(6, GetOrderOfRequest(6)); | 966 EXPECT_EQ(6, GetOrderOfRequest(6)); |
| 963 EXPECT_EQ(5, GetOrderOfRequest(7)); | 967 EXPECT_EQ(5, GetOrderOfRequest(7)); |
| 964 | 968 |
| 965 // Make sure we test order of all requests made. | 969 // Make sure we test order of all requests made. |
| 966 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); | 970 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); |
| 967 } | 971 } |
| 968 | 972 |
| 969 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) { | 973 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) { |
| 970 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 974 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 971 | 975 |
| 972 EXPECT_EQ(OK, StartRequest("a", LOWEST)); | 976 EXPECT_THAT(StartRequest("a", LOWEST), IsOk()); |
| 973 EXPECT_EQ(OK, StartRequest("a", LOW)); | 977 EXPECT_THAT(StartRequest("a", LOW), IsOk()); |
| 974 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); | 978 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk()); |
| 975 EXPECT_EQ(OK, StartRequest("b", MEDIUM)); | 979 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk()); |
| 976 | 980 |
| 977 EXPECT_EQ(static_cast<int>(requests_size()), | 981 EXPECT_EQ(static_cast<int>(requests_size()), |
| 978 client_socket_factory_.allocation_count()); | 982 client_socket_factory_.allocation_count()); |
| 979 | 983 |
| 980 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", MEDIUM)); | 984 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING)); |
| 981 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 985 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING)); |
| 982 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); | 986 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING)); |
| 983 | 987 |
| 984 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 988 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
| 985 | 989 |
| 986 EXPECT_EQ(static_cast<int>(requests_size()), | 990 EXPECT_EQ(static_cast<int>(requests_size()), |
| 987 client_socket_factory_.allocation_count()); | 991 client_socket_factory_.allocation_count()); |
| 988 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); | 992 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); |
| 989 | 993 |
| 990 // First 4 requests don't have to wait, and finish in order. | 994 // First 4 requests don't have to wait, and finish in order. |
| 991 EXPECT_EQ(1, GetOrderOfRequest(1)); | 995 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 992 EXPECT_EQ(2, GetOrderOfRequest(2)); | 996 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 993 EXPECT_EQ(3, GetOrderOfRequest(3)); | 997 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 994 EXPECT_EQ(4, GetOrderOfRequest(4)); | 998 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 995 | 999 |
| 996 // Request ("b", 7) has the highest priority, but we can't make new socket for | 1000 // Request ("b", 7) has the highest priority, but we can't make new socket for |
| 997 // group "b", because it has reached the per-group limit. Then we make | 1001 // group "b", because it has reached the per-group limit. Then we make |
| 998 // socket for ("c", 6), because it has higher priority than ("a", 4), | 1002 // socket for ("c", 6), because it has higher priority than ("a", 4), |
| 999 // and we still can't make a socket for group "b". | 1003 // and we still can't make a socket for group "b". |
| 1000 EXPECT_EQ(5, GetOrderOfRequest(5)); | 1004 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 1001 EXPECT_EQ(6, GetOrderOfRequest(6)); | 1005 EXPECT_EQ(6, GetOrderOfRequest(6)); |
| 1002 EXPECT_EQ(7, GetOrderOfRequest(7)); | 1006 EXPECT_EQ(7, GetOrderOfRequest(7)); |
| 1003 | 1007 |
| 1004 // Make sure we test order of all requests made. | 1008 // Make sure we test order of all requests made. |
| 1005 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); | 1009 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); |
| 1006 } | 1010 } |
| 1007 | 1011 |
| 1008 // Make sure that we count connecting sockets against the total limit. | 1012 // Make sure that we count connecting sockets against the total limit. |
| 1009 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { | 1013 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { |
| 1010 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1014 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1011 | 1015 |
| 1012 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1016 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1013 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 1017 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 1014 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); | 1018 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk()); |
| 1015 | 1019 |
| 1016 // Create one asynchronous request. | 1020 // Create one asynchronous request. |
| 1017 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1021 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1018 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", DEFAULT_PRIORITY)); | 1022 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1019 | 1023 |
| 1020 // We post all of our delayed tasks with a 2ms delay. I.e. they don't | 1024 // We post all of our delayed tasks with a 2ms delay. I.e. they don't |
| 1021 // actually become pending until 2ms after they have been created. In order | 1025 // actually become pending until 2ms after they have been created. In order |
| 1022 // to flush all tasks, we need to wait so that we know there are no | 1026 // to flush all tasks, we need to wait so that we know there are no |
| 1023 // soon-to-be-pending tasks waiting. | 1027 // soon-to-be-pending tasks waiting. |
| 1024 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 1028 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 1025 base::RunLoop().RunUntilIdle(); | 1029 base::RunLoop().RunUntilIdle(); |
| 1026 | 1030 |
| 1027 // The next synchronous request should wait for its turn. | 1031 // The next synchronous request should wait for its turn. |
| 1028 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1032 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1029 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY)); | 1033 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1030 | 1034 |
| 1031 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 1035 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
| 1032 | 1036 |
| 1033 EXPECT_EQ(static_cast<int>(requests_size()), | 1037 EXPECT_EQ(static_cast<int>(requests_size()), |
| 1034 client_socket_factory_.allocation_count()); | 1038 client_socket_factory_.allocation_count()); |
| 1035 | 1039 |
| 1036 EXPECT_EQ(1, GetOrderOfRequest(1)); | 1040 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 1037 EXPECT_EQ(2, GetOrderOfRequest(2)); | 1041 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 1038 EXPECT_EQ(3, GetOrderOfRequest(3)); | 1042 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 1039 EXPECT_EQ(4, GetOrderOfRequest(4)); | 1043 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 1040 EXPECT_EQ(5, GetOrderOfRequest(5)); | 1044 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 1041 | 1045 |
| 1042 // Make sure we test order of all requests made. | 1046 // Make sure we test order of all requests made. |
| 1043 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); | 1047 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); |
| 1044 } | 1048 } |
| 1045 | 1049 |
| 1046 TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) { | 1050 TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) { |
| 1047 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 1051 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 1048 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1052 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1049 | 1053 |
| 1050 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1054 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1051 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1055 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1052 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1056 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1053 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1057 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1054 | 1058 |
| 1055 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1059 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1056 | 1060 |
| 1057 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1061 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1058 | 1062 |
| 1059 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", DEFAULT_PRIORITY)); | 1063 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1060 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY)); | 1064 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1061 | 1065 |
| 1062 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1066 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1063 | 1067 |
| 1064 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); | 1068 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); |
| 1065 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); | 1069 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); |
| 1066 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); | 1070 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); |
| 1067 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); | 1071 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); |
| 1068 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); | 1072 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); |
| 1069 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); | 1073 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); |
| 1070 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); | 1074 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1163 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); | 1167 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); |
| 1164 | 1168 |
| 1165 // Cancel the stalled request. | 1169 // Cancel the stalled request. |
| 1166 handles[0].Reset(); | 1170 handles[0].Reset(); |
| 1167 | 1171 |
| 1168 // Now we should have a connect job. | 1172 // Now we should have a connect job. |
| 1169 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); | 1173 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); |
| 1170 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); | 1174 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); |
| 1171 | 1175 |
| 1172 // The stalled socket should connect. | 1176 // The stalled socket should connect. |
| 1173 EXPECT_EQ(OK, callback.WaitForResult()); | 1177 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 1174 | 1178 |
| 1175 EXPECT_EQ(kDefaultMaxSockets + 1, | 1179 EXPECT_EQ(kDefaultMaxSockets + 1, |
| 1176 client_socket_factory_.allocation_count()); | 1180 client_socket_factory_.allocation_count()); |
| 1177 EXPECT_EQ(0, pool_->IdleSocketCount()); | 1181 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 1178 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); | 1182 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); |
| 1179 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); | 1183 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); |
| 1180 | 1184 |
| 1181 // Dropping out of scope will close all handles and return them to idle. | 1185 // Dropping out of scope will close all handles and return them to idle. |
| 1182 } | 1186 } |
| 1183 | 1187 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1212 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, | 1216 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, |
| 1213 ClientSocketPool::RespectLimits::ENABLED, | 1217 ClientSocketPool::RespectLimits::ENABLED, |
| 1214 callback.callback(), pool_.get(), BoundNetLog())); | 1218 callback.callback(), pool_.get(), BoundNetLog())); |
| 1215 EXPECT_TRUE(pool_->IsStalled()); | 1219 EXPECT_TRUE(pool_->IsStalled()); |
| 1216 | 1220 |
| 1217 // Dropping out of scope will close all handles and return them to idle. | 1221 // Dropping out of scope will close all handles and return them to idle. |
| 1218 } | 1222 } |
| 1219 | 1223 |
| 1220 // But if we wait for it, the released idle sockets will be closed in | 1224 // But if we wait for it, the released idle sockets will be closed in |
| 1221 // preference of the waiting request. | 1225 // preference of the waiting request. |
| 1222 EXPECT_EQ(OK, callback.WaitForResult()); | 1226 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 1223 | 1227 |
| 1224 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); | 1228 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); |
| 1225 EXPECT_EQ(3, pool_->IdleSocketCount()); | 1229 EXPECT_EQ(3, pool_->IdleSocketCount()); |
| 1226 } | 1230 } |
| 1227 | 1231 |
| 1228 // Regression test for http://crbug.com/40952. | 1232 // Regression test for http://crbug.com/40952. |
| 1229 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { | 1233 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { |
| 1230 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1234 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1231 pool_->EnableConnectBackupJobs(); | 1235 pool_->EnableConnectBackupJobs(); |
| 1232 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1236 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1255 ClientSocketPool::RespectLimits::ENABLED, | 1259 ClientSocketPool::RespectLimits::ENABLED, |
| 1256 callback.callback(), pool_.get(), BoundNetLog())); | 1260 callback.callback(), pool_.get(), BoundNetLog())); |
| 1257 | 1261 |
| 1258 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1262 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1259 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); | 1263 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); |
| 1260 } | 1264 } |
| 1261 | 1265 |
| 1262 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { | 1266 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { |
| 1263 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1267 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1264 | 1268 |
| 1265 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1269 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1266 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1270 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1267 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); | 1271 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING)); |
| 1268 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1272 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1269 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); | 1273 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING)); |
| 1270 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); | 1274 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING)); |
| 1271 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 1275 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING)); |
| 1272 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1276 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1273 | 1277 |
| 1274 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); | 1278 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); |
| 1275 | 1279 |
| 1276 EXPECT_EQ(kDefaultMaxSocketsPerGroup, | 1280 EXPECT_EQ(kDefaultMaxSocketsPerGroup, |
| 1277 client_socket_factory_.allocation_count()); | 1281 client_socket_factory_.allocation_count()); |
| 1278 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, | 1282 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, |
| 1279 completion_count()); | 1283 completion_count()); |
| 1280 | 1284 |
| 1281 EXPECT_EQ(1, GetOrderOfRequest(1)); | 1285 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 1282 EXPECT_EQ(2, GetOrderOfRequest(2)); | 1286 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 1283 EXPECT_EQ(8, GetOrderOfRequest(3)); | 1287 EXPECT_EQ(8, GetOrderOfRequest(3)); |
| 1284 EXPECT_EQ(6, GetOrderOfRequest(4)); | 1288 EXPECT_EQ(6, GetOrderOfRequest(4)); |
| 1285 EXPECT_EQ(4, GetOrderOfRequest(5)); | 1289 EXPECT_EQ(4, GetOrderOfRequest(5)); |
| 1286 EXPECT_EQ(3, GetOrderOfRequest(6)); | 1290 EXPECT_EQ(3, GetOrderOfRequest(6)); |
| 1287 EXPECT_EQ(5, GetOrderOfRequest(7)); | 1291 EXPECT_EQ(5, GetOrderOfRequest(7)); |
| 1288 EXPECT_EQ(7, GetOrderOfRequest(8)); | 1292 EXPECT_EQ(7, GetOrderOfRequest(8)); |
| 1289 | 1293 |
| 1290 // Make sure we test order of all requests made. | 1294 // Make sure we test order of all requests made. |
| 1291 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); | 1295 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); |
| 1292 } | 1296 } |
| 1293 | 1297 |
| 1294 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { | 1298 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { |
| 1295 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1299 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1296 | 1300 |
| 1297 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1301 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1298 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1302 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1299 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1303 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1300 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); | 1304 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING)); |
| 1301 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); | 1305 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING)); |
| 1302 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 1306 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING)); |
| 1303 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1307 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1304 | 1308 |
| 1305 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); | 1309 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); |
| 1306 | 1310 |
| 1307 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) | 1311 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) |
| 1308 EXPECT_EQ(OK, request(i)->WaitForResult()); | 1312 EXPECT_THAT(request(i)->WaitForResult(), IsOk()); |
| 1309 | 1313 |
| 1310 EXPECT_EQ(static_cast<int>(requests_size()), | 1314 EXPECT_EQ(static_cast<int>(requests_size()), |
| 1311 client_socket_factory_.allocation_count()); | 1315 client_socket_factory_.allocation_count()); |
| 1312 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, | 1316 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, |
| 1313 completion_count()); | 1317 completion_count()); |
| 1314 } | 1318 } |
| 1315 | 1319 |
| 1316 // This test will start up a RequestSocket() and then immediately Cancel() it. | 1320 // This test will start up a RequestSocket() and then immediately Cancel() it. |
| 1317 // The pending connect job will be cancelled and should not call back into | 1321 // The pending connect job will be cancelled and should not call back into |
| 1318 // ClientSocketPoolBase. | 1322 // ClientSocketPoolBase. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1342 callback.callback(), pool_.get(), BoundNetLog())); | 1346 callback.callback(), pool_.get(), BoundNetLog())); |
| 1343 | 1347 |
| 1344 handle.Reset(); | 1348 handle.Reset(); |
| 1345 | 1349 |
| 1346 TestCompletionCallback callback2; | 1350 TestCompletionCallback callback2; |
| 1347 EXPECT_EQ(ERR_IO_PENDING, | 1351 EXPECT_EQ(ERR_IO_PENDING, |
| 1348 handle.Init("a", params_, DEFAULT_PRIORITY, | 1352 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1349 ClientSocketPool::RespectLimits::ENABLED, | 1353 ClientSocketPool::RespectLimits::ENABLED, |
| 1350 callback2.callback(), pool_.get(), BoundNetLog())); | 1354 callback2.callback(), pool_.get(), BoundNetLog())); |
| 1351 | 1355 |
| 1352 EXPECT_EQ(OK, callback2.WaitForResult()); | 1356 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 1353 EXPECT_FALSE(callback.have_result()); | 1357 EXPECT_FALSE(callback.have_result()); |
| 1354 | 1358 |
| 1355 handle.Reset(); | 1359 handle.Reset(); |
| 1356 } | 1360 } |
| 1357 | 1361 |
| 1358 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { | 1362 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { |
| 1359 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1363 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1360 | 1364 |
| 1361 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1365 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1362 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1366 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1363 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1367 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1364 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); | 1368 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING)); |
| 1365 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); | 1369 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING)); |
| 1366 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 1370 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING)); |
| 1367 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1371 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1368 | 1372 |
| 1369 // Cancel a request. | 1373 // Cancel a request. |
| 1370 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2; | 1374 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2; |
| 1371 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); | 1375 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); |
| 1372 (*requests())[index_to_cancel]->handle()->Reset(); | 1376 (*requests())[index_to_cancel]->handle()->Reset(); |
| 1373 | 1377 |
| 1374 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); | 1378 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); |
| 1375 | 1379 |
| 1376 EXPECT_EQ(kDefaultMaxSocketsPerGroup, | 1380 EXPECT_EQ(kDefaultMaxSocketsPerGroup, |
| 1377 client_socket_factory_.allocation_count()); | 1381 client_socket_factory_.allocation_count()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1395 // disconnects the successfully connected socket from the first request, and | 1399 // disconnects the successfully connected socket from the first request, and |
| 1396 // then reuses the ClientSocketHandle to request another socket. | 1400 // then reuses the ClientSocketHandle to request another socket. |
| 1397 // | 1401 // |
| 1398 // |nested_callback| is called with the result of the second socket request. | 1402 // |nested_callback| is called with the result of the second socket request. |
| 1399 void RequestSocketOnComplete(ClientSocketHandle* handle, | 1403 void RequestSocketOnComplete(ClientSocketHandle* handle, |
| 1400 TestClientSocketPool* pool, | 1404 TestClientSocketPool* pool, |
| 1401 TestConnectJobFactory* test_connect_job_factory, | 1405 TestConnectJobFactory* test_connect_job_factory, |
| 1402 TestConnectJob::JobType next_job_type, | 1406 TestConnectJob::JobType next_job_type, |
| 1403 const CompletionCallback& nested_callback, | 1407 const CompletionCallback& nested_callback, |
| 1404 int first_request_result) { | 1408 int first_request_result) { |
| 1405 EXPECT_EQ(OK, first_request_result); | 1409 EXPECT_THAT(first_request_result, IsOk()); |
| 1406 | 1410 |
| 1407 test_connect_job_factory->set_job_type(next_job_type); | 1411 test_connect_job_factory->set_job_type(next_job_type); |
| 1408 | 1412 |
| 1409 // Don't allow reuse of the socket. Disconnect it and then release it. | 1413 // Don't allow reuse of the socket. Disconnect it and then release it. |
| 1410 if (handle->socket()) | 1414 if (handle->socket()) |
| 1411 handle->socket()->Disconnect(); | 1415 handle->socket()->Disconnect(); |
| 1412 handle->Reset(); | 1416 handle->Reset(); |
| 1413 | 1417 |
| 1414 scoped_refptr<TestSocketParams> params(new TestSocketParams()); | 1418 scoped_refptr<TestSocketParams> params(new TestSocketParams()); |
| 1415 TestCompletionCallback callback; | 1419 TestCompletionCallback callback; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1432 | 1436 |
| 1433 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1437 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1434 ClientSocketHandle handle; | 1438 ClientSocketHandle handle; |
| 1435 TestCompletionCallback second_result_callback; | 1439 TestCompletionCallback second_result_callback; |
| 1436 int rv = handle.Init( | 1440 int rv = handle.Init( |
| 1437 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, | 1441 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, |
| 1438 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), | 1442 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), |
| 1439 connect_job_factory_, TestConnectJob::kMockPendingJob, | 1443 connect_job_factory_, TestConnectJob::kMockPendingJob, |
| 1440 second_result_callback.callback()), | 1444 second_result_callback.callback()), |
| 1441 pool_.get(), BoundNetLog()); | 1445 pool_.get(), BoundNetLog()); |
| 1442 ASSERT_EQ(ERR_IO_PENDING, rv); | 1446 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1443 | 1447 |
| 1444 EXPECT_EQ(OK, second_result_callback.WaitForResult()); | 1448 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk()); |
| 1445 } | 1449 } |
| 1446 | 1450 |
| 1447 // Tests the case where a second socket is requested in a completion callback, | 1451 // Tests the case where a second socket is requested in a completion callback, |
| 1448 // and the second socket connects synchronously. Reuses the same | 1452 // and the second socket connects synchronously. Reuses the same |
| 1449 // ClientSocketHandle for the second socket, after disconnecting the first. | 1453 // ClientSocketHandle for the second socket, after disconnecting the first. |
| 1450 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { | 1454 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { |
| 1451 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1455 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1452 | 1456 |
| 1453 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1457 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1454 ClientSocketHandle handle; | 1458 ClientSocketHandle handle; |
| 1455 TestCompletionCallback second_result_callback; | 1459 TestCompletionCallback second_result_callback; |
| 1456 int rv = handle.Init( | 1460 int rv = handle.Init( |
| 1457 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, | 1461 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, |
| 1458 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), | 1462 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), |
| 1459 connect_job_factory_, TestConnectJob::kMockPendingJob, | 1463 connect_job_factory_, TestConnectJob::kMockPendingJob, |
| 1460 second_result_callback.callback()), | 1464 second_result_callback.callback()), |
| 1461 pool_.get(), BoundNetLog()); | 1465 pool_.get(), BoundNetLog()); |
| 1462 ASSERT_EQ(ERR_IO_PENDING, rv); | 1466 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1463 | 1467 |
| 1464 EXPECT_EQ(OK, second_result_callback.WaitForResult()); | 1468 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk()); |
| 1465 } | 1469 } |
| 1466 | 1470 |
| 1467 // Make sure that pending requests get serviced after active requests get | 1471 // Make sure that pending requests get serviced after active requests get |
| 1468 // cancelled. | 1472 // cancelled. |
| 1469 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { | 1473 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { |
| 1470 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1474 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1471 | 1475 |
| 1472 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1476 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1473 | 1477 |
| 1474 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1478 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1475 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1479 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1476 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1480 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1477 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1481 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1478 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1482 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1479 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1483 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1480 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1484 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1481 | 1485 |
| 1482 // Now, kDefaultMaxSocketsPerGroup requests should be active. | 1486 // Now, kDefaultMaxSocketsPerGroup requests should be active. |
| 1483 // Let's cancel them. | 1487 // Let's cancel them. |
| 1484 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) { | 1488 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) { |
| 1485 ASSERT_FALSE(request(i)->handle()->is_initialized()); | 1489 ASSERT_FALSE(request(i)->handle()->is_initialized()); |
| 1486 request(i)->handle()->Reset(); | 1490 request(i)->handle()->Reset(); |
| 1487 } | 1491 } |
| 1488 | 1492 |
| 1489 // Let's wait for the rest to complete now. | 1493 // Let's wait for the rest to complete now. |
| 1490 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { | 1494 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { |
| 1491 EXPECT_EQ(OK, request(i)->WaitForResult()); | 1495 EXPECT_THAT(request(i)->WaitForResult(), IsOk()); |
| 1492 request(i)->handle()->Reset(); | 1496 request(i)->handle()->Reset(); |
| 1493 } | 1497 } |
| 1494 | 1498 |
| 1495 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, | 1499 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, |
| 1496 completion_count()); | 1500 completion_count()); |
| 1497 } | 1501 } |
| 1498 | 1502 |
| 1499 // Make sure that pending requests get serviced after active requests fail. | 1503 // Make sure that pending requests get serviced after active requests fail. |
| 1500 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { | 1504 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { |
| 1501 const size_t kMaxSockets = 5; | 1505 const size_t kMaxSockets = 5; |
| 1502 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); | 1506 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1503 | 1507 |
| 1504 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1508 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1505 | 1509 |
| 1506 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; | 1510 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; |
| 1507 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. | 1511 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. |
| 1508 | 1512 |
| 1509 // Queue up all the requests | 1513 // Queue up all the requests |
| 1510 for (size_t i = 0; i < kNumberOfRequests; ++i) | 1514 for (size_t i = 0; i < kNumberOfRequests; ++i) |
| 1511 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1515 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1512 | 1516 |
| 1513 for (size_t i = 0; i < kNumberOfRequests; ++i) | 1517 for (size_t i = 0; i < kNumberOfRequests; ++i) |
| 1514 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); | 1518 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 1515 } | 1519 } |
| 1516 | 1520 |
| 1517 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { | 1521 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { |
| 1518 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1522 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1519 | 1523 |
| 1520 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1524 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1521 | 1525 |
| 1522 ClientSocketHandle handle; | 1526 ClientSocketHandle handle; |
| 1523 TestCompletionCallback callback; | 1527 TestCompletionCallback callback; |
| 1524 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, | 1528 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1525 ClientSocketPool::RespectLimits::ENABLED, | 1529 ClientSocketPool::RespectLimits::ENABLED, |
| 1526 callback.callback(), pool_.get(), BoundNetLog()); | 1530 callback.callback(), pool_.get(), BoundNetLog()); |
| 1527 EXPECT_EQ(ERR_IO_PENDING, rv); | 1531 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1528 | 1532 |
| 1529 // Cancel the active request. | 1533 // Cancel the active request. |
| 1530 handle.Reset(); | 1534 handle.Reset(); |
| 1531 | 1535 |
| 1532 rv = handle.Init("a", params_, DEFAULT_PRIORITY, | 1536 rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1533 ClientSocketPool::RespectLimits::ENABLED, | 1537 ClientSocketPool::RespectLimits::ENABLED, |
| 1534 callback.callback(), pool_.get(), BoundNetLog()); | 1538 callback.callback(), pool_.get(), BoundNetLog()); |
| 1535 EXPECT_EQ(ERR_IO_PENDING, rv); | 1539 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1536 EXPECT_EQ(OK, callback.WaitForResult()); | 1540 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 1537 | 1541 |
| 1538 EXPECT_FALSE(handle.is_reused()); | 1542 EXPECT_FALSE(handle.is_reused()); |
| 1539 TestLoadTimingInfoConnectedNotReused(handle); | 1543 TestLoadTimingInfoConnectedNotReused(handle); |
| 1540 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 1544 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 1541 } | 1545 } |
| 1542 | 1546 |
| 1543 // Regression test for http://crbug.com/17985. | 1547 // Regression test for http://crbug.com/17985. |
| 1544 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { | 1548 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { |
| 1545 const int kMaxSockets = 3; | 1549 const int kMaxSockets = 3; |
| 1546 const int kMaxSocketsPerGroup = 2; | 1550 const int kMaxSocketsPerGroup = 2; |
| 1547 CreatePool(kMaxSockets, kMaxSocketsPerGroup); | 1551 CreatePool(kMaxSockets, kMaxSocketsPerGroup); |
| 1548 | 1552 |
| 1549 const RequestPriority kHighPriority = HIGHEST; | 1553 const RequestPriority kHighPriority = HIGHEST; |
| 1550 | 1554 |
| 1551 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1555 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1552 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1556 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 1553 | 1557 |
| 1554 // This is going to be a pending request in an otherwise empty group. | 1558 // This is going to be a pending request in an otherwise empty group. |
| 1555 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1559 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1556 | 1560 |
| 1557 // Reach the maximum socket limit. | 1561 // Reach the maximum socket limit. |
| 1558 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 1562 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 1559 | 1563 |
| 1560 // Create a stalled group with high priorities. | 1564 // Create a stalled group with high priorities. |
| 1561 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); | 1565 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING)); |
| 1562 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); | 1566 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING)); |
| 1563 | 1567 |
| 1564 // Release the first two sockets from "a". Because this is a keepalive, | 1568 // Release the first two sockets from "a". Because this is a keepalive, |
| 1565 // the first release will unblock the pending request for "a". The | 1569 // the first release will unblock the pending request for "a". The |
| 1566 // second release will unblock a request for "c", becaue it is the next | 1570 // second release will unblock a request for "c", becaue it is the next |
| 1567 // high priority socket. | 1571 // high priority socket. |
| 1568 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); | 1572 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); |
| 1569 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); | 1573 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); |
| 1570 | 1574 |
| 1571 // Closing idle sockets should not get us into trouble, but in the bug | 1575 // Closing idle sockets should not get us into trouble, but in the bug |
| 1572 // we were hitting a CHECK here. | 1576 // we were hitting a CHECK here. |
| 1573 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 1577 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 1574 pool_->CloseIdleSockets(); | 1578 pool_->CloseIdleSockets(); |
| 1575 | 1579 |
| 1576 // Run the released socket wakeups. | 1580 // Run the released socket wakeups. |
| 1577 base::RunLoop().RunUntilIdle(); | 1581 base::RunLoop().RunUntilIdle(); |
| 1578 } | 1582 } |
| 1579 | 1583 |
| 1580 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { | 1584 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { |
| 1581 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1582 | 1586 |
| 1583 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1584 ClientSocketHandle handle; | 1588 ClientSocketHandle handle; |
| 1585 TestCompletionCallback callback; | 1589 TestCompletionCallback callback; |
| 1586 BoundTestNetLog log; | 1590 BoundTestNetLog log; |
| 1587 int rv = handle.Init("a", params_, LOWEST, | 1591 int rv = handle.Init("a", params_, LOWEST, |
| 1588 ClientSocketPool::RespectLimits::ENABLED, | 1592 ClientSocketPool::RespectLimits::ENABLED, |
| 1589 callback.callback(), pool_.get(), log.bound()); | 1593 callback.callback(), pool_.get(), log.bound()); |
| 1590 EXPECT_EQ(ERR_IO_PENDING, rv); | 1594 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1591 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1595 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 1592 TestLoadTimingInfoNotConnected(handle); | 1596 TestLoadTimingInfoNotConnected(handle); |
| 1593 | 1597 |
| 1594 EXPECT_EQ(OK, callback.WaitForResult()); | 1598 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 1595 EXPECT_TRUE(handle.is_initialized()); | 1599 EXPECT_TRUE(handle.is_initialized()); |
| 1596 EXPECT_TRUE(handle.socket()); | 1600 EXPECT_TRUE(handle.socket()); |
| 1597 TestLoadTimingInfoConnectedNotReused(handle); | 1601 TestLoadTimingInfoConnectedNotReused(handle); |
| 1598 | 1602 |
| 1599 handle.Reset(); | 1603 handle.Reset(); |
| 1600 TestLoadTimingInfoNotConnected(handle); | 1604 TestLoadTimingInfoNotConnected(handle); |
| 1601 | 1605 |
| 1602 TestNetLogEntry::List entries; | 1606 TestNetLogEntry::List entries; |
| 1603 log.GetEntries(&entries); | 1607 log.GetEntries(&entries); |
| 1604 | 1608 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1626 // Set the additional error state members to ensure that they get cleared. | 1630 // Set the additional error state members to ensure that they get cleared. |
| 1627 handle.set_is_ssl_error(true); | 1631 handle.set_is_ssl_error(true); |
| 1628 HttpResponseInfo info; | 1632 HttpResponseInfo info; |
| 1629 info.headers = new HttpResponseHeaders(std::string()); | 1633 info.headers = new HttpResponseHeaders(std::string()); |
| 1630 handle.set_ssl_error_response_info(info); | 1634 handle.set_ssl_error_response_info(info); |
| 1631 EXPECT_EQ(ERR_IO_PENDING, | 1635 EXPECT_EQ(ERR_IO_PENDING, |
| 1632 handle.Init("a", params_, DEFAULT_PRIORITY, | 1636 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1633 ClientSocketPool::RespectLimits::ENABLED, | 1637 ClientSocketPool::RespectLimits::ENABLED, |
| 1634 callback.callback(), pool_.get(), log.bound())); | 1638 callback.callback(), pool_.get(), log.bound())); |
| 1635 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1639 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 1636 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 1640 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 1637 EXPECT_FALSE(handle.is_ssl_error()); | 1641 EXPECT_FALSE(handle.is_ssl_error()); |
| 1638 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 1642 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
| 1639 | 1643 |
| 1640 TestNetLogEntry::List entries; | 1644 TestNetLogEntry::List entries; |
| 1641 log.GetEntries(&entries); | 1645 log.GetEntries(&entries); |
| 1642 | 1646 |
| 1643 EXPECT_EQ(3u, entries.size()); | 1647 EXPECT_EQ(3u, entries.size()); |
| 1644 EXPECT_TRUE(LogContainsBeginEvent( | 1648 EXPECT_TRUE(LogContainsBeginEvent( |
| 1645 entries, 0, NetLog::TYPE_SOCKET_POOL)); | 1649 entries, 0, NetLog::TYPE_SOCKET_POOL)); |
| 1646 EXPECT_TRUE(LogContainsEvent( | 1650 EXPECT_TRUE(LogContainsEvent( |
| 1647 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, | 1651 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, |
| 1648 NetLog::PHASE_NONE)); | 1652 NetLog::PHASE_NONE)); |
| 1649 EXPECT_TRUE(LogContainsEndEvent( | 1653 EXPECT_TRUE(LogContainsEndEvent( |
| 1650 entries, 2, NetLog::TYPE_SOCKET_POOL)); | 1654 entries, 2, NetLog::TYPE_SOCKET_POOL)); |
| 1651 } | 1655 } |
| 1652 | 1656 |
| 1653 // Check that an async ConnectJob failure does not result in creation of a new | 1657 // Check that an async ConnectJob failure does not result in creation of a new |
| 1654 // ConnectJob when there's another pending request also waiting on its own | 1658 // ConnectJob when there's another pending request also waiting on its own |
| 1655 // ConnectJob. See http://crbug.com/463960. | 1659 // ConnectJob. See http://crbug.com/463960. |
| 1656 TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) { | 1660 TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) { |
| 1657 CreatePool(2, 2); | 1661 CreatePool(2, 2); |
| 1658 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1662 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1659 | 1663 |
| 1660 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1664 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1661 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 1665 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 1662 | 1666 |
| 1663 EXPECT_EQ(ERR_CONNECTION_FAILED, request(0)->WaitForResult()); | 1667 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 1664 EXPECT_EQ(ERR_CONNECTION_FAILED, request(1)->WaitForResult()); | 1668 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 1665 | 1669 |
| 1666 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 1670 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 1667 } | 1671 } |
| 1668 | 1672 |
| 1669 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { | 1673 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { |
| 1670 // TODO(eroman): Add back the log expectations! Removed them because the | 1674 // TODO(eroman): Add back the log expectations! Removed them because the |
| 1671 // ordering is difficult, and some may fire during destructor. | 1675 // ordering is difficult, and some may fire during destructor. |
| 1672 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1676 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1673 | 1677 |
| 1674 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1685 EXPECT_EQ(ERR_IO_PENDING, | 1689 EXPECT_EQ(ERR_IO_PENDING, |
| 1686 handle2.Init("a", params_, DEFAULT_PRIORITY, | 1690 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 1687 ClientSocketPool::RespectLimits::ENABLED, | 1691 ClientSocketPool::RespectLimits::ENABLED, |
| 1688 callback2.callback(), pool_.get(), BoundNetLog())); | 1692 callback2.callback(), pool_.get(), BoundNetLog())); |
| 1689 | 1693 |
| 1690 handle.Reset(); | 1694 handle.Reset(); |
| 1691 | 1695 |
| 1692 | 1696 |
| 1693 // At this point, request 2 is just waiting for the connect job to finish. | 1697 // At this point, request 2 is just waiting for the connect job to finish. |
| 1694 | 1698 |
| 1695 EXPECT_EQ(OK, callback2.WaitForResult()); | 1699 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 1696 handle2.Reset(); | 1700 handle2.Reset(); |
| 1697 | 1701 |
| 1698 // Now request 2 has actually finished. | 1702 // Now request 2 has actually finished. |
| 1699 // TODO(eroman): Add back log expectations. | 1703 // TODO(eroman): Add back log expectations. |
| 1700 } | 1704 } |
| 1701 | 1705 |
| 1702 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { | 1706 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { |
| 1703 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1707 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1704 | 1708 |
| 1705 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1709 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1706 | 1710 |
| 1707 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); | 1711 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING)); |
| 1708 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); | 1712 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING)); |
| 1709 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); | 1713 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING)); |
| 1710 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); | 1714 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING)); |
| 1711 | 1715 |
| 1712 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); | 1716 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); |
| 1713 (*requests())[2]->handle()->Reset(); | 1717 (*requests())[2]->handle()->Reset(); |
| 1714 (*requests())[3]->handle()->Reset(); | 1718 (*requests())[3]->handle()->Reset(); |
| 1715 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); | 1719 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); |
| 1716 | 1720 |
| 1717 (*requests())[1]->handle()->Reset(); | 1721 (*requests())[1]->handle()->Reset(); |
| 1718 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); | 1722 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); |
| 1719 | 1723 |
| 1720 (*requests())[0]->handle()->Reset(); | 1724 (*requests())[0]->handle()->Reset(); |
| 1721 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); | 1725 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); |
| 1722 } | 1726 } |
| 1723 | 1727 |
| 1724 // When requests and ConnectJobs are not coupled, the request will get serviced | 1728 // When requests and ConnectJobs are not coupled, the request will get serviced |
| 1725 // by whatever comes first. | 1729 // by whatever comes first. |
| 1726 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { | 1730 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { |
| 1727 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1728 | 1732 |
| 1729 // Start job 1 (async OK) | 1733 // Start job 1 (async OK) |
| 1730 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1734 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1731 | 1735 |
| 1732 std::vector<TestSocketRequest*> request_order; | 1736 std::vector<TestSocketRequest*> request_order; |
| 1733 size_t completion_count; // unused | 1737 size_t completion_count; // unused |
| 1734 TestSocketRequest req1(&request_order, &completion_count); | 1738 TestSocketRequest req1(&request_order, &completion_count); |
| 1735 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, | 1739 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1736 ClientSocketPool::RespectLimits::ENABLED, | 1740 ClientSocketPool::RespectLimits::ENABLED, |
| 1737 req1.callback(), pool_.get(), BoundNetLog()); | 1741 req1.callback(), pool_.get(), BoundNetLog()); |
| 1738 EXPECT_EQ(ERR_IO_PENDING, rv); | 1742 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1739 EXPECT_EQ(OK, req1.WaitForResult()); | 1743 EXPECT_THAT(req1.WaitForResult(), IsOk()); |
| 1740 | 1744 |
| 1741 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending | 1745 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending |
| 1742 // without a job. | 1746 // without a job. |
| 1743 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1747 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1744 | 1748 |
| 1745 TestSocketRequest req2(&request_order, &completion_count); | 1749 TestSocketRequest req2(&request_order, &completion_count); |
| 1746 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, | 1750 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1747 ClientSocketPool::RespectLimits::ENABLED, | 1751 ClientSocketPool::RespectLimits::ENABLED, |
| 1748 req2.callback(), pool_.get(), BoundNetLog()); | 1752 req2.callback(), pool_.get(), BoundNetLog()); |
| 1749 EXPECT_EQ(ERR_IO_PENDING, rv); | 1753 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1750 TestSocketRequest req3(&request_order, &completion_count); | 1754 TestSocketRequest req3(&request_order, &completion_count); |
| 1751 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, | 1755 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1752 ClientSocketPool::RespectLimits::ENABLED, | 1756 ClientSocketPool::RespectLimits::ENABLED, |
| 1753 req3.callback(), pool_.get(), BoundNetLog()); | 1757 req3.callback(), pool_.get(), BoundNetLog()); |
| 1754 EXPECT_EQ(ERR_IO_PENDING, rv); | 1758 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1755 | 1759 |
| 1756 // Both Requests 2 and 3 are pending. We release socket 1 which should | 1760 // Both Requests 2 and 3 are pending. We release socket 1 which should |
| 1757 // service request 2. Request 3 should still be waiting. | 1761 // service request 2. Request 3 should still be waiting. |
| 1758 req1.handle()->Reset(); | 1762 req1.handle()->Reset(); |
| 1759 // Run the released socket wakeups. | 1763 // Run the released socket wakeups. |
| 1760 base::RunLoop().RunUntilIdle(); | 1764 base::RunLoop().RunUntilIdle(); |
| 1761 ASSERT_TRUE(req2.handle()->socket()); | 1765 ASSERT_TRUE(req2.handle()->socket()); |
| 1762 EXPECT_EQ(OK, req2.WaitForResult()); | 1766 EXPECT_THAT(req2.WaitForResult(), IsOk()); |
| 1763 EXPECT_FALSE(req3.handle()->socket()); | 1767 EXPECT_FALSE(req3.handle()->socket()); |
| 1764 | 1768 |
| 1765 // Signal job 2, which should service request 3. | 1769 // Signal job 2, which should service request 3. |
| 1766 | 1770 |
| 1767 client_socket_factory_.SignalJobs(); | 1771 client_socket_factory_.SignalJobs(); |
| 1768 EXPECT_EQ(OK, req3.WaitForResult()); | 1772 EXPECT_THAT(req3.WaitForResult(), IsOk()); |
| 1769 | 1773 |
| 1770 ASSERT_EQ(3U, request_order.size()); | 1774 ASSERT_EQ(3U, request_order.size()); |
| 1771 EXPECT_EQ(&req1, request_order[0]); | 1775 EXPECT_EQ(&req1, request_order[0]); |
| 1772 EXPECT_EQ(&req2, request_order[1]); | 1776 EXPECT_EQ(&req2, request_order[1]); |
| 1773 EXPECT_EQ(&req3, request_order[2]); | 1777 EXPECT_EQ(&req3, request_order[2]); |
| 1774 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 1778 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 1775 } | 1779 } |
| 1776 | 1780 |
| 1777 // The requests are not coupled to the jobs. So, the requests should finish in | 1781 // The requests are not coupled to the jobs. So, the requests should finish in |
| 1778 // their priority / insertion order. | 1782 // their priority / insertion order. |
| 1779 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { | 1783 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { |
| 1780 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1784 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1781 // First two jobs are async. | 1785 // First two jobs are async. |
| 1782 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1786 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1783 | 1787 |
| 1784 std::vector<TestSocketRequest*> request_order; | 1788 std::vector<TestSocketRequest*> request_order; |
| 1785 size_t completion_count; // unused | 1789 size_t completion_count; // unused |
| 1786 TestSocketRequest req1(&request_order, &completion_count); | 1790 TestSocketRequest req1(&request_order, &completion_count); |
| 1787 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, | 1791 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1788 ClientSocketPool::RespectLimits::ENABLED, | 1792 ClientSocketPool::RespectLimits::ENABLED, |
| 1789 req1.callback(), pool_.get(), BoundNetLog()); | 1793 req1.callback(), pool_.get(), BoundNetLog()); |
| 1790 EXPECT_EQ(ERR_IO_PENDING, rv); | 1794 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1791 | 1795 |
| 1792 TestSocketRequest req2(&request_order, &completion_count); | 1796 TestSocketRequest req2(&request_order, &completion_count); |
| 1793 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, | 1797 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1794 ClientSocketPool::RespectLimits::ENABLED, | 1798 ClientSocketPool::RespectLimits::ENABLED, |
| 1795 req2.callback(), pool_.get(), BoundNetLog()); | 1799 req2.callback(), pool_.get(), BoundNetLog()); |
| 1796 EXPECT_EQ(ERR_IO_PENDING, rv); | 1800 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1797 | 1801 |
| 1798 // The pending job is sync. | 1802 // The pending job is sync. |
| 1799 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1803 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1800 | 1804 |
| 1801 TestSocketRequest req3(&request_order, &completion_count); | 1805 TestSocketRequest req3(&request_order, &completion_count); |
| 1802 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, | 1806 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1803 ClientSocketPool::RespectLimits::ENABLED, | 1807 ClientSocketPool::RespectLimits::ENABLED, |
| 1804 req3.callback(), pool_.get(), BoundNetLog()); | 1808 req3.callback(), pool_.get(), BoundNetLog()); |
| 1805 EXPECT_EQ(ERR_IO_PENDING, rv); | 1809 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1806 | 1810 |
| 1807 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); | 1811 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 1808 EXPECT_EQ(OK, req2.WaitForResult()); | 1812 EXPECT_THAT(req2.WaitForResult(), IsOk()); |
| 1809 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); | 1813 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 1810 | 1814 |
| 1811 ASSERT_EQ(3U, request_order.size()); | 1815 ASSERT_EQ(3U, request_order.size()); |
| 1812 EXPECT_EQ(&req1, request_order[0]); | 1816 EXPECT_EQ(&req1, request_order[0]); |
| 1813 EXPECT_EQ(&req2, request_order[1]); | 1817 EXPECT_EQ(&req2, request_order[1]); |
| 1814 EXPECT_EQ(&req3, request_order[2]); | 1818 EXPECT_EQ(&req3, request_order[2]); |
| 1815 } | 1819 } |
| 1816 | 1820 |
| 1817 // Test GetLoadState in the case there's only one socket request. | 1821 // Test GetLoadState in the case there's only one socket request. |
| 1818 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { | 1822 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { |
| 1819 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1823 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1820 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1824 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1821 | 1825 |
| 1822 ClientSocketHandle handle; | 1826 ClientSocketHandle handle; |
| 1823 TestCompletionCallback callback; | 1827 TestCompletionCallback callback; |
| 1824 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, | 1828 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1825 ClientSocketPool::RespectLimits::ENABLED, | 1829 ClientSocketPool::RespectLimits::ENABLED, |
| 1826 callback.callback(), pool_.get(), BoundNetLog()); | 1830 callback.callback(), pool_.get(), BoundNetLog()); |
| 1827 EXPECT_EQ(ERR_IO_PENDING, rv); | 1831 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1828 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1832 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1829 | 1833 |
| 1830 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 1834 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 1831 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | 1835 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); |
| 1832 | 1836 |
| 1833 // No point in completing the connection, since ClientSocketHandles only | 1837 // No point in completing the connection, since ClientSocketHandles only |
| 1834 // expect the LoadState to be checked while connecting. | 1838 // expect the LoadState to be checked while connecting. |
| 1835 } | 1839 } |
| 1836 | 1840 |
| 1837 // Test GetLoadState in the case there are two socket requests. | 1841 // Test GetLoadState in the case there are two socket requests. |
| 1838 // Only the first connection in the pool should affect the pool's load status. | 1842 // Only the first connection in the pool should affect the pool's load status. |
| 1839 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { | 1843 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { |
| 1840 CreatePool(2, 2); | 1844 CreatePool(2, 2); |
| 1841 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1845 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1842 | 1846 |
| 1843 ClientSocketHandle handle; | 1847 ClientSocketHandle handle; |
| 1844 TestCompletionCallback callback; | 1848 TestCompletionCallback callback; |
| 1845 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, | 1849 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1846 ClientSocketPool::RespectLimits::ENABLED, | 1850 ClientSocketPool::RespectLimits::ENABLED, |
| 1847 callback.callback(), pool_.get(), BoundNetLog()); | 1851 callback.callback(), pool_.get(), BoundNetLog()); |
| 1848 EXPECT_EQ(ERR_IO_PENDING, rv); | 1852 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1849 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); | 1853 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); |
| 1850 | 1854 |
| 1851 ClientSocketHandle handle2; | 1855 ClientSocketHandle handle2; |
| 1852 TestCompletionCallback callback2; | 1856 TestCompletionCallback callback2; |
| 1853 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, | 1857 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 1854 ClientSocketPool::RespectLimits::ENABLED, | 1858 ClientSocketPool::RespectLimits::ENABLED, |
| 1855 callback2.callback(), pool_.get(), BoundNetLog()); | 1859 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1856 EXPECT_EQ(ERR_IO_PENDING, rv); | 1860 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1857 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); | 1861 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); |
| 1858 | 1862 |
| 1859 // Check that both handles report the state of the first job. | 1863 // Check that both handles report the state of the first job. |
| 1860 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState()); | 1864 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState()); |
| 1861 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); | 1865 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); |
| 1862 | 1866 |
| 1863 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING); | 1867 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING); |
| 1864 | 1868 |
| 1865 // Check that both handles change to LOAD_STATE_CONNECTING. | 1869 // Check that both handles change to LOAD_STATE_CONNECTING. |
| 1866 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1870 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1867 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 1871 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
| 1868 } | 1872 } |
| 1869 | 1873 |
| 1870 // Test that the second connection request does not affect the pool's load | 1874 // Test that the second connection request does not affect the pool's load |
| 1871 // status. | 1875 // status. |
| 1872 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) { | 1876 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) { |
| 1873 CreatePool(2, 2); | 1877 CreatePool(2, 2); |
| 1874 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1878 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1875 | 1879 |
| 1876 ClientSocketHandle handle; | 1880 ClientSocketHandle handle; |
| 1877 TestCompletionCallback callback; | 1881 TestCompletionCallback callback; |
| 1878 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, | 1882 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1879 ClientSocketPool::RespectLimits::ENABLED, | 1883 ClientSocketPool::RespectLimits::ENABLED, |
| 1880 callback.callback(), pool_.get(), BoundNetLog()); | 1884 callback.callback(), pool_.get(), BoundNetLog()); |
| 1881 EXPECT_EQ(ERR_IO_PENDING, rv); | 1885 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1882 | 1886 |
| 1883 ClientSocketHandle handle2; | 1887 ClientSocketHandle handle2; |
| 1884 TestCompletionCallback callback2; | 1888 TestCompletionCallback callback2; |
| 1885 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, | 1889 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 1886 ClientSocketPool::RespectLimits::ENABLED, | 1890 ClientSocketPool::RespectLimits::ENABLED, |
| 1887 callback2.callback(), pool_.get(), BoundNetLog()); | 1891 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1888 EXPECT_EQ(ERR_IO_PENDING, rv); | 1892 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1889 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); | 1893 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); |
| 1890 | 1894 |
| 1891 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1895 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1892 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 1896 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
| 1893 | 1897 |
| 1894 // First job connects and the first request gets the socket. The | 1898 // First job connects and the first request gets the socket. The |
| 1895 // second handle switches to the state of the remaining ConnectJob. | 1899 // second handle switches to the state of the remaining ConnectJob. |
| 1896 client_socket_factory_.SignalJob(0); | 1900 client_socket_factory_.SignalJob(0); |
| 1897 EXPECT_EQ(OK, callback.WaitForResult()); | 1901 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 1898 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); | 1902 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); |
| 1899 } | 1903 } |
| 1900 | 1904 |
| 1901 // Test GetLoadState in the case the per-group limit is reached. | 1905 // Test GetLoadState in the case the per-group limit is reached. |
| 1902 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { | 1906 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { |
| 1903 CreatePool(2, 1); | 1907 CreatePool(2, 1); |
| 1904 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1908 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1905 | 1909 |
| 1906 ClientSocketHandle handle; | 1910 ClientSocketHandle handle; |
| 1907 TestCompletionCallback callback; | 1911 TestCompletionCallback callback; |
| 1908 int rv = handle.Init("a", params_, MEDIUM, | 1912 int rv = handle.Init("a", params_, MEDIUM, |
| 1909 ClientSocketPool::RespectLimits::ENABLED, | 1913 ClientSocketPool::RespectLimits::ENABLED, |
| 1910 callback.callback(), pool_.get(), BoundNetLog()); | 1914 callback.callback(), pool_.get(), BoundNetLog()); |
| 1911 EXPECT_EQ(ERR_IO_PENDING, rv); | 1915 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1912 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1916 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1913 | 1917 |
| 1914 // Request another socket from the same pool, buth with a higher priority. | 1918 // Request another socket from the same pool, buth with a higher priority. |
| 1915 // The first request should now be stalled at the socket group limit. | 1919 // The first request should now be stalled at the socket group limit. |
| 1916 ClientSocketHandle handle2; | 1920 ClientSocketHandle handle2; |
| 1917 TestCompletionCallback callback2; | 1921 TestCompletionCallback callback2; |
| 1918 rv = handle2.Init("a", params_, HIGHEST, | 1922 rv = handle2.Init("a", params_, HIGHEST, |
| 1919 ClientSocketPool::RespectLimits::ENABLED, | 1923 ClientSocketPool::RespectLimits::ENABLED, |
| 1920 callback2.callback(), pool_.get(), BoundNetLog()); | 1924 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1921 EXPECT_EQ(ERR_IO_PENDING, rv); | 1925 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1922 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 1926 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
| 1923 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 1927 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
| 1924 | 1928 |
| 1925 // The first handle should remain stalled as the other socket goes through | 1929 // The first handle should remain stalled as the other socket goes through |
| 1926 // the connect process. | 1930 // the connect process. |
| 1927 | 1931 |
| 1928 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 1932 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 1929 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 1933 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
| 1930 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); | 1934 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); |
| 1931 | 1935 |
| 1932 client_socket_factory_.SignalJob(0); | 1936 client_socket_factory_.SignalJob(0); |
| 1933 EXPECT_EQ(OK, callback2.WaitForResult()); | 1937 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 1934 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 1938 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
| 1935 | 1939 |
| 1936 // Closing the second socket should cause the stalled handle to finally get a | 1940 // Closing the second socket should cause the stalled handle to finally get a |
| 1937 // ConnectJob. | 1941 // ConnectJob. |
| 1938 handle2.socket()->Disconnect(); | 1942 handle2.socket()->Disconnect(); |
| 1939 handle2.Reset(); | 1943 handle2.Reset(); |
| 1940 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1944 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1941 } | 1945 } |
| 1942 | 1946 |
| 1943 // Test GetLoadState in the case the per-pool limit is reached. | 1947 // Test GetLoadState in the case the per-pool limit is reached. |
| 1944 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { | 1948 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { |
| 1945 CreatePool(2, 2); | 1949 CreatePool(2, 2); |
| 1946 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1950 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1947 | 1951 |
| 1948 ClientSocketHandle handle; | 1952 ClientSocketHandle handle; |
| 1949 TestCompletionCallback callback; | 1953 TestCompletionCallback callback; |
| 1950 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, | 1954 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1951 ClientSocketPool::RespectLimits::ENABLED, | 1955 ClientSocketPool::RespectLimits::ENABLED, |
| 1952 callback.callback(), pool_.get(), BoundNetLog()); | 1956 callback.callback(), pool_.get(), BoundNetLog()); |
| 1953 EXPECT_EQ(ERR_IO_PENDING, rv); | 1957 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1954 | 1958 |
| 1955 // Request for socket from another pool. | 1959 // Request for socket from another pool. |
| 1956 ClientSocketHandle handle2; | 1960 ClientSocketHandle handle2; |
| 1957 TestCompletionCallback callback2; | 1961 TestCompletionCallback callback2; |
| 1958 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, | 1962 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, |
| 1959 ClientSocketPool::RespectLimits::ENABLED, | 1963 ClientSocketPool::RespectLimits::ENABLED, |
| 1960 callback2.callback(), pool_.get(), BoundNetLog()); | 1964 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1961 EXPECT_EQ(ERR_IO_PENDING, rv); | 1965 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1962 | 1966 |
| 1963 // Request another socket from the first pool. Request should stall at the | 1967 // Request another socket from the first pool. Request should stall at the |
| 1964 // socket pool limit. | 1968 // socket pool limit. |
| 1965 ClientSocketHandle handle3; | 1969 ClientSocketHandle handle3; |
| 1966 TestCompletionCallback callback3; | 1970 TestCompletionCallback callback3; |
| 1967 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, | 1971 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, |
| 1968 ClientSocketPool::RespectLimits::ENABLED, | 1972 ClientSocketPool::RespectLimits::ENABLED, |
| 1969 callback2.callback(), pool_.get(), BoundNetLog()); | 1973 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1970 EXPECT_EQ(ERR_IO_PENDING, rv); | 1974 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1971 | 1975 |
| 1972 // The third handle should remain stalled as the other sockets in its group | 1976 // The third handle should remain stalled as the other sockets in its group |
| 1973 // goes through the connect process. | 1977 // goes through the connect process. |
| 1974 | 1978 |
| 1975 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1979 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1976 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | 1980 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); |
| 1977 | 1981 |
| 1978 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 1982 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 1979 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | 1983 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); |
| 1980 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | 1984 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); |
| 1981 | 1985 |
| 1982 client_socket_factory_.SignalJob(0); | 1986 client_socket_factory_.SignalJob(0); |
| 1983 EXPECT_EQ(OK, callback.WaitForResult()); | 1987 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 1984 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | 1988 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); |
| 1985 | 1989 |
| 1986 // Closing a socket should allow the stalled handle to finally get a new | 1990 // Closing a socket should allow the stalled handle to finally get a new |
| 1987 // ConnectJob. | 1991 // ConnectJob. |
| 1988 handle.socket()->Disconnect(); | 1992 handle.socket()->Disconnect(); |
| 1989 handle.Reset(); | 1993 handle.Reset(); |
| 1990 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); | 1994 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); |
| 1991 } | 1995 } |
| 1992 | 1996 |
| 1993 TEST_F(ClientSocketPoolBaseTest, Recoverable) { | 1997 TEST_F(ClientSocketPoolBaseTest, Recoverable) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2009 | 2013 |
| 2010 connect_job_factory_->set_job_type( | 2014 connect_job_factory_->set_job_type( |
| 2011 TestConnectJob::kMockPendingRecoverableJob); | 2015 TestConnectJob::kMockPendingRecoverableJob); |
| 2012 ClientSocketHandle handle; | 2016 ClientSocketHandle handle; |
| 2013 TestCompletionCallback callback; | 2017 TestCompletionCallback callback; |
| 2014 EXPECT_EQ(ERR_IO_PENDING, | 2018 EXPECT_EQ(ERR_IO_PENDING, |
| 2015 handle.Init("a", params_, DEFAULT_PRIORITY, | 2019 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2016 ClientSocketPool::RespectLimits::ENABLED, | 2020 ClientSocketPool::RespectLimits::ENABLED, |
| 2017 callback.callback(), pool_.get(), BoundNetLog())); | 2021 callback.callback(), pool_.get(), BoundNetLog())); |
| 2018 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2022 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2019 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); | 2023 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED)); |
| 2020 EXPECT_TRUE(handle.is_initialized()); | 2024 EXPECT_TRUE(handle.is_initialized()); |
| 2021 EXPECT_TRUE(handle.socket()); | 2025 EXPECT_TRUE(handle.socket()); |
| 2022 } | 2026 } |
| 2023 | 2027 |
| 2024 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { | 2028 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { |
| 2025 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2029 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2026 connect_job_factory_->set_job_type( | 2030 connect_job_factory_->set_job_type( |
| 2027 TestConnectJob::kMockAdditionalErrorStateJob); | 2031 TestConnectJob::kMockAdditionalErrorStateJob); |
| 2028 | 2032 |
| 2029 ClientSocketHandle handle; | 2033 ClientSocketHandle handle; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2043 | 2047 |
| 2044 connect_job_factory_->set_job_type( | 2048 connect_job_factory_->set_job_type( |
| 2045 TestConnectJob::kMockPendingAdditionalErrorStateJob); | 2049 TestConnectJob::kMockPendingAdditionalErrorStateJob); |
| 2046 ClientSocketHandle handle; | 2050 ClientSocketHandle handle; |
| 2047 TestCompletionCallback callback; | 2051 TestCompletionCallback callback; |
| 2048 EXPECT_EQ(ERR_IO_PENDING, | 2052 EXPECT_EQ(ERR_IO_PENDING, |
| 2049 handle.Init("a", params_, DEFAULT_PRIORITY, | 2053 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2050 ClientSocketPool::RespectLimits::ENABLED, | 2054 ClientSocketPool::RespectLimits::ENABLED, |
| 2051 callback.callback(), pool_.get(), BoundNetLog())); | 2055 callback.callback(), pool_.get(), BoundNetLog())); |
| 2052 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2056 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2053 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 2057 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 2054 EXPECT_FALSE(handle.is_initialized()); | 2058 EXPECT_FALSE(handle.is_initialized()); |
| 2055 EXPECT_FALSE(handle.socket()); | 2059 EXPECT_FALSE(handle.socket()); |
| 2056 EXPECT_TRUE(handle.is_ssl_error()); | 2060 EXPECT_TRUE(handle.is_ssl_error()); |
| 2057 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); | 2061 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); |
| 2058 } | 2062 } |
| 2059 | 2063 |
| 2060 // Make sure we can reuse sockets. | 2064 // Make sure we can reuse sockets. |
| 2061 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) { | 2065 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) { |
| 2062 CreatePoolWithIdleTimeouts( | 2066 CreatePoolWithIdleTimeouts( |
| 2063 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2067 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, |
| 2064 base::TimeDelta(), // Time out unused sockets immediately. | 2068 base::TimeDelta(), // Time out unused sockets immediately. |
| 2065 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2069 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
| 2066 | 2070 |
| 2067 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2071 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2068 | 2072 |
| 2069 ClientSocketHandle handle; | 2073 ClientSocketHandle handle; |
| 2070 TestCompletionCallback callback; | 2074 TestCompletionCallback callback; |
| 2071 int rv = handle.Init("a", params_, LOWEST, | 2075 int rv = handle.Init("a", params_, LOWEST, |
| 2072 ClientSocketPool::RespectLimits::ENABLED, | 2076 ClientSocketPool::RespectLimits::ENABLED, |
| 2073 callback.callback(), pool_.get(), BoundNetLog()); | 2077 callback.callback(), pool_.get(), BoundNetLog()); |
| 2074 ASSERT_EQ(ERR_IO_PENDING, rv); | 2078 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2075 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2079 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2076 ASSERT_EQ(OK, callback.WaitForResult()); | 2080 ASSERT_THAT(callback.WaitForResult(), IsOk()); |
| 2077 | 2081 |
| 2078 // Use and release the socket. | 2082 // Use and release the socket. |
| 2079 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); | 2083 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); |
| 2080 TestLoadTimingInfoConnectedNotReused(handle); | 2084 TestLoadTimingInfoConnectedNotReused(handle); |
| 2081 handle.Reset(); | 2085 handle.Reset(); |
| 2082 | 2086 |
| 2083 // Should now have one idle socket. | 2087 // Should now have one idle socket. |
| 2084 ASSERT_EQ(1, pool_->IdleSocketCount()); | 2088 ASSERT_EQ(1, pool_->IdleSocketCount()); |
| 2085 | 2089 |
| 2086 // Request a new socket. This should reuse the old socket and complete | 2090 // Request a new socket. This should reuse the old socket and complete |
| 2087 // synchronously. | 2091 // synchronously. |
| 2088 BoundTestNetLog log; | 2092 BoundTestNetLog log; |
| 2089 rv = handle.Init("a", params_, LOWEST, | 2093 rv = handle.Init("a", params_, LOWEST, |
| 2090 ClientSocketPool::RespectLimits::ENABLED, | 2094 ClientSocketPool::RespectLimits::ENABLED, |
| 2091 CompletionCallback(), pool_.get(), log.bound()); | 2095 CompletionCallback(), pool_.get(), log.bound()); |
| 2092 ASSERT_EQ(OK, rv); | 2096 ASSERT_THAT(rv, IsOk()); |
| 2093 EXPECT_TRUE(handle.is_reused()); | 2097 EXPECT_TRUE(handle.is_reused()); |
| 2094 TestLoadTimingInfoConnectedReused(handle); | 2098 TestLoadTimingInfoConnectedReused(handle); |
| 2095 | 2099 |
| 2096 ASSERT_TRUE(pool_->HasGroup("a")); | 2100 ASSERT_TRUE(pool_->HasGroup("a")); |
| 2097 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2101 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2098 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 2102 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 2099 | 2103 |
| 2100 TestNetLogEntry::List entries; | 2104 TestNetLogEntry::List entries; |
| 2101 log.GetEntries(&entries); | 2105 log.GetEntries(&entries); |
| 2102 EXPECT_TRUE(LogContainsEntryWithType( | 2106 EXPECT_TRUE(LogContainsEntryWithType( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2120 | 2124 |
| 2121 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2125 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2122 | 2126 |
| 2123 // Startup two mock pending connect jobs, which will sit in the MessageLoop. | 2127 // Startup two mock pending connect jobs, which will sit in the MessageLoop. |
| 2124 | 2128 |
| 2125 ClientSocketHandle handle; | 2129 ClientSocketHandle handle; |
| 2126 TestCompletionCallback callback; | 2130 TestCompletionCallback callback; |
| 2127 int rv = handle.Init("a", params_, LOWEST, | 2131 int rv = handle.Init("a", params_, LOWEST, |
| 2128 ClientSocketPool::RespectLimits::ENABLED, | 2132 ClientSocketPool::RespectLimits::ENABLED, |
| 2129 callback.callback(), pool_.get(), BoundNetLog()); | 2133 callback.callback(), pool_.get(), BoundNetLog()); |
| 2130 ASSERT_EQ(ERR_IO_PENDING, rv); | 2134 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2131 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2135 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2132 | 2136 |
| 2133 ClientSocketHandle handle2; | 2137 ClientSocketHandle handle2; |
| 2134 TestCompletionCallback callback2; | 2138 TestCompletionCallback callback2; |
| 2135 rv = handle2.Init("a", params_, LOWEST, | 2139 rv = handle2.Init("a", params_, LOWEST, |
| 2136 ClientSocketPool::RespectLimits::ENABLED, | 2140 ClientSocketPool::RespectLimits::ENABLED, |
| 2137 callback2.callback(), pool_.get(), BoundNetLog()); | 2141 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2138 ASSERT_EQ(ERR_IO_PENDING, rv); | 2142 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2139 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); | 2143 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); |
| 2140 | 2144 |
| 2141 // Cancel one of the requests. Wait for the other, which will get the first | 2145 // Cancel one of the requests. Wait for the other, which will get the first |
| 2142 // job. Release the socket. Run the loop again to make sure the second | 2146 // job. Release the socket. Run the loop again to make sure the second |
| 2143 // socket is sitting idle and the first one is released (since ReleaseSocket() | 2147 // socket is sitting idle and the first one is released (since ReleaseSocket() |
| 2144 // just posts a DoReleaseSocket() task). | 2148 // just posts a DoReleaseSocket() task). |
| 2145 | 2149 |
| 2146 handle.Reset(); | 2150 handle.Reset(); |
| 2147 ASSERT_EQ(OK, callback2.WaitForResult()); | 2151 ASSERT_THAT(callback2.WaitForResult(), IsOk()); |
| 2148 // Use the socket. | 2152 // Use the socket. |
| 2149 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); | 2153 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); |
| 2150 handle2.Reset(); | 2154 handle2.Reset(); |
| 2151 | 2155 |
| 2152 // We post all of our delayed tasks with a 2ms delay. I.e. they don't | 2156 // We post all of our delayed tasks with a 2ms delay. I.e. they don't |
| 2153 // actually become pending until 2ms after they have been created. In order | 2157 // actually become pending until 2ms after they have been created. In order |
| 2154 // to flush all tasks, we need to wait so that we know there are no | 2158 // to flush all tasks, we need to wait so that we know there are no |
| 2155 // soon-to-be-pending tasks waiting. | 2159 // soon-to-be-pending tasks waiting. |
| 2156 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 2160 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 2157 base::RunLoop().RunUntilIdle(); | 2161 base::RunLoop().RunUntilIdle(); |
| 2158 | 2162 |
| 2159 // Both sockets should now be idle. | 2163 // Both sockets should now be idle. |
| 2160 ASSERT_EQ(2, pool_->IdleSocketCount()); | 2164 ASSERT_EQ(2, pool_->IdleSocketCount()); |
| 2161 | 2165 |
| 2162 // Request a new socket. This should cleanup the unused and timed out ones. | 2166 // Request a new socket. This should cleanup the unused and timed out ones. |
| 2163 // A new socket will be created rather than reusing the idle one. | 2167 // A new socket will be created rather than reusing the idle one. |
| 2164 BoundTestNetLog log; | 2168 BoundTestNetLog log; |
| 2165 TestCompletionCallback callback3; | 2169 TestCompletionCallback callback3; |
| 2166 rv = handle.Init("a", params_, LOWEST, | 2170 rv = handle.Init("a", params_, LOWEST, |
| 2167 ClientSocketPool::RespectLimits::ENABLED, | 2171 ClientSocketPool::RespectLimits::ENABLED, |
| 2168 callback3.callback(), pool_.get(), log.bound()); | 2172 callback3.callback(), pool_.get(), log.bound()); |
| 2169 ASSERT_EQ(ERR_IO_PENDING, rv); | 2173 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2170 ASSERT_EQ(OK, callback3.WaitForResult()); | 2174 ASSERT_THAT(callback3.WaitForResult(), IsOk()); |
| 2171 EXPECT_FALSE(handle.is_reused()); | 2175 EXPECT_FALSE(handle.is_reused()); |
| 2172 | 2176 |
| 2173 // Make sure the idle socket is closed. | 2177 // Make sure the idle socket is closed. |
| 2174 ASSERT_TRUE(pool_->HasGroup("a")); | 2178 ASSERT_TRUE(pool_->HasGroup("a")); |
| 2175 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2179 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2176 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 2180 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 2177 | 2181 |
| 2178 TestNetLogEntry::List entries; | 2182 TestNetLogEntry::List entries; |
| 2179 log.GetEntries(&entries); | 2183 log.GetEntries(&entries); |
| 2180 EXPECT_FALSE(LogContainsEntryWithType( | 2184 EXPECT_FALSE(LogContainsEntryWithType( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2191 | 2195 |
| 2192 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2196 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 2193 | 2197 |
| 2194 // Startup 4 connect jobs. Two of them will be pending. | 2198 // Startup 4 connect jobs. Two of them will be pending. |
| 2195 | 2199 |
| 2196 ClientSocketHandle handle; | 2200 ClientSocketHandle handle; |
| 2197 TestCompletionCallback callback; | 2201 TestCompletionCallback callback; |
| 2198 int rv = handle.Init("a", params_, LOWEST, | 2202 int rv = handle.Init("a", params_, LOWEST, |
| 2199 ClientSocketPool::RespectLimits::ENABLED, | 2203 ClientSocketPool::RespectLimits::ENABLED, |
| 2200 callback.callback(), pool_.get(), BoundNetLog()); | 2204 callback.callback(), pool_.get(), BoundNetLog()); |
| 2201 EXPECT_EQ(OK, rv); | 2205 EXPECT_THAT(rv, IsOk()); |
| 2202 | 2206 |
| 2203 ClientSocketHandle handle2; | 2207 ClientSocketHandle handle2; |
| 2204 TestCompletionCallback callback2; | 2208 TestCompletionCallback callback2; |
| 2205 rv = handle2.Init("a", params_, LOWEST, | 2209 rv = handle2.Init("a", params_, LOWEST, |
| 2206 ClientSocketPool::RespectLimits::ENABLED, | 2210 ClientSocketPool::RespectLimits::ENABLED, |
| 2207 callback2.callback(), pool_.get(), BoundNetLog()); | 2211 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2208 EXPECT_EQ(OK, rv); | 2212 EXPECT_THAT(rv, IsOk()); |
| 2209 | 2213 |
| 2210 ClientSocketHandle handle3; | 2214 ClientSocketHandle handle3; |
| 2211 TestCompletionCallback callback3; | 2215 TestCompletionCallback callback3; |
| 2212 rv = handle3.Init("a", params_, LOWEST, | 2216 rv = handle3.Init("a", params_, LOWEST, |
| 2213 ClientSocketPool::RespectLimits::ENABLED, | 2217 ClientSocketPool::RespectLimits::ENABLED, |
| 2214 callback3.callback(), pool_.get(), BoundNetLog()); | 2218 callback3.callback(), pool_.get(), BoundNetLog()); |
| 2215 EXPECT_EQ(ERR_IO_PENDING, rv); | 2219 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2216 | 2220 |
| 2217 ClientSocketHandle handle4; | 2221 ClientSocketHandle handle4; |
| 2218 TestCompletionCallback callback4; | 2222 TestCompletionCallback callback4; |
| 2219 rv = handle4.Init("a", params_, LOWEST, | 2223 rv = handle4.Init("a", params_, LOWEST, |
| 2220 ClientSocketPool::RespectLimits::ENABLED, | 2224 ClientSocketPool::RespectLimits::ENABLED, |
| 2221 callback4.callback(), pool_.get(), BoundNetLog()); | 2225 callback4.callback(), pool_.get(), BoundNetLog()); |
| 2222 EXPECT_EQ(ERR_IO_PENDING, rv); | 2226 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 2223 | 2227 |
| 2224 // Release two disconnected sockets. | 2228 // Release two disconnected sockets. |
| 2225 | 2229 |
| 2226 handle.socket()->Disconnect(); | 2230 handle.socket()->Disconnect(); |
| 2227 handle.Reset(); | 2231 handle.Reset(); |
| 2228 handle2.socket()->Disconnect(); | 2232 handle2.socket()->Disconnect(); |
| 2229 handle2.Reset(); | 2233 handle2.Reset(); |
| 2230 | 2234 |
| 2231 EXPECT_EQ(OK, callback3.WaitForResult()); | 2235 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 2232 EXPECT_FALSE(handle3.is_reused()); | 2236 EXPECT_FALSE(handle3.is_reused()); |
| 2233 EXPECT_EQ(OK, callback4.WaitForResult()); | 2237 EXPECT_THAT(callback4.WaitForResult(), IsOk()); |
| 2234 EXPECT_FALSE(handle4.is_reused()); | 2238 EXPECT_FALSE(handle4.is_reused()); |
| 2235 } | 2239 } |
| 2236 | 2240 |
| 2237 // Regression test for http://crbug.com/42267. | 2241 // Regression test for http://crbug.com/42267. |
| 2238 // When DoReleaseSocket() is processed for one socket, it is blocked because the | 2242 // When DoReleaseSocket() is processed for one socket, it is blocked because the |
| 2239 // other stalled groups all have releasing sockets, so no progress can be made. | 2243 // other stalled groups all have releasing sockets, so no progress can be made. |
| 2240 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { | 2244 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { |
| 2241 CreatePoolWithIdleTimeouts( | 2245 CreatePoolWithIdleTimeouts( |
| 2242 4 /* socket limit */, 4 /* socket limit per group */, | 2246 4 /* socket limit */, 4 /* socket limit per group */, |
| 2243 base::TimeDelta(), // Time out unused sockets immediately. | 2247 base::TimeDelta(), // Time out unused sockets immediately. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2290 | 2294 |
| 2291 // Used to get stuck here. | 2295 // Used to get stuck here. |
| 2292 base::RunLoop().RunUntilIdle(); | 2296 base::RunLoop().RunUntilIdle(); |
| 2293 | 2297 |
| 2294 handle_b[1].socket()->Disconnect(); | 2298 handle_b[1].socket()->Disconnect(); |
| 2295 handle_b[1].Reset(); | 2299 handle_b[1].Reset(); |
| 2296 handle_a[1].socket()->Disconnect(); | 2300 handle_a[1].socket()->Disconnect(); |
| 2297 handle_a[1].Reset(); | 2301 handle_a[1].Reset(); |
| 2298 | 2302 |
| 2299 for (int i = 2; i < 4; ++i) { | 2303 for (int i = 2; i < 4; ++i) { |
| 2300 EXPECT_EQ(OK, callback_b[i].WaitForResult()); | 2304 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk()); |
| 2301 EXPECT_EQ(OK, callback_a[i].WaitForResult()); | 2305 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk()); |
| 2302 } | 2306 } |
| 2303 } | 2307 } |
| 2304 | 2308 |
| 2305 TEST_F(ClientSocketPoolBaseTest, | 2309 TEST_F(ClientSocketPoolBaseTest, |
| 2306 ReleasingDisconnectedSocketsMaintainsPriorityOrder) { | 2310 ReleasingDisconnectedSocketsMaintainsPriorityOrder) { |
| 2307 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2311 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2308 | 2312 |
| 2309 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2313 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2310 | 2314 |
| 2311 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 2315 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 2312 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 2316 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 2313 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 2317 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 2314 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); | 2318 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING)); |
| 2315 | 2319 |
| 2316 EXPECT_EQ(OK, (*requests())[0]->WaitForResult()); | 2320 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk()); |
| 2317 EXPECT_EQ(OK, (*requests())[1]->WaitForResult()); | 2321 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk()); |
| 2318 EXPECT_EQ(2u, completion_count()); | 2322 EXPECT_EQ(2u, completion_count()); |
| 2319 | 2323 |
| 2320 // Releases one connection. | 2324 // Releases one connection. |
| 2321 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); | 2325 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); |
| 2322 EXPECT_EQ(OK, (*requests())[2]->WaitForResult()); | 2326 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk()); |
| 2323 | 2327 |
| 2324 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); | 2328 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); |
| 2325 EXPECT_EQ(OK, (*requests())[3]->WaitForResult()); | 2329 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk()); |
| 2326 EXPECT_EQ(4u, completion_count()); | 2330 EXPECT_EQ(4u, completion_count()); |
| 2327 | 2331 |
| 2328 EXPECT_EQ(1, GetOrderOfRequest(1)); | 2332 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 2329 EXPECT_EQ(2, GetOrderOfRequest(2)); | 2333 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 2330 EXPECT_EQ(3, GetOrderOfRequest(3)); | 2334 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 2331 EXPECT_EQ(4, GetOrderOfRequest(4)); | 2335 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 2332 | 2336 |
| 2333 // Make sure we test order of all requests made. | 2337 // Make sure we test order of all requests made. |
| 2334 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5)); | 2338 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5)); |
| 2335 } | 2339 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2371 ClientSocketHandle handle_; | 2375 ClientSocketHandle handle_; |
| 2372 ClientSocketHandle handle2_; | 2376 ClientSocketHandle handle2_; |
| 2373 CompletionCallback callback_; | 2377 CompletionCallback callback_; |
| 2374 TestCompletionCallback callback2_; | 2378 TestCompletionCallback callback2_; |
| 2375 }; | 2379 }; |
| 2376 | 2380 |
| 2377 | 2381 |
| 2378 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { | 2382 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { |
| 2379 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2383 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2380 | 2384 |
| 2381 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 2385 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 2382 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 2386 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk()); |
| 2383 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 2387 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk()); |
| 2384 | 2388 |
| 2385 EXPECT_EQ(static_cast<int>(requests_size()), | 2389 EXPECT_EQ(static_cast<int>(requests_size()), |
| 2386 client_socket_factory_.allocation_count()); | 2390 client_socket_factory_.allocation_count()); |
| 2387 | 2391 |
| 2388 connect_job_factory_->set_job_type( | 2392 connect_job_factory_->set_job_type( |
| 2389 TestConnectJob::kMockPendingAdditionalErrorStateJob); | 2393 TestConnectJob::kMockPendingAdditionalErrorStateJob); |
| 2390 TestReleasingSocketRequest req(pool_.get(), OK, false); | 2394 TestReleasingSocketRequest req(pool_.get(), OK, false); |
| 2391 EXPECT_EQ(ERR_IO_PENDING, | 2395 EXPECT_EQ(ERR_IO_PENDING, |
| 2392 req.handle()->Init("a", params_, DEFAULT_PRIORITY, | 2396 req.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 2393 ClientSocketPool::RespectLimits::ENABLED, | 2397 ClientSocketPool::RespectLimits::ENABLED, |
| 2394 req.callback(), pool_.get(), BoundNetLog())); | 2398 req.callback(), pool_.get(), BoundNetLog())); |
| 2395 // The next job should complete synchronously | 2399 // The next job should complete synchronously |
| 2396 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2400 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 2397 | 2401 |
| 2398 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); | 2402 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 2399 EXPECT_FALSE(req.handle()->is_initialized()); | 2403 EXPECT_FALSE(req.handle()->is_initialized()); |
| 2400 EXPECT_FALSE(req.handle()->socket()); | 2404 EXPECT_FALSE(req.handle()->socket()); |
| 2401 EXPECT_TRUE(req.handle()->is_ssl_error()); | 2405 EXPECT_TRUE(req.handle()->is_ssl_error()); |
| 2402 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); | 2406 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); |
| 2403 } | 2407 } |
| 2404 | 2408 |
| 2405 // http://crbug.com/44724 regression test. | 2409 // http://crbug.com/44724 regression test. |
| 2406 // We start releasing the pool when we flush on network change. When that | 2410 // We start releasing the pool when we flush on network change. When that |
| 2407 // happens, the only active references are in the ClientSocketHandles. When a | 2411 // happens, the only active references are in the ClientSocketHandles. When a |
| 2408 // ConnectJob completes and calls back into the last ClientSocketHandle, that | 2412 // ConnectJob completes and calls back into the last ClientSocketHandle, that |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2430 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { | 2434 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { |
| 2431 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2435 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2432 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2436 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2433 | 2437 |
| 2434 ClientSocketHandle handle; | 2438 ClientSocketHandle handle; |
| 2435 TestCompletionCallback callback; | 2439 TestCompletionCallback callback; |
| 2436 EXPECT_EQ(ERR_IO_PENDING, | 2440 EXPECT_EQ(ERR_IO_PENDING, |
| 2437 handle.Init("a", params_, DEFAULT_PRIORITY, | 2441 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2438 ClientSocketPool::RespectLimits::ENABLED, | 2442 ClientSocketPool::RespectLimits::ENABLED, |
| 2439 callback.callback(), pool_.get(), BoundNetLog())); | 2443 callback.callback(), pool_.get(), BoundNetLog())); |
| 2440 EXPECT_EQ(OK, callback.WaitForResult()); | 2444 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2441 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); | 2445 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); |
| 2442 | 2446 |
| 2443 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2447 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
| 2444 | 2448 |
| 2445 handle.Reset(); | 2449 handle.Reset(); |
| 2446 base::RunLoop().RunUntilIdle(); | 2450 base::RunLoop().RunUntilIdle(); |
| 2447 | 2451 |
| 2448 EXPECT_EQ(ERR_IO_PENDING, | 2452 EXPECT_EQ(ERR_IO_PENDING, |
| 2449 handle.Init("a", params_, DEFAULT_PRIORITY, | 2453 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2450 ClientSocketPool::RespectLimits::ENABLED, | 2454 ClientSocketPool::RespectLimits::ENABLED, |
| 2451 callback.callback(), pool_.get(), BoundNetLog())); | 2455 callback.callback(), pool_.get(), BoundNetLog())); |
| 2452 EXPECT_EQ(OK, callback.WaitForResult()); | 2456 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2453 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); | 2457 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); |
| 2454 } | 2458 } |
| 2455 | 2459 |
| 2456 class ConnectWithinCallback : public TestCompletionCallbackBase { | 2460 class ConnectWithinCallback : public TestCompletionCallbackBase { |
| 2457 public: | 2461 public: |
| 2458 ConnectWithinCallback( | 2462 ConnectWithinCallback( |
| 2459 const std::string& group_name, | 2463 const std::string& group_name, |
| 2460 const scoped_refptr<TestSocketParams>& params, | 2464 const scoped_refptr<TestSocketParams>& params, |
| 2461 TestClientSocketPool* pool) | 2465 TestClientSocketPool* pool) |
| 2462 : group_name_(group_name), | 2466 : group_name_(group_name), |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2503 ConnectWithinCallback callback("a", params_, pool_.get()); | 2507 ConnectWithinCallback callback("a", params_, pool_.get()); |
| 2504 EXPECT_EQ(ERR_IO_PENDING, | 2508 EXPECT_EQ(ERR_IO_PENDING, |
| 2505 handle.Init("a", params_, DEFAULT_PRIORITY, | 2509 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2506 ClientSocketPool::RespectLimits::ENABLED, | 2510 ClientSocketPool::RespectLimits::ENABLED, |
| 2507 callback.callback(), pool_.get(), BoundNetLog())); | 2511 callback.callback(), pool_.get(), BoundNetLog())); |
| 2508 | 2512 |
| 2509 // Second job will be started during the first callback, and will | 2513 // Second job will be started during the first callback, and will |
| 2510 // asynchronously complete with OK. | 2514 // asynchronously complete with OK. |
| 2511 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2515 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2512 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2516 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
| 2513 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); | 2517 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED)); |
| 2514 EXPECT_EQ(OK, callback.WaitForNestedResult()); | 2518 EXPECT_THAT(callback.WaitForNestedResult(), IsOk()); |
| 2515 } | 2519 } |
| 2516 | 2520 |
| 2517 // Cancel a pending socket request while we're at max sockets, | 2521 // Cancel a pending socket request while we're at max sockets, |
| 2518 // and verify that the backup socket firing doesn't cause a crash. | 2522 // and verify that the backup socket firing doesn't cause a crash. |
| 2519 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { | 2523 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { |
| 2520 // Max 4 sockets globally, max 4 sockets per group. | 2524 // Max 4 sockets globally, max 4 sockets per group. |
| 2521 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2525 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 2522 pool_->EnableConnectBackupJobs(); | 2526 pool_->EnableConnectBackupJobs(); |
| 2523 | 2527 |
| 2524 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2528 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2602 EXPECT_EQ(ERR_IO_PENDING, | 2606 EXPECT_EQ(ERR_IO_PENDING, |
| 2603 handle2.Init("bar", params_, DEFAULT_PRIORITY, | 2607 handle2.Init("bar", params_, DEFAULT_PRIORITY, |
| 2604 ClientSocketPool::RespectLimits::ENABLED, | 2608 ClientSocketPool::RespectLimits::ENABLED, |
| 2605 callback2.callback(), pool_.get(), BoundNetLog())); | 2609 callback2.callback(), pool_.get(), BoundNetLog())); |
| 2606 ASSERT_TRUE(pool_->HasGroup("bar")); | 2610 ASSERT_TRUE(pool_->HasGroup("bar")); |
| 2607 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); | 2611 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); |
| 2608 | 2612 |
| 2609 // Cancel request 1 and then complete request 2. With the requests finished, | 2613 // Cancel request 1 and then complete request 2. With the requests finished, |
| 2610 // the backup timer should be cancelled. | 2614 // the backup timer should be cancelled. |
| 2611 handle.Reset(); | 2615 handle.Reset(); |
| 2612 EXPECT_EQ(OK, callback2.WaitForResult()); | 2616 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 2613 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2617 // Wait for the backup timer to fire (add some slop to ensure it fires) |
| 2614 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2618 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
| 2615 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2619 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
| 2616 base::RunLoop().RunUntilIdle(); | 2620 base::RunLoop().RunUntilIdle(); |
| 2617 } | 2621 } |
| 2618 | 2622 |
| 2619 // Test delayed socket binding for the case where we have two connects, | 2623 // Test delayed socket binding for the case where we have two connects, |
| 2620 // and while one is waiting on a connect, the other frees up. | 2624 // and while one is waiting on a connect, the other frees up. |
| 2621 // The socket waiting on a connect should switch immediately to the freed | 2625 // The socket waiting on a connect should switch immediately to the freed |
| 2622 // up socket. | 2626 // up socket. |
| 2623 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { | 2627 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { |
| 2624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2628 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2625 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2629 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2626 | 2630 |
| 2627 ClientSocketHandle handle1; | 2631 ClientSocketHandle handle1; |
| 2628 TestCompletionCallback callback; | 2632 TestCompletionCallback callback; |
| 2629 EXPECT_EQ(ERR_IO_PENDING, | 2633 EXPECT_EQ(ERR_IO_PENDING, |
| 2630 handle1.Init("a", params_, DEFAULT_PRIORITY, | 2634 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2631 ClientSocketPool::RespectLimits::ENABLED, | 2635 ClientSocketPool::RespectLimits::ENABLED, |
| 2632 callback.callback(), pool_.get(), BoundNetLog())); | 2636 callback.callback(), pool_.get(), BoundNetLog())); |
| 2633 EXPECT_EQ(OK, callback.WaitForResult()); | 2637 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2634 | 2638 |
| 2635 // No idle sockets, no pending jobs. | 2639 // No idle sockets, no pending jobs. |
| 2636 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2640 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2637 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2641 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2638 | 2642 |
| 2639 // Create a second socket to the same host, but this one will wait. | 2643 // Create a second socket to the same host, but this one will wait. |
| 2640 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2644 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2641 ClientSocketHandle handle2; | 2645 ClientSocketHandle handle2; |
| 2642 EXPECT_EQ(ERR_IO_PENDING, | 2646 EXPECT_EQ(ERR_IO_PENDING, |
| 2643 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2647 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2644 ClientSocketPool::RespectLimits::ENABLED, | 2648 ClientSocketPool::RespectLimits::ENABLED, |
| 2645 callback.callback(), pool_.get(), BoundNetLog())); | 2649 callback.callback(), pool_.get(), BoundNetLog())); |
| 2646 // No idle sockets, and one connecting job. | 2650 // No idle sockets, and one connecting job. |
| 2647 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2651 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2648 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2652 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2649 | 2653 |
| 2650 // Return the first handle to the pool. This will initiate the delayed | 2654 // Return the first handle to the pool. This will initiate the delayed |
| 2651 // binding. | 2655 // binding. |
| 2652 handle1.Reset(); | 2656 handle1.Reset(); |
| 2653 | 2657 |
| 2654 base::RunLoop().RunUntilIdle(); | 2658 base::RunLoop().RunUntilIdle(); |
| 2655 | 2659 |
| 2656 // Still no idle sockets, still one pending connect job. | 2660 // Still no idle sockets, still one pending connect job. |
| 2657 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2661 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2658 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2662 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2659 | 2663 |
| 2660 // The second socket connected, even though it was a Waiting Job. | 2664 // The second socket connected, even though it was a Waiting Job. |
| 2661 EXPECT_EQ(OK, callback.WaitForResult()); | 2665 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2662 | 2666 |
| 2663 // And we can see there is still one job waiting. | 2667 // And we can see there is still one job waiting. |
| 2664 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2668 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2665 | 2669 |
| 2666 // Finally, signal the waiting Connect. | 2670 // Finally, signal the waiting Connect. |
| 2667 client_socket_factory_.SignalJobs(); | 2671 client_socket_factory_.SignalJobs(); |
| 2668 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2672 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2669 | 2673 |
| 2670 base::RunLoop().RunUntilIdle(); | 2674 base::RunLoop().RunUntilIdle(); |
| 2671 } | 2675 } |
| 2672 | 2676 |
| 2673 // Test delayed socket binding when a group is at capacity and one | 2677 // Test delayed socket binding when a group is at capacity and one |
| 2674 // of the group's sockets frees up. | 2678 // of the group's sockets frees up. |
| 2675 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { | 2679 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { |
| 2676 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2680 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2681 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2678 | 2682 |
| 2679 ClientSocketHandle handle1; | 2683 ClientSocketHandle handle1; |
| 2680 TestCompletionCallback callback; | 2684 TestCompletionCallback callback; |
| 2681 EXPECT_EQ(ERR_IO_PENDING, | 2685 EXPECT_EQ(ERR_IO_PENDING, |
| 2682 handle1.Init("a", params_, DEFAULT_PRIORITY, | 2686 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2683 ClientSocketPool::RespectLimits::ENABLED, | 2687 ClientSocketPool::RespectLimits::ENABLED, |
| 2684 callback.callback(), pool_.get(), BoundNetLog())); | 2688 callback.callback(), pool_.get(), BoundNetLog())); |
| 2685 EXPECT_EQ(OK, callback.WaitForResult()); | 2689 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2686 | 2690 |
| 2687 // No idle sockets, no pending jobs. | 2691 // No idle sockets, no pending jobs. |
| 2688 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2692 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2689 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2693 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2690 | 2694 |
| 2691 // Create a second socket to the same host, but this one will wait. | 2695 // Create a second socket to the same host, but this one will wait. |
| 2692 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2696 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2693 ClientSocketHandle handle2; | 2697 ClientSocketHandle handle2; |
| 2694 EXPECT_EQ(ERR_IO_PENDING, | 2698 EXPECT_EQ(ERR_IO_PENDING, |
| 2695 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2699 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2696 ClientSocketPool::RespectLimits::ENABLED, | 2700 ClientSocketPool::RespectLimits::ENABLED, |
| 2697 callback.callback(), pool_.get(), BoundNetLog())); | 2701 callback.callback(), pool_.get(), BoundNetLog())); |
| 2698 // No idle sockets, and one connecting job. | 2702 // No idle sockets, and one connecting job. |
| 2699 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2703 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2700 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2704 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2701 | 2705 |
| 2702 // Return the first handle to the pool. This will initiate the delayed | 2706 // Return the first handle to the pool. This will initiate the delayed |
| 2703 // binding. | 2707 // binding. |
| 2704 handle1.Reset(); | 2708 handle1.Reset(); |
| 2705 | 2709 |
| 2706 base::RunLoop().RunUntilIdle(); | 2710 base::RunLoop().RunUntilIdle(); |
| 2707 | 2711 |
| 2708 // Still no idle sockets, still one pending connect job. | 2712 // Still no idle sockets, still one pending connect job. |
| 2709 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2713 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2710 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2714 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2711 | 2715 |
| 2712 // The second socket connected, even though it was a Waiting Job. | 2716 // The second socket connected, even though it was a Waiting Job. |
| 2713 EXPECT_EQ(OK, callback.WaitForResult()); | 2717 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2714 | 2718 |
| 2715 // And we can see there is still one job waiting. | 2719 // And we can see there is still one job waiting. |
| 2716 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2720 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2717 | 2721 |
| 2718 // Finally, signal the waiting Connect. | 2722 // Finally, signal the waiting Connect. |
| 2719 client_socket_factory_.SignalJobs(); | 2723 client_socket_factory_.SignalJobs(); |
| 2720 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2724 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2721 | 2725 |
| 2722 base::RunLoop().RunUntilIdle(); | 2726 base::RunLoop().RunUntilIdle(); |
| 2723 } | 2727 } |
| 2724 | 2728 |
| 2725 // Test out the case where we have one socket connected, one | 2729 // Test out the case where we have one socket connected, one |
| 2726 // connecting, when the first socket finishes and goes idle. | 2730 // connecting, when the first socket finishes and goes idle. |
| 2727 // Although the second connection is pending, the second request | 2731 // Although the second connection is pending, the second request |
| 2728 // should complete, by taking the first socket's idle socket. | 2732 // should complete, by taking the first socket's idle socket. |
| 2729 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { | 2733 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { |
| 2730 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2734 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2731 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2735 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2732 | 2736 |
| 2733 ClientSocketHandle handle1; | 2737 ClientSocketHandle handle1; |
| 2734 TestCompletionCallback callback; | 2738 TestCompletionCallback callback; |
| 2735 EXPECT_EQ(ERR_IO_PENDING, | 2739 EXPECT_EQ(ERR_IO_PENDING, |
| 2736 handle1.Init("a", params_, DEFAULT_PRIORITY, | 2740 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2737 ClientSocketPool::RespectLimits::ENABLED, | 2741 ClientSocketPool::RespectLimits::ENABLED, |
| 2738 callback.callback(), pool_.get(), BoundNetLog())); | 2742 callback.callback(), pool_.get(), BoundNetLog())); |
| 2739 EXPECT_EQ(OK, callback.WaitForResult()); | 2743 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2740 | 2744 |
| 2741 // No idle sockets, no pending jobs. | 2745 // No idle sockets, no pending jobs. |
| 2742 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2746 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2743 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2747 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2744 | 2748 |
| 2745 // Create a second socket to the same host, but this one will wait. | 2749 // Create a second socket to the same host, but this one will wait. |
| 2746 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2750 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2747 ClientSocketHandle handle2; | 2751 ClientSocketHandle handle2; |
| 2748 EXPECT_EQ(ERR_IO_PENDING, | 2752 EXPECT_EQ(ERR_IO_PENDING, |
| 2749 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2753 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2750 ClientSocketPool::RespectLimits::ENABLED, | 2754 ClientSocketPool::RespectLimits::ENABLED, |
| 2751 callback.callback(), pool_.get(), BoundNetLog())); | 2755 callback.callback(), pool_.get(), BoundNetLog())); |
| 2752 // No idle sockets, and one connecting job. | 2756 // No idle sockets, and one connecting job. |
| 2753 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2757 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2754 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2758 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2755 | 2759 |
| 2756 // Return the first handle to the pool. This will initiate the delayed | 2760 // Return the first handle to the pool. This will initiate the delayed |
| 2757 // binding. | 2761 // binding. |
| 2758 handle1.Reset(); | 2762 handle1.Reset(); |
| 2759 | 2763 |
| 2760 base::RunLoop().RunUntilIdle(); | 2764 base::RunLoop().RunUntilIdle(); |
| 2761 | 2765 |
| 2762 // Still no idle sockets, still one pending connect job. | 2766 // Still no idle sockets, still one pending connect job. |
| 2763 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2767 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2764 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2768 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2765 | 2769 |
| 2766 // The second socket connected, even though it was a Waiting Job. | 2770 // The second socket connected, even though it was a Waiting Job. |
| 2767 EXPECT_EQ(OK, callback.WaitForResult()); | 2771 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 2768 | 2772 |
| 2769 // And we can see there is still one job waiting. | 2773 // And we can see there is still one job waiting. |
| 2770 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2774 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2771 | 2775 |
| 2772 // Finally, signal the waiting Connect. | 2776 // Finally, signal the waiting Connect. |
| 2773 client_socket_factory_.SignalJobs(); | 2777 client_socket_factory_.SignalJobs(); |
| 2774 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2778 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2775 | 2779 |
| 2776 base::RunLoop().RunUntilIdle(); | 2780 base::RunLoop().RunUntilIdle(); |
| 2777 } | 2781 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2802 TestCompletionCallback callback2; | 2806 TestCompletionCallback callback2; |
| 2803 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail | 2807 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail |
| 2804 // when created. | 2808 // when created. |
| 2805 EXPECT_EQ(ERR_IO_PENDING, | 2809 EXPECT_EQ(ERR_IO_PENDING, |
| 2806 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2810 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2807 ClientSocketPool::RespectLimits::ENABLED, | 2811 ClientSocketPool::RespectLimits::ENABLED, |
| 2808 callback2.callback(), pool_.get(), BoundNetLog())); | 2812 callback2.callback(), pool_.get(), BoundNetLog())); |
| 2809 | 2813 |
| 2810 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2814 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2811 | 2815 |
| 2812 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult()); | 2816 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 2813 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult()); | 2817 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED)); |
| 2814 EXPECT_FALSE(pool_->HasGroup("a")); | 2818 EXPECT_FALSE(pool_->HasGroup("a")); |
| 2815 } | 2819 } |
| 2816 | 2820 |
| 2817 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { | 2821 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { |
| 2818 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2822 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 2819 | 2823 |
| 2820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2824 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2821 | 2825 |
| 2822 ClientSocketHandle handle1; | 2826 ClientSocketHandle handle1; |
| 2823 TestCompletionCallback callback1; | 2827 TestCompletionCallback callback1; |
| 2824 EXPECT_EQ(ERR_IO_PENDING, | 2828 EXPECT_EQ(ERR_IO_PENDING, |
| 2825 handle1.Init("a", params_, DEFAULT_PRIORITY, | 2829 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2826 ClientSocketPool::RespectLimits::ENABLED, | 2830 ClientSocketPool::RespectLimits::ENABLED, |
| 2827 callback1.callback(), pool_.get(), BoundNetLog())); | 2831 callback1.callback(), pool_.get(), BoundNetLog())); |
| 2828 | 2832 |
| 2829 ClientSocketHandle handle2; | 2833 ClientSocketHandle handle2; |
| 2830 TestCompletionCallback callback2; | 2834 TestCompletionCallback callback2; |
| 2831 EXPECT_EQ(ERR_IO_PENDING, | 2835 EXPECT_EQ(ERR_IO_PENDING, |
| 2832 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2836 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2833 ClientSocketPool::RespectLimits::ENABLED, | 2837 ClientSocketPool::RespectLimits::ENABLED, |
| 2834 callback2.callback(), pool_.get(), BoundNetLog())); | 2838 callback2.callback(), pool_.get(), BoundNetLog())); |
| 2835 ClientSocketHandle handle3; | 2839 ClientSocketHandle handle3; |
| 2836 TestCompletionCallback callback3; | 2840 TestCompletionCallback callback3; |
| 2837 EXPECT_EQ(ERR_IO_PENDING, | 2841 EXPECT_EQ(ERR_IO_PENDING, |
| 2838 handle3.Init("a", params_, DEFAULT_PRIORITY, | 2842 handle3.Init("a", params_, DEFAULT_PRIORITY, |
| 2839 ClientSocketPool::RespectLimits::ENABLED, | 2843 ClientSocketPool::RespectLimits::ENABLED, |
| 2840 callback3.callback(), pool_.get(), BoundNetLog())); | 2844 callback3.callback(), pool_.get(), BoundNetLog())); |
| 2841 | 2845 |
| 2842 EXPECT_EQ(OK, callback1.WaitForResult()); | 2846 EXPECT_THAT(callback1.WaitForResult(), IsOk()); |
| 2843 EXPECT_EQ(OK, callback2.WaitForResult()); | 2847 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 2844 EXPECT_EQ(OK, callback3.WaitForResult()); | 2848 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 2845 | 2849 |
| 2846 // Use the socket. | 2850 // Use the socket. |
| 2847 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); | 2851 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); |
| 2848 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); | 2852 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); |
| 2849 | 2853 |
| 2850 handle1.Reset(); | 2854 handle1.Reset(); |
| 2851 handle2.Reset(); | 2855 handle2.Reset(); |
| 2852 handle3.Reset(); | 2856 handle3.Reset(); |
| 2853 | 2857 |
| 2854 EXPECT_EQ(OK, handle1.Init("a", params_, DEFAULT_PRIORITY, | 2858 EXPECT_EQ(OK, handle1.Init("a", params_, DEFAULT_PRIORITY, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2888 TestCompletionCallback callback2; | 2892 TestCompletionCallback callback2; |
| 2889 EXPECT_EQ(ERR_IO_PENDING, | 2893 EXPECT_EQ(ERR_IO_PENDING, |
| 2890 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2894 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2891 ClientSocketPool::RespectLimits::ENABLED, | 2895 ClientSocketPool::RespectLimits::ENABLED, |
| 2892 callback2.callback(), pool_.get(), BoundNetLog())); | 2896 callback2.callback(), pool_.get(), BoundNetLog())); |
| 2893 | 2897 |
| 2894 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 2898 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 2895 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2899 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2896 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2900 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2897 | 2901 |
| 2898 EXPECT_EQ(OK, callback1.WaitForResult()); | 2902 EXPECT_THAT(callback1.WaitForResult(), IsOk()); |
| 2899 EXPECT_EQ(OK, callback2.WaitForResult()); | 2903 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 2900 handle1.Reset(); | 2904 handle1.Reset(); |
| 2901 handle2.Reset(); | 2905 handle2.Reset(); |
| 2902 | 2906 |
| 2903 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2907 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2904 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2908 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2905 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); | 2909 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); |
| 2906 } | 2910 } |
| 2907 | 2911 |
| 2908 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { | 2912 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { |
| 2909 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2913 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2931 TestCompletionCallback callback2; | 2935 TestCompletionCallback callback2; |
| 2932 EXPECT_EQ(ERR_IO_PENDING, | 2936 EXPECT_EQ(ERR_IO_PENDING, |
| 2933 handle2.Init("a", params_, DEFAULT_PRIORITY, | 2937 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2934 ClientSocketPool::RespectLimits::ENABLED, | 2938 ClientSocketPool::RespectLimits::ENABLED, |
| 2935 callback2.callback(), pool_.get(), BoundNetLog())); | 2939 callback2.callback(), pool_.get(), BoundNetLog())); |
| 2936 | 2940 |
| 2937 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 2941 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 2938 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2942 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2939 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2943 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2940 | 2944 |
| 2941 EXPECT_EQ(OK, callback1.WaitForResult()); | 2945 EXPECT_THAT(callback1.WaitForResult(), IsOk()); |
| 2942 EXPECT_EQ(OK, callback2.WaitForResult()); | 2946 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 2943 handle1.Reset(); | 2947 handle1.Reset(); |
| 2944 handle2.Reset(); | 2948 handle2.Reset(); |
| 2945 | 2949 |
| 2946 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2950 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2947 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2951 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2948 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); | 2952 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); |
| 2949 } | 2953 } |
| 2950 | 2954 |
| 2951 TEST_F(ClientSocketPoolBaseTest, | 2955 TEST_F(ClientSocketPoolBaseTest, |
| 2952 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { | 2956 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2978 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); | 2982 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); |
| 2979 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2983 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2980 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2984 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2981 | 2985 |
| 2982 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 2986 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 2983 | 2987 |
| 2984 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); | 2988 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); |
| 2985 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2989 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2986 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2990 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2987 | 2991 |
| 2988 EXPECT_EQ(OK, callback1.WaitForResult()); | 2992 EXPECT_THAT(callback1.WaitForResult(), IsOk()); |
| 2989 EXPECT_EQ(OK, callback2.WaitForResult()); | 2993 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 2990 EXPECT_EQ(OK, callback3.WaitForResult()); | 2994 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 2991 handle1.Reset(); | 2995 handle1.Reset(); |
| 2992 handle2.Reset(); | 2996 handle2.Reset(); |
| 2993 handle3.Reset(); | 2997 handle3.Reset(); |
| 2994 | 2998 |
| 2995 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2999 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2996 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3000 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 2997 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); | 3001 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); |
| 2998 } | 3002 } |
| 2999 | 3003 |
| 3000 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { | 3004 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3046 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { | 3050 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { |
| 3047 CreatePool(4, 4); | 3051 CreatePool(4, 4); |
| 3048 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3052 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3049 | 3053 |
| 3050 ClientSocketHandle handle1; | 3054 ClientSocketHandle handle1; |
| 3051 TestCompletionCallback callback1; | 3055 TestCompletionCallback callback1; |
| 3052 EXPECT_EQ(ERR_IO_PENDING, | 3056 EXPECT_EQ(ERR_IO_PENDING, |
| 3053 handle1.Init("a", params_, DEFAULT_PRIORITY, | 3057 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3054 ClientSocketPool::RespectLimits::ENABLED, | 3058 ClientSocketPool::RespectLimits::ENABLED, |
| 3055 callback1.callback(), pool_.get(), BoundNetLog())); | 3059 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3056 ASSERT_EQ(OK, callback1.WaitForResult()); | 3060 ASSERT_THAT(callback1.WaitForResult(), IsOk()); |
| 3057 handle1.Reset(); | 3061 handle1.Reset(); |
| 3058 | 3062 |
| 3059 ASSERT_TRUE(pool_->HasGroup("a")); | 3063 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3060 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3064 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3061 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3065 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3062 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3066 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3063 | 3067 |
| 3064 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3068 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3065 | 3069 |
| 3066 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3070 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3067 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3071 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3068 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3072 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3069 } | 3073 } |
| 3070 | 3074 |
| 3071 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { | 3075 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { |
| 3072 CreatePool(4, 4); | 3076 CreatePool(4, 4); |
| 3073 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3074 | 3078 |
| 3075 ClientSocketHandle handle1; | 3079 ClientSocketHandle handle1; |
| 3076 TestCompletionCallback callback1; | 3080 TestCompletionCallback callback1; |
| 3077 EXPECT_EQ(ERR_IO_PENDING, | 3081 EXPECT_EQ(ERR_IO_PENDING, |
| 3078 handle1.Init("a", params_, DEFAULT_PRIORITY, | 3082 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3079 ClientSocketPool::RespectLimits::ENABLED, | 3083 ClientSocketPool::RespectLimits::ENABLED, |
| 3080 callback1.callback(), pool_.get(), BoundNetLog())); | 3084 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3081 ASSERT_EQ(OK, callback1.WaitForResult()); | 3085 ASSERT_THAT(callback1.WaitForResult(), IsOk()); |
| 3082 | 3086 |
| 3083 ASSERT_TRUE(pool_->HasGroup("a")); | 3087 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3084 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3088 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3085 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3089 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3086 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3090 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3087 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3091 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 3088 | 3092 |
| 3089 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3093 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3090 | 3094 |
| 3091 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3095 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3146 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3150 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 3147 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 3151 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3148 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3152 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3149 | 3153 |
| 3150 ClientSocketHandle handle1; | 3154 ClientSocketHandle handle1; |
| 3151 TestCompletionCallback callback1; | 3155 TestCompletionCallback callback1; |
| 3152 EXPECT_EQ(ERR_IO_PENDING, | 3156 EXPECT_EQ(ERR_IO_PENDING, |
| 3153 handle1.Init("a", params_, DEFAULT_PRIORITY, | 3157 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3154 ClientSocketPool::RespectLimits::ENABLED, | 3158 ClientSocketPool::RespectLimits::ENABLED, |
| 3155 callback1.callback(), pool_.get(), BoundNetLog())); | 3159 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3156 ASSERT_EQ(OK, callback1.WaitForResult()); | 3160 ASSERT_THAT(callback1.WaitForResult(), IsOk()); |
| 3157 | 3161 |
| 3158 ClientSocketHandle handle2; | 3162 ClientSocketHandle handle2; |
| 3159 TestCompletionCallback callback2; | 3163 TestCompletionCallback callback2; |
| 3160 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, | 3164 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3161 ClientSocketPool::RespectLimits::ENABLED, | 3165 ClientSocketPool::RespectLimits::ENABLED, |
| 3162 callback2.callback(), pool_.get(), BoundNetLog()); | 3166 callback2.callback(), pool_.get(), BoundNetLog()); |
| 3163 if (rv != OK) { | 3167 if (rv != OK) { |
| 3164 EXPECT_EQ(ERR_IO_PENDING, rv); | 3168 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 3165 EXPECT_EQ(OK, callback2.WaitForResult()); | 3169 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 3166 } | 3170 } |
| 3167 | 3171 |
| 3168 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3172 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3169 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3173 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3170 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a")); | 3174 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a")); |
| 3171 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3175 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3172 | 3176 |
| 3173 handle1.Reset(); | 3177 handle1.Reset(); |
| 3174 handle2.Reset(); | 3178 handle2.Reset(); |
| 3175 | 3179 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3225 TestCompletionCallback callback1; | 3229 TestCompletionCallback callback1; |
| 3226 EXPECT_EQ(ERR_IO_PENDING, | 3230 EXPECT_EQ(ERR_IO_PENDING, |
| 3227 handle1.Init("a", params_, DEFAULT_PRIORITY, | 3231 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3228 ClientSocketPool::RespectLimits::ENABLED, | 3232 ClientSocketPool::RespectLimits::ENABLED, |
| 3229 callback1.callback(), pool_.get(), BoundNetLog())); | 3233 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3230 | 3234 |
| 3231 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3235 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3232 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3236 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3233 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3237 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3234 | 3238 |
| 3235 ASSERT_EQ(OK, callback1.WaitForResult()); | 3239 ASSERT_THAT(callback1.WaitForResult(), IsOk()); |
| 3236 | 3240 |
| 3237 // Make sure if a preconnected socket is not fully connected when a request | 3241 // Make sure if a preconnected socket is not fully connected when a request |
| 3238 // starts, it has a connect start time. | 3242 // starts, it has a connect start time. |
| 3239 TestLoadTimingInfoConnectedNotReused(handle1); | 3243 TestLoadTimingInfoConnectedNotReused(handle1); |
| 3240 handle1.Reset(); | 3244 handle1.Reset(); |
| 3241 | 3245 |
| 3242 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3246 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3243 } | 3247 } |
| 3244 | 3248 |
| 3245 // Checks that fully connected preconnect jobs have no connect times, and are | 3249 // Checks that fully connected preconnect jobs have no connect times, and are |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3279 // CloseOneIdleSocket() will try to close "a"'s idle socket. | 3283 // CloseOneIdleSocket() will try to close "a"'s idle socket. |
| 3280 | 3284 |
| 3281 // Set up one idle socket in "a". | 3285 // Set up one idle socket in "a". |
| 3282 ClientSocketHandle handle1; | 3286 ClientSocketHandle handle1; |
| 3283 TestCompletionCallback callback1; | 3287 TestCompletionCallback callback1; |
| 3284 EXPECT_EQ(ERR_IO_PENDING, | 3288 EXPECT_EQ(ERR_IO_PENDING, |
| 3285 handle1.Init("a", params_, DEFAULT_PRIORITY, | 3289 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3286 ClientSocketPool::RespectLimits::ENABLED, | 3290 ClientSocketPool::RespectLimits::ENABLED, |
| 3287 callback1.callback(), pool_.get(), BoundNetLog())); | 3291 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3288 | 3292 |
| 3289 ASSERT_EQ(OK, callback1.WaitForResult()); | 3293 ASSERT_THAT(callback1.WaitForResult(), IsOk()); |
| 3290 handle1.Reset(); | 3294 handle1.Reset(); |
| 3291 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3295 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3292 | 3296 |
| 3293 // Set up two active sockets in "b". | 3297 // Set up two active sockets in "b". |
| 3294 ClientSocketHandle handle2; | 3298 ClientSocketHandle handle2; |
| 3295 TestCompletionCallback callback2; | 3299 TestCompletionCallback callback2; |
| 3296 EXPECT_EQ(ERR_IO_PENDING, | 3300 EXPECT_EQ(ERR_IO_PENDING, |
| 3297 handle1.Init("b", params_, DEFAULT_PRIORITY, | 3301 handle1.Init("b", params_, DEFAULT_PRIORITY, |
| 3298 ClientSocketPool::RespectLimits::ENABLED, | 3302 ClientSocketPool::RespectLimits::ENABLED, |
| 3299 callback1.callback(), pool_.get(), BoundNetLog())); | 3303 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3300 EXPECT_EQ(ERR_IO_PENDING, | 3304 EXPECT_EQ(ERR_IO_PENDING, |
| 3301 handle2.Init("b", params_, DEFAULT_PRIORITY, | 3305 handle2.Init("b", params_, DEFAULT_PRIORITY, |
| 3302 ClientSocketPool::RespectLimits::ENABLED, | 3306 ClientSocketPool::RespectLimits::ENABLED, |
| 3303 callback2.callback(), pool_.get(), BoundNetLog())); | 3307 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3304 | 3308 |
| 3305 ASSERT_EQ(OK, callback1.WaitForResult()); | 3309 ASSERT_THAT(callback1.WaitForResult(), IsOk()); |
| 3306 ASSERT_EQ(OK, callback2.WaitForResult()); | 3310 ASSERT_THAT(callback2.WaitForResult(), IsOk()); |
| 3307 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); | 3311 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); |
| 3308 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); | 3312 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); |
| 3309 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); | 3313 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); |
| 3310 | 3314 |
| 3311 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means | 3315 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means |
| 3312 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. | 3316 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. |
| 3313 // Requesting 2 preconnected sockets for "a" should fail to allocate any more | 3317 // Requesting 2 preconnected sockets for "a" should fail to allocate any more |
| 3314 // sockets for "a", and "b" should still have 2 active sockets. | 3318 // sockets for "a", and "b" should still have 2 active sockets. |
| 3315 | 3319 |
| 3316 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3320 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3384 TestCompletionCallback callback; | 3388 TestCompletionCallback callback; |
| 3385 EXPECT_EQ(ERR_IO_PENDING, | 3389 EXPECT_EQ(ERR_IO_PENDING, |
| 3386 handle.Init("a", params_, DEFAULT_PRIORITY, | 3390 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3387 ClientSocketPool::RespectLimits::ENABLED, | 3391 ClientSocketPool::RespectLimits::ENABLED, |
| 3388 callback.callback(), pool_.get(), BoundNetLog())); | 3392 callback.callback(), pool_.get(), BoundNetLog())); |
| 3389 // Timer has started, but the backup connect job shouldn't be created yet. | 3393 // Timer has started, but the backup connect job shouldn't be created yet. |
| 3390 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3394 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3391 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3395 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3392 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3396 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3393 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); | 3397 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); |
| 3394 ASSERT_EQ(OK, callback.WaitForResult()); | 3398 ASSERT_THAT(callback.WaitForResult(), IsOk()); |
| 3395 | 3399 |
| 3396 // The hung connect job should still be there, but everything else should be | 3400 // The hung connect job should still be there, but everything else should be |
| 3397 // complete. | 3401 // complete. |
| 3398 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3402 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3399 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3403 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3400 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3404 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3401 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3405 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 3402 } | 3406 } |
| 3403 | 3407 |
| 3404 // Tests that a preconnect that starts out with unread data can still be used. | 3408 // Tests that a preconnect that starts out with unread data can still be used. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3487 TestCompletionCallback callback_; | 3491 TestCompletionCallback callback_; |
| 3488 const std::string group_name_; | 3492 const std::string group_name_; |
| 3489 bool can_release_connection_; | 3493 bool can_release_connection_; |
| 3490 }; | 3494 }; |
| 3491 | 3495 |
| 3492 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { | 3496 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { |
| 3493 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3497 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 3494 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3498 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3495 | 3499 |
| 3496 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3500 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
| 3497 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3501 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk()); |
| 3498 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3502 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3499 .WillOnce(Return(false)); | 3503 .WillOnce(Return(false)); |
| 3500 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); | 3504 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
| 3501 } | 3505 } |
| 3502 | 3506 |
| 3503 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { | 3507 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { |
| 3504 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3508 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 3505 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3509 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3506 | 3510 |
| 3507 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3511 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
| 3508 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3512 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk()); |
| 3509 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3513 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3510 .WillOnce(Invoke(&mock_layered_pool, | 3514 .WillOnce(Invoke(&mock_layered_pool, |
| 3511 &MockLayeredPool::ReleaseOneConnection)); | 3515 &MockLayeredPool::ReleaseOneConnection)); |
| 3512 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); | 3516 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
| 3513 } | 3517 } |
| 3514 | 3518 |
| 3515 // Tests the basic case of closing an idle socket in a higher layered pool when | 3519 // Tests the basic case of closing an idle socket in a higher layered pool when |
| 3516 // a new request is issued and the lower layer pool is stalled. | 3520 // a new request is issued and the lower layer pool is stalled. |
| 3517 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { | 3521 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { |
| 3518 CreatePool(1, 1); | 3522 CreatePool(1, 1); |
| 3519 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3523 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3520 | 3524 |
| 3521 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3525 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
| 3522 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3526 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk()); |
| 3523 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3527 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3524 .WillOnce(Invoke(&mock_layered_pool, | 3528 .WillOnce(Invoke(&mock_layered_pool, |
| 3525 &MockLayeredPool::ReleaseOneConnection)); | 3529 &MockLayeredPool::ReleaseOneConnection)); |
| 3526 ClientSocketHandle handle; | 3530 ClientSocketHandle handle; |
| 3527 TestCompletionCallback callback; | 3531 TestCompletionCallback callback; |
| 3528 EXPECT_EQ(ERR_IO_PENDING, | 3532 EXPECT_EQ(ERR_IO_PENDING, |
| 3529 handle.Init("a", params_, DEFAULT_PRIORITY, | 3533 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3530 ClientSocketPool::RespectLimits::ENABLED, | 3534 ClientSocketPool::RespectLimits::ENABLED, |
| 3531 callback.callback(), pool_.get(), BoundNetLog())); | 3535 callback.callback(), pool_.get(), BoundNetLog())); |
| 3532 EXPECT_EQ(OK, callback.WaitForResult()); | 3536 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 3533 } | 3537 } |
| 3534 | 3538 |
| 3535 // Same as above, but the idle socket is in the same group as the stalled | 3539 // Same as above, but the idle socket is in the same group as the stalled |
| 3536 // socket, and closes the only other request in its group when closing requests | 3540 // socket, and closes the only other request in its group when closing requests |
| 3537 // in higher layered pools. This generally shouldn't happen, but it may be | 3541 // in higher layered pools. This generally shouldn't happen, but it may be |
| 3538 // possible if a higher level pool issues a request and the request is | 3542 // possible if a higher level pool issues a request and the request is |
| 3539 // subsequently cancelled. Even if it's not possible, best not to crash. | 3543 // subsequently cancelled. Even if it's not possible, best not to crash. |
| 3540 TEST_F(ClientSocketPoolBaseTest, | 3544 TEST_F(ClientSocketPoolBaseTest, |
| 3541 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { | 3545 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { |
| 3542 CreatePool(2, 2); | 3546 CreatePool(2, 2); |
| 3543 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3547 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3544 | 3548 |
| 3545 // Need a socket in another group for the pool to be stalled (If a group | 3549 // Need a socket in another group for the pool to be stalled (If a group |
| 3546 // has the maximum number of connections already, it's not stalled). | 3550 // has the maximum number of connections already, it's not stalled). |
| 3547 ClientSocketHandle handle1; | 3551 ClientSocketHandle handle1; |
| 3548 TestCompletionCallback callback1; | 3552 TestCompletionCallback callback1; |
| 3549 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, | 3553 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, |
| 3550 ClientSocketPool::RespectLimits::ENABLED, | 3554 ClientSocketPool::RespectLimits::ENABLED, |
| 3551 callback1.callback(), pool_.get(), BoundNetLog())); | 3555 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3552 | 3556 |
| 3553 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3557 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
| 3554 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3558 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk()); |
| 3555 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3559 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3556 .WillOnce(Invoke(&mock_layered_pool, | 3560 .WillOnce(Invoke(&mock_layered_pool, |
| 3557 &MockLayeredPool::ReleaseOneConnection)); | 3561 &MockLayeredPool::ReleaseOneConnection)); |
| 3558 ClientSocketHandle handle; | 3562 ClientSocketHandle handle; |
| 3559 TestCompletionCallback callback2; | 3563 TestCompletionCallback callback2; |
| 3560 EXPECT_EQ(ERR_IO_PENDING, | 3564 EXPECT_EQ(ERR_IO_PENDING, |
| 3561 handle.Init("group2", params_, DEFAULT_PRIORITY, | 3565 handle.Init("group2", params_, DEFAULT_PRIORITY, |
| 3562 ClientSocketPool::RespectLimits::ENABLED, | 3566 ClientSocketPool::RespectLimits::ENABLED, |
| 3563 callback2.callback(), pool_.get(), BoundNetLog())); | 3567 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3564 EXPECT_EQ(OK, callback2.WaitForResult()); | 3568 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 3565 } | 3569 } |
| 3566 | 3570 |
| 3567 // Tests the case when an idle socket can be closed when a new request is | 3571 // Tests the case when an idle socket can be closed when a new request is |
| 3568 // issued, and the new request belongs to a group that was previously stalled. | 3572 // issued, and the new request belongs to a group that was previously stalled. |
| 3569 TEST_F(ClientSocketPoolBaseTest, | 3573 TEST_F(ClientSocketPoolBaseTest, |
| 3570 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { | 3574 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { |
| 3571 CreatePool(2, 2); | 3575 CreatePool(2, 2); |
| 3572 std::list<TestConnectJob::JobType> job_types; | 3576 std::list<TestConnectJob::JobType> job_types; |
| 3573 job_types.push_back(TestConnectJob::kMockJob); | 3577 job_types.push_back(TestConnectJob::kMockJob); |
| 3574 job_types.push_back(TestConnectJob::kMockJob); | 3578 job_types.push_back(TestConnectJob::kMockJob); |
| 3575 job_types.push_back(TestConnectJob::kMockJob); | 3579 job_types.push_back(TestConnectJob::kMockJob); |
| 3576 job_types.push_back(TestConnectJob::kMockJob); | 3580 job_types.push_back(TestConnectJob::kMockJob); |
| 3577 connect_job_factory_->set_job_types(&job_types); | 3581 connect_job_factory_->set_job_types(&job_types); |
| 3578 | 3582 |
| 3579 ClientSocketHandle handle1; | 3583 ClientSocketHandle handle1; |
| 3580 TestCompletionCallback callback1; | 3584 TestCompletionCallback callback1; |
| 3581 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, | 3585 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, |
| 3582 ClientSocketPool::RespectLimits::ENABLED, | 3586 ClientSocketPool::RespectLimits::ENABLED, |
| 3583 callback1.callback(), pool_.get(), BoundNetLog())); | 3587 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3584 | 3588 |
| 3585 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3589 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
| 3586 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3590 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk()); |
| 3587 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3591 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3588 .WillRepeatedly(Invoke(&mock_layered_pool, | 3592 .WillRepeatedly(Invoke(&mock_layered_pool, |
| 3589 &MockLayeredPool::ReleaseOneConnection)); | 3593 &MockLayeredPool::ReleaseOneConnection)); |
| 3590 mock_layered_pool.set_can_release_connection(false); | 3594 mock_layered_pool.set_can_release_connection(false); |
| 3591 | 3595 |
| 3592 // The third request is made when the socket pool is in a stalled state. | 3596 // The third request is made when the socket pool is in a stalled state. |
| 3593 ClientSocketHandle handle3; | 3597 ClientSocketHandle handle3; |
| 3594 TestCompletionCallback callback3; | 3598 TestCompletionCallback callback3; |
| 3595 EXPECT_EQ(ERR_IO_PENDING, | 3599 EXPECT_EQ(ERR_IO_PENDING, |
| 3596 handle3.Init("group3", params_, DEFAULT_PRIORITY, | 3600 handle3.Init("group3", params_, DEFAULT_PRIORITY, |
| 3597 ClientSocketPool::RespectLimits::ENABLED, | 3601 ClientSocketPool::RespectLimits::ENABLED, |
| 3598 callback3.callback(), pool_.get(), BoundNetLog())); | 3602 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3599 | 3603 |
| 3600 base::RunLoop().RunUntilIdle(); | 3604 base::RunLoop().RunUntilIdle(); |
| 3601 EXPECT_FALSE(callback3.have_result()); | 3605 EXPECT_FALSE(callback3.have_result()); |
| 3602 | 3606 |
| 3603 // The fourth request is made when the pool is no longer stalled. The third | 3607 // The fourth request is made when the pool is no longer stalled. The third |
| 3604 // request should be serviced first, since it was issued first and has the | 3608 // request should be serviced first, since it was issued first and has the |
| 3605 // same priority. | 3609 // same priority. |
| 3606 mock_layered_pool.set_can_release_connection(true); | 3610 mock_layered_pool.set_can_release_connection(true); |
| 3607 ClientSocketHandle handle4; | 3611 ClientSocketHandle handle4; |
| 3608 TestCompletionCallback callback4; | 3612 TestCompletionCallback callback4; |
| 3609 EXPECT_EQ(ERR_IO_PENDING, | 3613 EXPECT_EQ(ERR_IO_PENDING, |
| 3610 handle4.Init("group3", params_, DEFAULT_PRIORITY, | 3614 handle4.Init("group3", params_, DEFAULT_PRIORITY, |
| 3611 ClientSocketPool::RespectLimits::ENABLED, | 3615 ClientSocketPool::RespectLimits::ENABLED, |
| 3612 callback4.callback(), pool_.get(), BoundNetLog())); | 3616 callback4.callback(), pool_.get(), BoundNetLog())); |
| 3613 EXPECT_EQ(OK, callback3.WaitForResult()); | 3617 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 3614 EXPECT_FALSE(callback4.have_result()); | 3618 EXPECT_FALSE(callback4.have_result()); |
| 3615 | 3619 |
| 3616 // Closing a handle should free up another socket slot. | 3620 // Closing a handle should free up another socket slot. |
| 3617 handle1.Reset(); | 3621 handle1.Reset(); |
| 3618 EXPECT_EQ(OK, callback4.WaitForResult()); | 3622 EXPECT_THAT(callback4.WaitForResult(), IsOk()); |
| 3619 } | 3623 } |
| 3620 | 3624 |
| 3621 // Tests the case when an idle socket can be closed when a new request is | 3625 // Tests the case when an idle socket can be closed when a new request is |
| 3622 // issued, and the new request belongs to a group that was previously stalled. | 3626 // issued, and the new request belongs to a group that was previously stalled. |
| 3623 // | 3627 // |
| 3624 // The two differences from the above test are that the stalled requests are not | 3628 // The two differences from the above test are that the stalled requests are not |
| 3625 // in the same group as the layered pool's request, and the the fourth request | 3629 // in the same group as the layered pool's request, and the the fourth request |
| 3626 // has a higher priority than the third one, so gets a socket first. | 3630 // has a higher priority than the third one, so gets a socket first. |
| 3627 TEST_F(ClientSocketPoolBaseTest, | 3631 TEST_F(ClientSocketPoolBaseTest, |
| 3628 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { | 3632 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { |
| 3629 CreatePool(2, 2); | 3633 CreatePool(2, 2); |
| 3630 std::list<TestConnectJob::JobType> job_types; | 3634 std::list<TestConnectJob::JobType> job_types; |
| 3631 job_types.push_back(TestConnectJob::kMockJob); | 3635 job_types.push_back(TestConnectJob::kMockJob); |
| 3632 job_types.push_back(TestConnectJob::kMockJob); | 3636 job_types.push_back(TestConnectJob::kMockJob); |
| 3633 job_types.push_back(TestConnectJob::kMockJob); | 3637 job_types.push_back(TestConnectJob::kMockJob); |
| 3634 job_types.push_back(TestConnectJob::kMockJob); | 3638 job_types.push_back(TestConnectJob::kMockJob); |
| 3635 connect_job_factory_->set_job_types(&job_types); | 3639 connect_job_factory_->set_job_types(&job_types); |
| 3636 | 3640 |
| 3637 ClientSocketHandle handle1; | 3641 ClientSocketHandle handle1; |
| 3638 TestCompletionCallback callback1; | 3642 TestCompletionCallback callback1; |
| 3639 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, | 3643 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, |
| 3640 ClientSocketPool::RespectLimits::ENABLED, | 3644 ClientSocketPool::RespectLimits::ENABLED, |
| 3641 callback1.callback(), pool_.get(), BoundNetLog())); | 3645 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3642 | 3646 |
| 3643 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3647 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
| 3644 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3648 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk()); |
| 3645 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3649 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3646 .WillRepeatedly(Invoke(&mock_layered_pool, | 3650 .WillRepeatedly(Invoke(&mock_layered_pool, |
| 3647 &MockLayeredPool::ReleaseOneConnection)); | 3651 &MockLayeredPool::ReleaseOneConnection)); |
| 3648 mock_layered_pool.set_can_release_connection(false); | 3652 mock_layered_pool.set_can_release_connection(false); |
| 3649 | 3653 |
| 3650 // The third request is made when the socket pool is in a stalled state. | 3654 // The third request is made when the socket pool is in a stalled state. |
| 3651 ClientSocketHandle handle3; | 3655 ClientSocketHandle handle3; |
| 3652 TestCompletionCallback callback3; | 3656 TestCompletionCallback callback3; |
| 3653 EXPECT_EQ(ERR_IO_PENDING, | 3657 EXPECT_EQ(ERR_IO_PENDING, |
| 3654 handle3.Init("group3", params_, MEDIUM, | 3658 handle3.Init("group3", params_, MEDIUM, |
| 3655 ClientSocketPool::RespectLimits::ENABLED, | 3659 ClientSocketPool::RespectLimits::ENABLED, |
| 3656 callback3.callback(), pool_.get(), BoundNetLog())); | 3660 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3657 | 3661 |
| 3658 base::RunLoop().RunUntilIdle(); | 3662 base::RunLoop().RunUntilIdle(); |
| 3659 EXPECT_FALSE(callback3.have_result()); | 3663 EXPECT_FALSE(callback3.have_result()); |
| 3660 | 3664 |
| 3661 // The fourth request is made when the pool is no longer stalled. This | 3665 // The fourth request is made when the pool is no longer stalled. This |
| 3662 // request has a higher priority than the third request, so is serviced first. | 3666 // request has a higher priority than the third request, so is serviced first. |
| 3663 mock_layered_pool.set_can_release_connection(true); | 3667 mock_layered_pool.set_can_release_connection(true); |
| 3664 ClientSocketHandle handle4; | 3668 ClientSocketHandle handle4; |
| 3665 TestCompletionCallback callback4; | 3669 TestCompletionCallback callback4; |
| 3666 EXPECT_EQ(ERR_IO_PENDING, | 3670 EXPECT_EQ(ERR_IO_PENDING, |
| 3667 handle4.Init("group3", params_, HIGHEST, | 3671 handle4.Init("group3", params_, HIGHEST, |
| 3668 ClientSocketPool::RespectLimits::ENABLED, | 3672 ClientSocketPool::RespectLimits::ENABLED, |
| 3669 callback4.callback(), pool_.get(), BoundNetLog())); | 3673 callback4.callback(), pool_.get(), BoundNetLog())); |
| 3670 EXPECT_EQ(OK, callback4.WaitForResult()); | 3674 EXPECT_THAT(callback4.WaitForResult(), IsOk()); |
| 3671 EXPECT_FALSE(callback3.have_result()); | 3675 EXPECT_FALSE(callback3.have_result()); |
| 3672 | 3676 |
| 3673 // Closing a handle should free up another socket slot. | 3677 // Closing a handle should free up another socket slot. |
| 3674 handle1.Reset(); | 3678 handle1.Reset(); |
| 3675 EXPECT_EQ(OK, callback3.WaitForResult()); | 3679 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
| 3676 } | 3680 } |
| 3677 | 3681 |
| 3678 TEST_F(ClientSocketPoolBaseTest, | 3682 TEST_F(ClientSocketPoolBaseTest, |
| 3679 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { | 3683 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { |
| 3680 CreatePool(1, 1); | 3684 CreatePool(1, 1); |
| 3681 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3685 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3682 | 3686 |
| 3683 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); | 3687 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); |
| 3684 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); | 3688 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk()); |
| 3685 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) | 3689 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) |
| 3686 .WillRepeatedly(Invoke(&mock_layered_pool1, | 3690 .WillRepeatedly(Invoke(&mock_layered_pool1, |
| 3687 &MockLayeredPool::ReleaseOneConnection)); | 3691 &MockLayeredPool::ReleaseOneConnection)); |
| 3688 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); | 3692 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); |
| 3689 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); | 3693 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()), |
| 3694 IsOk()); |
| 3690 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) | 3695 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) |
| 3691 .WillRepeatedly(Invoke(&mock_layered_pool2, | 3696 .WillRepeatedly(Invoke(&mock_layered_pool2, |
| 3692 &MockLayeredPool::ReleaseOneConnection)); | 3697 &MockLayeredPool::ReleaseOneConnection)); |
| 3693 ClientSocketHandle handle; | 3698 ClientSocketHandle handle; |
| 3694 TestCompletionCallback callback; | 3699 TestCompletionCallback callback; |
| 3695 EXPECT_EQ(ERR_IO_PENDING, | 3700 EXPECT_EQ(ERR_IO_PENDING, |
| 3696 handle.Init("a", params_, DEFAULT_PRIORITY, | 3701 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3697 ClientSocketPool::RespectLimits::ENABLED, | 3702 ClientSocketPool::RespectLimits::ENABLED, |
| 3698 callback.callback(), pool_.get(), BoundNetLog())); | 3703 callback.callback(), pool_.get(), BoundNetLog())); |
| 3699 EXPECT_EQ(OK, callback.WaitForResult()); | 3704 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 3700 } | 3705 } |
| 3701 | 3706 |
| 3702 // Test that when a socket pool and group are at their limits, a request | 3707 // Test that when a socket pool and group are at their limits, a request |
| 3703 // with RespectLimits::DISABLED triggers creation of a new socket, and gets the | 3708 // with RespectLimits::DISABLED triggers creation of a new socket, and gets the |
| 3704 // socket instead of a request with the same priority that was issued earlier, | 3709 // socket instead of a request with the same priority that was issued earlier, |
| 3705 // but has RespectLimits::ENABLED. | 3710 // but has RespectLimits::ENABLED. |
| 3706 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { | 3711 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { |
| 3707 CreatePool(1, 1); | 3712 CreatePool(1, 1); |
| 3708 | 3713 |
| 3709 // Issue a request to reach the socket pool limit. | 3714 // Issue a request to reach the socket pool limit. |
| 3710 EXPECT_EQ( | 3715 EXPECT_EQ( |
| 3711 OK, StartRequestWithIgnoreLimits( | 3716 OK, StartRequestWithIgnoreLimits( |
| 3712 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED)); | 3717 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED)); |
| 3713 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3718 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3714 | 3719 |
| 3715 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3720 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3716 | 3721 |
| 3717 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( | 3722 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 3718 "a", MAXIMUM_PRIORITY, | 3723 "a", MAXIMUM_PRIORITY, |
| 3719 ClientSocketPool::RespectLimits::ENABLED)); | 3724 ClientSocketPool::RespectLimits::ENABLED)); |
| 3720 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3725 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3721 | 3726 |
| 3722 // Issue a request that ignores the limits, so a new ConnectJob is | 3727 // Issue a request that ignores the limits, so a new ConnectJob is |
| 3723 // created. | 3728 // created. |
| 3724 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( | 3729 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 3725 "a", MAXIMUM_PRIORITY, | 3730 "a", MAXIMUM_PRIORITY, |
| 3726 ClientSocketPool::RespectLimits::DISABLED)); | 3731 ClientSocketPool::RespectLimits::DISABLED)); |
| 3727 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3732 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3728 | 3733 |
| 3729 EXPECT_EQ(OK, request(2)->WaitForResult()); | 3734 EXPECT_THAT(request(2)->WaitForResult(), IsOk()); |
| 3730 EXPECT_FALSE(request(1)->have_result()); | 3735 EXPECT_FALSE(request(1)->have_result()); |
| 3731 } | 3736 } |
| 3732 | 3737 |
| 3733 // Test that when a socket pool and group are at their limits, a ConnectJob | 3738 // Test that when a socket pool and group are at their limits, a ConnectJob |
| 3734 // issued for a request with RespectLimits::DISABLED is not cancelled when a | 3739 // issued for a request with RespectLimits::DISABLED is not cancelled when a |
| 3735 // request with RespectLimits::ENABLED issued to the same group is cancelled. | 3740 // request with RespectLimits::ENABLED issued to the same group is cancelled. |
| 3736 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { | 3741 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { |
| 3737 CreatePool(1, 1); | 3742 CreatePool(1, 1); |
| 3738 | 3743 |
| 3739 // Issue a request to reach the socket pool limit. | 3744 // Issue a request to reach the socket pool limit. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3754 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( | 3759 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 3755 "a", MAXIMUM_PRIORITY, | 3760 "a", MAXIMUM_PRIORITY, |
| 3756 ClientSocketPool::RespectLimits::DISABLED)); | 3761 ClientSocketPool::RespectLimits::DISABLED)); |
| 3757 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3762 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3758 | 3763 |
| 3759 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob | 3764 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob |
| 3760 // should not be cancelled. | 3765 // should not be cancelled. |
| 3761 request(1)->handle()->Reset(); | 3766 request(1)->handle()->Reset(); |
| 3762 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3767 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3763 | 3768 |
| 3764 EXPECT_EQ(OK, request(2)->WaitForResult()); | 3769 EXPECT_THAT(request(2)->WaitForResult(), IsOk()); |
| 3765 EXPECT_FALSE(request(1)->have_result()); | 3770 EXPECT_FALSE(request(1)->have_result()); |
| 3766 } | 3771 } |
| 3767 | 3772 |
| 3768 } // namespace | 3773 } // namespace |
| 3769 | 3774 |
| 3770 } // namespace net | 3775 } // namespace net |
| OLD | NEW |