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 |