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

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

Issue 51683002: [Net] Assert that URLRequests with LOAD_IGNORE_LIMITS have MAXIMUM_PRIORITY (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | net/url_request/url_fetcher_core.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/client_socket_pool_base.h" 5 #include "net/socket/client_socket_pool_base.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 27 matching lines...) Expand all
38 38
39 using ::testing::Invoke; 39 using ::testing::Invoke;
40 using ::testing::Return; 40 using ::testing::Return;
41 41
42 namespace net { 42 namespace net {
43 43
44 namespace { 44 namespace {
45 45
46 const int kDefaultMaxSockets = 4; 46 const int kDefaultMaxSockets = 4;
47 const int kDefaultMaxSocketsPerGroup = 2; 47 const int kDefaultMaxSocketsPerGroup = 2;
48 const net::RequestPriority kDefaultPriority = MEDIUM;
49 48
50 // Make sure |handle| sets load times correctly when it has been assigned a 49 // Make sure |handle| sets load times correctly when it has been assigned a
51 // reused socket. 50 // reused socket.
52 void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) { 51 void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
53 LoadTimingInfo load_timing_info; 52 LoadTimingInfo load_timing_info;
54 // Only pass true in as |is_reused|, as in general, HttpStream types should 53 // Only pass true in as |is_reused|, as in general, HttpStream types should
55 // have stricter concepts of reuse than socket pools. 54 // have stricter concepts of reuse than socket pools.
56 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info)); 55 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
57 56
58 EXPECT_EQ(true, load_timing_info.socket_reused); 57 EXPECT_EQ(true, load_timing_info.socket_reused);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 92
94 EXPECT_FALSE(load_timing_info.socket_reused); 93 EXPECT_FALSE(load_timing_info.socket_reused);
95 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 94 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
96 95
97 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 96 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
98 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 97 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
99 } 98 }
100 99
101 class TestSocketParams : public base::RefCounted<TestSocketParams> { 100 class TestSocketParams : public base::RefCounted<TestSocketParams> {
102 public: 101 public:
103 TestSocketParams() : ignore_limits_(false) {} 102 explicit TestSocketParams(bool ignore_limits)
103 : ignore_limits_(ignore_limits) {}
104 104
105 void set_ignore_limits(bool ignore_limits) {
106 ignore_limits_ = ignore_limits;
107 }
108 bool ignore_limits() { return ignore_limits_; } 105 bool ignore_limits() { return ignore_limits_; }
109 106
110 private: 107 private:
111 friend class base::RefCounted<TestSocketParams>; 108 friend class base::RefCounted<TestSocketParams>;
112 ~TestSocketParams() {} 109 ~TestSocketParams() {}
113 110
114 bool ignore_limits_; 111 const bool ignore_limits_;
115 }; 112 };
116 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; 113 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
117 114
118 class MockClientSocket : public StreamSocket { 115 class MockClientSocket : public StreamSocket {
119 public: 116 public:
120 explicit MockClientSocket(net::NetLog* net_log) 117 explicit MockClientSocket(net::NetLog* net_log)
121 : connected_(false), 118 : connected_(false),
122 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)), 119 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)),
123 was_used_to_convey_data_(false) { 120 was_used_to_convey_data_(false) {
124 } 121 }
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 655
659 private: 656 private:
660 bool have_result_; 657 bool have_result_;
661 bool waiting_for_result_; 658 bool waiting_for_result_;
662 int result_; 659 int result_;
663 }; 660 };
664 661
665 class ClientSocketPoolBaseTest : public testing::Test { 662 class ClientSocketPoolBaseTest : public testing::Test {
666 protected: 663 protected:
667 ClientSocketPoolBaseTest() 664 ClientSocketPoolBaseTest()
668 : params_(new TestSocketParams()), 665 : params_(new TestSocketParams(false /* ignore_limits */)),
669 histograms_("ClientSocketPoolTest") { 666 histograms_("ClientSocketPoolTest") {
670 connect_backup_jobs_enabled_ = 667 connect_backup_jobs_enabled_ =
671 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled(); 668 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
672 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true); 669 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
673 cleanup_timer_enabled_ = 670 cleanup_timer_enabled_ =
674 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled(); 671 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled();
675 } 672 }
676 673
677 virtual ~ClientSocketPoolBaseTest() { 674 virtual ~ClientSocketPoolBaseTest() {
678 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( 675 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 scoped_ptr<TestClientSocketPool> pool_; 740 scoped_ptr<TestClientSocketPool> pool_;
744 ClientSocketPoolTest test_base_; 741 ClientSocketPoolTest test_base_;
745 }; 742 };
746 743
747 // Even though a timeout is specified, it doesn't time out on a synchronous 744 // Even though a timeout is specified, it doesn't time out on a synchronous
748 // completion. 745 // completion.
749 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { 746 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
750 TestConnectJobDelegate delegate; 747 TestConnectJobDelegate delegate;
751 ClientSocketHandle ignored; 748 ClientSocketHandle ignored;
752 TestClientSocketPoolBase::Request request( 749 TestClientSocketPoolBase::Request request(
753 &ignored, CompletionCallback(), kDefaultPriority, 750 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
754 internal::ClientSocketPoolBaseHelper::NORMAL, 751 internal::ClientSocketPoolBaseHelper::NORMAL,
755 false, params_, BoundNetLog()); 752 false, params_, BoundNetLog());
756 scoped_ptr<TestConnectJob> job( 753 scoped_ptr<TestConnectJob> job(
757 new TestConnectJob(TestConnectJob::kMockJob, 754 new TestConnectJob(TestConnectJob::kMockJob,
758 "a", 755 "a",
759 request, 756 request,
760 base::TimeDelta::FromMicroseconds(1), 757 base::TimeDelta::FromMicroseconds(1),
761 &delegate, 758 &delegate,
762 &client_socket_factory_, 759 &client_socket_factory_,
763 NULL)); 760 NULL));
764 EXPECT_EQ(OK, job->Connect()); 761 EXPECT_EQ(OK, job->Connect());
765 } 762 }
766 763
767 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { 764 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
768 TestConnectJobDelegate delegate; 765 TestConnectJobDelegate delegate;
769 ClientSocketHandle ignored; 766 ClientSocketHandle ignored;
770 CapturingNetLog log; 767 CapturingNetLog log;
771 768
772 TestClientSocketPoolBase::Request request( 769 TestClientSocketPoolBase::Request request(
773 &ignored, CompletionCallback(), kDefaultPriority, 770 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
774 internal::ClientSocketPoolBaseHelper::NORMAL, 771 internal::ClientSocketPoolBaseHelper::NORMAL,
775 false, params_, BoundNetLog()); 772 false, params_, BoundNetLog());
776 // Deleted by TestConnectJobDelegate. 773 // Deleted by TestConnectJobDelegate.
777 TestConnectJob* job = 774 TestConnectJob* job =
778 new TestConnectJob(TestConnectJob::kMockPendingJob, 775 new TestConnectJob(TestConnectJob::kMockPendingJob,
779 "a", 776 "a",
780 request, 777 request,
781 base::TimeDelta::FromMicroseconds(1), 778 base::TimeDelta::FromMicroseconds(1),
782 &delegate, 779 &delegate,
783 &client_socket_factory_, 780 &client_socket_factory_,
(...skipping 26 matching lines...) Expand all
810 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 807 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
811 808
812 TestCompletionCallback callback; 809 TestCompletionCallback callback;
813 ClientSocketHandle handle; 810 ClientSocketHandle handle;
814 CapturingBoundNetLog log; 811 CapturingBoundNetLog log;
815 TestLoadTimingInfoNotConnected(handle); 812 TestLoadTimingInfoNotConnected(handle);
816 813
817 EXPECT_EQ(OK, 814 EXPECT_EQ(OK,
818 handle.Init("a", 815 handle.Init("a",
819 params_, 816 params_,
820 kDefaultPriority, 817 DEFAULT_PRIORITY,
821 callback.callback(), 818 callback.callback(),
822 pool_.get(), 819 pool_.get(),
823 log.bound())); 820 log.bound()));
824 EXPECT_TRUE(handle.is_initialized()); 821 EXPECT_TRUE(handle.is_initialized());
825 EXPECT_TRUE(handle.socket()); 822 EXPECT_TRUE(handle.socket());
826 TestLoadTimingInfoConnectedNotReused(handle); 823 TestLoadTimingInfoConnectedNotReused(handle);
827 824
828 handle.Reset(); 825 handle.Reset();
829 TestLoadTimingInfoNotConnected(handle); 826 TestLoadTimingInfoNotConnected(handle);
830 827
(...skipping 22 matching lines...) Expand all
853 ClientSocketHandle handle; 850 ClientSocketHandle handle;
854 TestCompletionCallback callback; 851 TestCompletionCallback callback;
855 // Set the additional error state members to ensure that they get cleared. 852 // Set the additional error state members to ensure that they get cleared.
856 handle.set_is_ssl_error(true); 853 handle.set_is_ssl_error(true);
857 HttpResponseInfo info; 854 HttpResponseInfo info;
858 info.headers = new HttpResponseHeaders(std::string()); 855 info.headers = new HttpResponseHeaders(std::string());
859 handle.set_ssl_error_response_info(info); 856 handle.set_ssl_error_response_info(info);
860 EXPECT_EQ(ERR_CONNECTION_FAILED, 857 EXPECT_EQ(ERR_CONNECTION_FAILED,
861 handle.Init("a", 858 handle.Init("a",
862 params_, 859 params_,
863 kDefaultPriority, 860 DEFAULT_PRIORITY,
864 callback.callback(), 861 callback.callback(),
865 pool_.get(), 862 pool_.get(),
866 log.bound())); 863 log.bound()));
867 EXPECT_FALSE(handle.socket()); 864 EXPECT_FALSE(handle.socket());
868 EXPECT_FALSE(handle.is_ssl_error()); 865 EXPECT_FALSE(handle.is_ssl_error());
869 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 866 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
870 TestLoadTimingInfoNotConnected(handle); 867 TestLoadTimingInfoNotConnected(handle);
871 868
872 CapturingNetLog::CapturedEntryList entries; 869 CapturingNetLog::CapturedEntryList entries;
873 log.GetEntries(&entries); 870 log.GetEntries(&entries);
874 871
875 EXPECT_EQ(3u, entries.size()); 872 EXPECT_EQ(3u, entries.size());
876 EXPECT_TRUE(LogContainsBeginEvent( 873 EXPECT_TRUE(LogContainsBeginEvent(
877 entries, 0, NetLog::TYPE_SOCKET_POOL)); 874 entries, 0, NetLog::TYPE_SOCKET_POOL));
878 EXPECT_TRUE(LogContainsEvent( 875 EXPECT_TRUE(LogContainsEvent(
879 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 876 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
880 NetLog::PHASE_NONE)); 877 NetLog::PHASE_NONE));
881 EXPECT_TRUE(LogContainsEndEvent( 878 EXPECT_TRUE(LogContainsEndEvent(
882 entries, 2, NetLog::TYPE_SOCKET_POOL)); 879 entries, 2, NetLog::TYPE_SOCKET_POOL));
883 } 880 }
884 881
885 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { 882 TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
886 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 883 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
887 884
888 // TODO(eroman): Check that the NetLog contains this event. 885 // TODO(eroman): Check that the NetLog contains this event.
889 886
890 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 887 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
891 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 888 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
892 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); 889 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY));
893 EXPECT_EQ(OK, StartRequest("d", kDefaultPriority)); 890 EXPECT_EQ(OK, StartRequest("d", DEFAULT_PRIORITY));
894 891
895 EXPECT_EQ(static_cast<int>(requests_size()), 892 EXPECT_EQ(static_cast<int>(requests_size()),
896 client_socket_factory_.allocation_count()); 893 client_socket_factory_.allocation_count());
897 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 894 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
898 895
899 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); 896 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY));
900 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", kDefaultPriority)); 897 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", DEFAULT_PRIORITY));
901 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", kDefaultPriority)); 898 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", DEFAULT_PRIORITY));
902 899
903 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 900 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
904 901
905 EXPECT_EQ(static_cast<int>(requests_size()), 902 EXPECT_EQ(static_cast<int>(requests_size()),
906 client_socket_factory_.allocation_count()); 903 client_socket_factory_.allocation_count());
907 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 904 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
908 905
909 EXPECT_EQ(1, GetOrderOfRequest(1)); 906 EXPECT_EQ(1, GetOrderOfRequest(1));
910 EXPECT_EQ(2, GetOrderOfRequest(2)); 907 EXPECT_EQ(2, GetOrderOfRequest(2));
911 EXPECT_EQ(3, GetOrderOfRequest(3)); 908 EXPECT_EQ(3, GetOrderOfRequest(3));
912 EXPECT_EQ(4, GetOrderOfRequest(4)); 909 EXPECT_EQ(4, GetOrderOfRequest(4));
913 EXPECT_EQ(5, GetOrderOfRequest(5)); 910 EXPECT_EQ(5, GetOrderOfRequest(5));
914 EXPECT_EQ(6, GetOrderOfRequest(6)); 911 EXPECT_EQ(6, GetOrderOfRequest(6));
915 EXPECT_EQ(7, GetOrderOfRequest(7)); 912 EXPECT_EQ(7, GetOrderOfRequest(7));
916 913
917 // Make sure we test order of all requests made. 914 // Make sure we test order of all requests made.
918 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 915 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
919 } 916 }
920 917
921 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { 918 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
922 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 919 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
923 920
924 // TODO(eroman): Check that the NetLog contains this event. 921 // TODO(eroman): Check that the NetLog contains this event.
925 922
926 // Reach all limits: max total sockets, and max sockets per group. 923 // Reach all limits: max total sockets, and max sockets per group.
927 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 924 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
928 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 925 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
929 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 926 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
930 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 927 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
931 928
932 EXPECT_EQ(static_cast<int>(requests_size()), 929 EXPECT_EQ(static_cast<int>(requests_size()),
933 client_socket_factory_.allocation_count()); 930 client_socket_factory_.allocation_count());
934 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 931 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
935 932
936 // Now create a new group and verify that we don't starve it. 933 // Now create a new group and verify that we don't starve it.
937 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 934 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY));
938 935
939 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 936 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
940 937
941 EXPECT_EQ(static_cast<int>(requests_size()), 938 EXPECT_EQ(static_cast<int>(requests_size()),
942 client_socket_factory_.allocation_count()); 939 client_socket_factory_.allocation_count());
943 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 940 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
944 941
945 EXPECT_EQ(1, GetOrderOfRequest(1)); 942 EXPECT_EQ(1, GetOrderOfRequest(1));
946 EXPECT_EQ(2, GetOrderOfRequest(2)); 943 EXPECT_EQ(2, GetOrderOfRequest(2));
947 EXPECT_EQ(3, GetOrderOfRequest(3)); 944 EXPECT_EQ(3, GetOrderOfRequest(3));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1023 EXPECT_EQ(7, GetOrderOfRequest(7)); 1020 EXPECT_EQ(7, GetOrderOfRequest(7));
1024 1021
1025 // Make sure we test order of all requests made. 1022 // Make sure we test order of all requests made.
1026 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 1023 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
1027 } 1024 }
1028 1025
1029 // Make sure that we count connecting sockets against the total limit. 1026 // Make sure that we count connecting sockets against the total limit.
1030 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { 1027 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1031 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1028 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1032 1029
1033 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1030 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1034 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 1031 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
1035 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); 1032 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY));
1036 1033
1037 // Create one asynchronous request. 1034 // Create one asynchronous request.
1038 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1035 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1039 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority)); 1036 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", DEFAULT_PRIORITY));
1040 1037
1041 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 1038 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1042 // actually become pending until 2ms after they have been created. In order 1039 // actually become pending until 2ms after they have been created. In order
1043 // to flush all tasks, we need to wait so that we know there are no 1040 // to flush all tasks, we need to wait so that we know there are no
1044 // soon-to-be-pending tasks waiting. 1041 // soon-to-be-pending tasks waiting.
1045 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 1042 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
1046 base::MessageLoop::current()->RunUntilIdle(); 1043 base::MessageLoop::current()->RunUntilIdle();
1047 1044
1048 // The next synchronous request should wait for its turn. 1045 // The next synchronous request should wait for its turn.
1049 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1046 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1050 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); 1047 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY));
1051 1048
1052 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1049 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1053 1050
1054 EXPECT_EQ(static_cast<int>(requests_size()), 1051 EXPECT_EQ(static_cast<int>(requests_size()),
1055 client_socket_factory_.allocation_count()); 1052 client_socket_factory_.allocation_count());
1056 1053
1057 EXPECT_EQ(1, GetOrderOfRequest(1)); 1054 EXPECT_EQ(1, GetOrderOfRequest(1));
1058 EXPECT_EQ(2, GetOrderOfRequest(2)); 1055 EXPECT_EQ(2, GetOrderOfRequest(2));
1059 EXPECT_EQ(3, GetOrderOfRequest(3)); 1056 EXPECT_EQ(3, GetOrderOfRequest(3));
1060 EXPECT_EQ(4, GetOrderOfRequest(4)); 1057 EXPECT_EQ(4, GetOrderOfRequest(4));
1061 EXPECT_EQ(5, GetOrderOfRequest(5)); 1058 EXPECT_EQ(5, GetOrderOfRequest(5));
1062 1059
1063 // Make sure we test order of all requests made. 1060 // Make sure we test order of all requests made.
1064 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); 1061 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
1065 } 1062 }
1066 1063
1067 TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) { 1064 TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1068 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 1065 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1069 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1066 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1070 1067
1071 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1068 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1072 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1069 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1073 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1070 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1074 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1071 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1075 1072
1076 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1073 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1077 1074
1078 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1075 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1079 1076
1080 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", kDefaultPriority)); 1077 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", DEFAULT_PRIORITY));
1081 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 1078 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY));
1082 1079
1083 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1080 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1084 1081
1085 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1082 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1086 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 1083 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1087 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1084 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1088 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); 1085 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1089 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1086 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1090 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1087 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1091 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); 1088 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1092 } 1089 }
1093 1090
1094 TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) { 1091 TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1095 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 1092 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1096 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1093 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1097 1094
1098 ClientSocketHandle handle; 1095 ClientSocketHandle handle;
1099 TestCompletionCallback callback; 1096 TestCompletionCallback callback;
1100 EXPECT_EQ(ERR_IO_PENDING, 1097 EXPECT_EQ(ERR_IO_PENDING,
1101 handle.Init("a", 1098 handle.Init("a",
1102 params_, 1099 params_,
1103 kDefaultPriority, 1100 DEFAULT_PRIORITY,
1104 callback.callback(), 1101 callback.callback(),
1105 pool_.get(), 1102 pool_.get(),
1106 BoundNetLog())); 1103 BoundNetLog()));
1107 1104
1108 ClientSocketHandle handles[4]; 1105 ClientSocketHandle handles[4];
1109 for (size_t i = 0; i < arraysize(handles); ++i) { 1106 for (size_t i = 0; i < arraysize(handles); ++i) {
1110 TestCompletionCallback callback; 1107 TestCompletionCallback callback;
1111 EXPECT_EQ(ERR_IO_PENDING, 1108 EXPECT_EQ(ERR_IO_PENDING,
1112 handles[i].Init("b", 1109 handles[i].Init("b",
1113 params_, 1110 params_,
1114 kDefaultPriority, 1111 DEFAULT_PRIORITY,
1115 callback.callback(), 1112 callback.callback(),
1116 pool_.get(), 1113 pool_.get(),
1117 BoundNetLog())); 1114 BoundNetLog()));
1118 } 1115 }
1119 1116
1120 // One will be stalled, cancel all the handles now. 1117 // One will be stalled, cancel all the handles now.
1121 // This should hit the OnAvailableSocketSlot() code where we previously had 1118 // This should hit the OnAvailableSocketSlot() code where we previously had
1122 // stalled groups, but no longer have any. 1119 // stalled groups, but no longer have any.
1123 for (size_t i = 0; i < arraysize(handles); ++i) 1120 for (size_t i = 0; i < arraysize(handles); ++i)
1124 handles[i].Reset(); 1121 handles[i].Reset();
1125 } 1122 }
1126 1123
1127 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { 1124 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
1128 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1125 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1129 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1126 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1130 1127
1131 { 1128 {
1132 ClientSocketHandle handles[kDefaultMaxSockets]; 1129 ClientSocketHandle handles[kDefaultMaxSockets];
1133 TestCompletionCallback callbacks[kDefaultMaxSockets]; 1130 TestCompletionCallback callbacks[kDefaultMaxSockets];
1134 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1131 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1135 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), 1132 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i),
1136 params_, 1133 params_,
1137 kDefaultPriority, 1134 DEFAULT_PRIORITY,
1138 callbacks[i].callback(), 1135 callbacks[i].callback(),
1139 pool_.get(), 1136 pool_.get(),
1140 BoundNetLog())); 1137 BoundNetLog()));
1141 } 1138 }
1142 1139
1143 // Force a stalled group. 1140 // Force a stalled group.
1144 ClientSocketHandle stalled_handle; 1141 ClientSocketHandle stalled_handle;
1145 TestCompletionCallback callback; 1142 TestCompletionCallback callback;
1146 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1143 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo",
1147 params_, 1144 params_,
1148 kDefaultPriority, 1145 DEFAULT_PRIORITY,
1149 callback.callback(), 1146 callback.callback(),
1150 pool_.get(), 1147 pool_.get(),
1151 BoundNetLog())); 1148 BoundNetLog()));
1152 1149
1153 // Cancel the stalled request. 1150 // Cancel the stalled request.
1154 stalled_handle.Reset(); 1151 stalled_handle.Reset();
1155 1152
1156 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1153 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1157 EXPECT_EQ(0, pool_->IdleSocketCount()); 1154 EXPECT_EQ(0, pool_->IdleSocketCount());
1158 1155
1159 // Dropping out of scope will close all handles and return them to idle. 1156 // Dropping out of scope will close all handles and return them to idle.
1160 } 1157 }
1161 1158
1162 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1159 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1163 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); 1160 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
1164 } 1161 }
1165 1162
1166 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { 1163 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1167 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1164 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1168 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1165 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1169 1166
1170 { 1167 {
1171 ClientSocketHandle handles[kDefaultMaxSockets]; 1168 ClientSocketHandle handles[kDefaultMaxSockets];
1172 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1169 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1173 TestCompletionCallback callback; 1170 TestCompletionCallback callback;
1174 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), 1171 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i),
1175 params_, 1172 params_,
1176 kDefaultPriority, 1173 DEFAULT_PRIORITY,
1177 callback.callback(), 1174 callback.callback(),
1178 pool_.get(), 1175 pool_.get(),
1179 BoundNetLog())); 1176 BoundNetLog()));
1180 } 1177 }
1181 1178
1182 // Force a stalled group. 1179 // Force a stalled group.
1183 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1180 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1184 ClientSocketHandle stalled_handle; 1181 ClientSocketHandle stalled_handle;
1185 TestCompletionCallback callback; 1182 TestCompletionCallback callback;
1186 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1183 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo",
1187 params_, 1184 params_,
1188 kDefaultPriority, 1185 DEFAULT_PRIORITY,
1189 callback.callback(), 1186 callback.callback(),
1190 pool_.get(), 1187 pool_.get(),
1191 BoundNetLog())); 1188 BoundNetLog()));
1192 1189
1193 // Since it is stalled, it should have no connect jobs. 1190 // Since it is stalled, it should have no connect jobs.
1194 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); 1191 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
1195 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); 1192 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
1196 1193
1197 // Cancel the stalled request. 1194 // Cancel the stalled request.
1198 handles[0].Reset(); 1195 handles[0].Reset();
(...skipping 24 matching lines...) Expand all
1223 ClientSocketHandle stalled_handle; 1220 ClientSocketHandle stalled_handle;
1224 TestCompletionCallback callback; 1221 TestCompletionCallback callback;
1225 { 1222 {
1226 EXPECT_FALSE(pool_->IsStalled()); 1223 EXPECT_FALSE(pool_->IsStalled());
1227 ClientSocketHandle handles[kDefaultMaxSockets]; 1224 ClientSocketHandle handles[kDefaultMaxSockets];
1228 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1225 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1229 TestCompletionCallback callback; 1226 TestCompletionCallback callback;
1230 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf( 1227 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf(
1231 "Take 2: %d", i), 1228 "Take 2: %d", i),
1232 params_, 1229 params_,
1233 kDefaultPriority, 1230 DEFAULT_PRIORITY,
1234 callback.callback(), 1231 callback.callback(),
1235 pool_.get(), 1232 pool_.get(),
1236 BoundNetLog())); 1233 BoundNetLog()));
1237 } 1234 }
1238 1235
1239 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1236 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1240 EXPECT_EQ(0, pool_->IdleSocketCount()); 1237 EXPECT_EQ(0, pool_->IdleSocketCount());
1241 EXPECT_FALSE(pool_->IsStalled()); 1238 EXPECT_FALSE(pool_->IsStalled());
1242 1239
1243 // Now we will hit the socket limit. 1240 // Now we will hit the socket limit.
1244 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1241 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo",
1245 params_, 1242 params_,
1246 kDefaultPriority, 1243 DEFAULT_PRIORITY,
1247 callback.callback(), 1244 callback.callback(),
1248 pool_.get(), 1245 pool_.get(),
1249 BoundNetLog())); 1246 BoundNetLog()));
1250 EXPECT_TRUE(pool_->IsStalled()); 1247 EXPECT_TRUE(pool_->IsStalled());
1251 1248
1252 // Dropping out of scope will close all handles and return them to idle. 1249 // Dropping out of scope will close all handles and return them to idle.
1253 } 1250 }
1254 1251
1255 // But if we wait for it, the released idle sockets will be closed in 1252 // But if we wait for it, the released idle sockets will be closed in
1256 // preference of the waiting request. 1253 // preference of the waiting request.
1257 EXPECT_EQ(OK, callback.WaitForResult()); 1254 EXPECT_EQ(OK, callback.WaitForResult());
1258 1255
1259 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 1256 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1260 EXPECT_EQ(3, pool_->IdleSocketCount()); 1257 EXPECT_EQ(3, pool_->IdleSocketCount());
1261 } 1258 }
1262 1259
1263 // Regression test for http://crbug.com/40952. 1260 // Regression test for http://crbug.com/40952.
1264 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { 1261 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1265 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1262 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1266 pool_->EnableConnectBackupJobs(); 1263 pool_->EnableConnectBackupJobs();
1267 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1264 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1268 1265
1269 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1266 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1270 ClientSocketHandle handle; 1267 ClientSocketHandle handle;
1271 TestCompletionCallback callback; 1268 TestCompletionCallback callback;
1272 EXPECT_EQ(OK, handle.Init(base::IntToString(i), 1269 EXPECT_EQ(OK, handle.Init(base::IntToString(i),
1273 params_, 1270 params_,
1274 kDefaultPriority, 1271 DEFAULT_PRIORITY,
1275 callback.callback(), 1272 callback.callback(),
1276 pool_.get(), 1273 pool_.get(),
1277 BoundNetLog())); 1274 BoundNetLog()));
1278 } 1275 }
1279 1276
1280 // Flush all the DoReleaseSocket tasks. 1277 // Flush all the DoReleaseSocket tasks.
1281 base::MessageLoop::current()->RunUntilIdle(); 1278 base::MessageLoop::current()->RunUntilIdle();
1282 1279
1283 // Stall a group. Set a pending job so it'll trigger a backup job if we don't 1280 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1284 // reuse a socket. 1281 // reuse a socket.
1285 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1282 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1286 ClientSocketHandle handle; 1283 ClientSocketHandle handle;
1287 TestCompletionCallback callback; 1284 TestCompletionCallback callback;
1288 1285
1289 // "0" is special here, since it should be the first entry in the sorted map, 1286 // "0" is special here, since it should be the first entry in the sorted map,
1290 // which is the one which we would close an idle socket for. We shouldn't 1287 // which is the one which we would close an idle socket for. We shouldn't
1291 // close an idle socket though, since we should reuse the idle socket. 1288 // close an idle socket though, since we should reuse the idle socket.
1292 EXPECT_EQ(OK, handle.Init("0", 1289 EXPECT_EQ(OK, handle.Init("0",
1293 params_, 1290 params_,
1294 kDefaultPriority, 1291 DEFAULT_PRIORITY,
1295 callback.callback(), 1292 callback.callback(),
1296 pool_.get(), 1293 pool_.get(),
1297 BoundNetLog())); 1294 BoundNetLog()));
1298 1295
1299 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1296 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1300 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); 1297 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1301 } 1298 }
1302 1299
1303 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { 1300 TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
1304 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1301 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1305 1302
1306 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1303 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1307 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1304 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1308 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); 1305 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE));
1309 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1306 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1310 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1307 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1311 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1308 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1312 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1309 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1313 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1310 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1314 1311
1315 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 1312 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
1316 1313
1317 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1314 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
(...skipping 10 matching lines...) Expand all
1328 EXPECT_EQ(5, GetOrderOfRequest(7)); 1325 EXPECT_EQ(5, GetOrderOfRequest(7));
1329 EXPECT_EQ(7, GetOrderOfRequest(8)); 1326 EXPECT_EQ(7, GetOrderOfRequest(8));
1330 1327
1331 // Make sure we test order of all requests made. 1328 // Make sure we test order of all requests made.
1332 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); 1329 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
1333 } 1330 }
1334 1331
1335 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { 1332 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
1336 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1333 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1337 1334
1338 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1335 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1339 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1336 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1340 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1337 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1341 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1338 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1342 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1339 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1343 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1340 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1344 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1341 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1345 1342
1346 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1343 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1347 1344
1348 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) 1345 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
1349 EXPECT_EQ(OK, request(i)->WaitForResult()); 1346 EXPECT_EQ(OK, request(i)->WaitForResult());
1350 1347
1351 EXPECT_EQ(static_cast<int>(requests_size()), 1348 EXPECT_EQ(static_cast<int>(requests_size()),
1352 client_socket_factory_.allocation_count()); 1349 client_socket_factory_.allocation_count());
1353 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1350 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1354 completion_count()); 1351 completion_count());
1355 } 1352 }
1356 1353
1357 // This test will start up a RequestSocket() and then immediately Cancel() it. 1354 // This test will start up a RequestSocket() and then immediately Cancel() it.
1358 // The pending connect job will be cancelled and should not call back into 1355 // The pending connect job will be cancelled and should not call back into
1359 // ClientSocketPoolBase. 1356 // ClientSocketPoolBase.
1360 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { 1357 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
1361 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1362 1359
1363 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1360 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1364 ClientSocketHandle handle; 1361 ClientSocketHandle handle;
1365 TestCompletionCallback callback; 1362 TestCompletionCallback callback;
1366 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1363 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
1367 params_, 1364 params_,
1368 kDefaultPriority, 1365 DEFAULT_PRIORITY,
1369 callback.callback(), 1366 callback.callback(),
1370 pool_.get(), 1367 pool_.get(),
1371 BoundNetLog())); 1368 BoundNetLog()));
1372 handle.Reset(); 1369 handle.Reset();
1373 } 1370 }
1374 1371
1375 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { 1372 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
1376 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1373 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1377 1374
1378 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1375 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1379 ClientSocketHandle handle; 1376 ClientSocketHandle handle;
1380 TestCompletionCallback callback; 1377 TestCompletionCallback callback;
1381 1378
1382 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1379 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
1383 params_, 1380 params_,
1384 kDefaultPriority, 1381 DEFAULT_PRIORITY,
1385 callback.callback(), 1382 callback.callback(),
1386 pool_.get(), 1383 pool_.get(),
1387 BoundNetLog())); 1384 BoundNetLog()));
1388 1385
1389 handle.Reset(); 1386 handle.Reset();
1390 1387
1391 TestCompletionCallback callback2; 1388 TestCompletionCallback callback2;
1392 EXPECT_EQ(ERR_IO_PENDING, 1389 EXPECT_EQ(ERR_IO_PENDING,
1393 handle.Init("a", 1390 handle.Init("a",
1394 params_, 1391 params_,
1395 kDefaultPriority, 1392 DEFAULT_PRIORITY,
1396 callback2.callback(), 1393 callback2.callback(),
1397 pool_.get(), 1394 pool_.get(),
1398 BoundNetLog())); 1395 BoundNetLog()));
1399 1396
1400 EXPECT_EQ(OK, callback2.WaitForResult()); 1397 EXPECT_EQ(OK, callback2.WaitForResult());
1401 EXPECT_FALSE(callback.have_result()); 1398 EXPECT_FALSE(callback.have_result());
1402 1399
1403 handle.Reset(); 1400 handle.Reset();
1404 } 1401 }
1405 1402
1406 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { 1403 TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
1407 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1404 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1408 1405
1409 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1406 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1410 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1407 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1411 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1408 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1412 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1409 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
1413 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1410 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
1414 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1411 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
1415 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1412 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
1416 1413
1417 // Cancel a request. 1414 // Cancel a request.
1418 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2; 1415 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
1419 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); 1416 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1420 (*requests())[index_to_cancel]->handle()->Reset(); 1417 (*requests())[index_to_cancel]->handle()->Reset();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1473 { 1470 {
1474 // TODO: Resolve conflicting intentions of stopping recursion with the 1471 // TODO: Resolve conflicting intentions of stopping recursion with the
1475 // |!within_callback_| test (above) and the call to |RunUntilIdle()| 1472 // |!within_callback_| test (above) and the call to |RunUntilIdle()|
1476 // below. http://crbug.com/114130. 1473 // below. http://crbug.com/114130.
1477 base::MessageLoop::ScopedNestableTaskAllower allow( 1474 base::MessageLoop::ScopedNestableTaskAllower allow(
1478 base::MessageLoop::current()); 1475 base::MessageLoop::current());
1479 base::MessageLoop::current()->RunUntilIdle(); 1476 base::MessageLoop::current()->RunUntilIdle();
1480 } 1477 }
1481 within_callback_ = true; 1478 within_callback_ = true;
1482 TestCompletionCallback next_job_callback; 1479 TestCompletionCallback next_job_callback;
1483 scoped_refptr<TestSocketParams> params(new TestSocketParams()); 1480 scoped_refptr<TestSocketParams> params(
1481 new TestSocketParams(false /* ignore_limits */));
1484 int rv = handle_->Init("a", 1482 int rv = handle_->Init("a",
1485 params, 1483 params,
1486 kDefaultPriority, 1484 DEFAULT_PRIORITY,
1487 next_job_callback.callback(), 1485 next_job_callback.callback(),
1488 pool_, 1486 pool_,
1489 BoundNetLog()); 1487 BoundNetLog());
1490 switch (next_job_type_) { 1488 switch (next_job_type_) {
1491 case TestConnectJob::kMockJob: 1489 case TestConnectJob::kMockJob:
1492 EXPECT_EQ(OK, rv); 1490 EXPECT_EQ(OK, rv);
1493 break; 1491 break;
1494 case TestConnectJob::kMockPendingJob: 1492 case TestConnectJob::kMockPendingJob:
1495 EXPECT_EQ(ERR_IO_PENDING, rv); 1493 EXPECT_EQ(ERR_IO_PENDING, rv);
1496 1494
(...skipping 28 matching lines...) Expand all
1525 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { 1523 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
1526 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1524 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1527 1525
1528 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1526 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1529 ClientSocketHandle handle; 1527 ClientSocketHandle handle;
1530 RequestSocketCallback callback( 1528 RequestSocketCallback callback(
1531 &handle, pool_.get(), connect_job_factory_, 1529 &handle, pool_.get(), connect_job_factory_,
1532 TestConnectJob::kMockPendingJob); 1530 TestConnectJob::kMockPendingJob);
1533 int rv = handle.Init("a", 1531 int rv = handle.Init("a",
1534 params_, 1532 params_,
1535 kDefaultPriority, 1533 DEFAULT_PRIORITY,
1536 callback.callback(), 1534 callback.callback(),
1537 pool_.get(), 1535 pool_.get(),
1538 BoundNetLog()); 1536 BoundNetLog());
1539 ASSERT_EQ(ERR_IO_PENDING, rv); 1537 ASSERT_EQ(ERR_IO_PENDING, rv);
1540 1538
1541 EXPECT_EQ(OK, callback.WaitForResult()); 1539 EXPECT_EQ(OK, callback.WaitForResult());
1542 } 1540 }
1543 1541
1544 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { 1542 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
1545 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1543 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1546 1544
1547 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1545 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1548 ClientSocketHandle handle; 1546 ClientSocketHandle handle;
1549 RequestSocketCallback callback( 1547 RequestSocketCallback callback(
1550 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob); 1548 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob);
1551 int rv = handle.Init("a", 1549 int rv = handle.Init("a",
1552 params_, 1550 params_,
1553 kDefaultPriority, 1551 DEFAULT_PRIORITY,
1554 callback.callback(), 1552 callback.callback(),
1555 pool_.get(), 1553 pool_.get(),
1556 BoundNetLog()); 1554 BoundNetLog());
1557 ASSERT_EQ(ERR_IO_PENDING, rv); 1555 ASSERT_EQ(ERR_IO_PENDING, rv);
1558 1556
1559 EXPECT_EQ(OK, callback.WaitForResult()); 1557 EXPECT_EQ(OK, callback.WaitForResult());
1560 } 1558 }
1561 1559
1562 // Make sure that pending requests get serviced after active requests get 1560 // Make sure that pending requests get serviced after active requests get
1563 // cancelled. 1561 // cancelled.
1564 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { 1562 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
1565 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1563 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1566 1564
1567 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1565 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1568 1566
1569 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1567 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1570 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1568 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1571 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1569 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1572 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1570 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1573 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1571 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1574 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1572 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1575 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1573 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1576 1574
1577 // Now, kDefaultMaxSocketsPerGroup requests should be active. 1575 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1578 // Let's cancel them. 1576 // Let's cancel them.
1579 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) { 1577 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
1580 ASSERT_FALSE(request(i)->handle()->is_initialized()); 1578 ASSERT_FALSE(request(i)->handle()->is_initialized());
1581 request(i)->handle()->Reset(); 1579 request(i)->handle()->Reset();
1582 } 1580 }
1583 1581
1584 // Let's wait for the rest to complete now. 1582 // Let's wait for the rest to complete now.
1585 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { 1583 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
(...skipping 10 matching lines...) Expand all
1596 const size_t kMaxSockets = 5; 1594 const size_t kMaxSockets = 5;
1597 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); 1595 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
1598 1596
1599 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1597 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1600 1598
1601 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; 1599 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1602 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. 1600 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
1603 1601
1604 // Queue up all the requests 1602 // Queue up all the requests
1605 for (size_t i = 0; i < kNumberOfRequests; ++i) 1603 for (size_t i = 0; i < kNumberOfRequests; ++i)
1606 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1604 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1607 1605
1608 for (size_t i = 0; i < kNumberOfRequests; ++i) 1606 for (size_t i = 0; i < kNumberOfRequests; ++i)
1609 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); 1607 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult());
1610 } 1608 }
1611 1609
1612 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { 1610 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
1613 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1611 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1614 1612
1615 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1616 1614
1617 ClientSocketHandle handle; 1615 ClientSocketHandle handle;
1618 TestCompletionCallback callback; 1616 TestCompletionCallback callback;
1619 int rv = handle.Init("a", 1617 int rv = handle.Init("a",
1620 params_, 1618 params_,
1621 kDefaultPriority, 1619 DEFAULT_PRIORITY,
1622 callback.callback(), 1620 callback.callback(),
1623 pool_.get(), 1621 pool_.get(),
1624 BoundNetLog()); 1622 BoundNetLog());
1625 EXPECT_EQ(ERR_IO_PENDING, rv); 1623 EXPECT_EQ(ERR_IO_PENDING, rv);
1626 1624
1627 // Cancel the active request. 1625 // Cancel the active request.
1628 handle.Reset(); 1626 handle.Reset();
1629 1627
1630 rv = handle.Init("a", 1628 rv = handle.Init("a",
1631 params_, 1629 params_,
1632 kDefaultPriority, 1630 DEFAULT_PRIORITY,
1633 callback.callback(), 1631 callback.callback(),
1634 pool_.get(), 1632 pool_.get(),
1635 BoundNetLog()); 1633 BoundNetLog());
1636 EXPECT_EQ(ERR_IO_PENDING, rv); 1634 EXPECT_EQ(ERR_IO_PENDING, rv);
1637 EXPECT_EQ(OK, callback.WaitForResult()); 1635 EXPECT_EQ(OK, callback.WaitForResult());
1638 1636
1639 EXPECT_FALSE(handle.is_reused()); 1637 EXPECT_FALSE(handle.is_reused());
1640 TestLoadTimingInfoConnectedNotReused(handle); 1638 TestLoadTimingInfoConnectedNotReused(handle);
1641 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 1639 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1642 } 1640 }
1643 1641
1644 // Regression test for http://crbug.com/17985. 1642 // Regression test for http://crbug.com/17985.
1645 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { 1643 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1646 const int kMaxSockets = 3; 1644 const int kMaxSockets = 3;
1647 const int kMaxSocketsPerGroup = 2; 1645 const int kMaxSocketsPerGroup = 2;
1648 CreatePool(kMaxSockets, kMaxSocketsPerGroup); 1646 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1649 1647
1650 const RequestPriority kHighPriority = HIGHEST; 1648 const RequestPriority kHighPriority = HIGHEST;
1651 1649
1652 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1650 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1653 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1651 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
1654 1652
1655 // This is going to be a pending request in an otherwise empty group. 1653 // This is going to be a pending request in an otherwise empty group.
1656 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1654 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
1657 1655
1658 // Reach the maximum socket limit. 1656 // Reach the maximum socket limit.
1659 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 1657 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
1660 1658
1661 // Create a stalled group with high priorities. 1659 // Create a stalled group with high priorities.
1662 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1660 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1663 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1661 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority));
1664 1662
1665 // Release the first two sockets from "a". Because this is a keepalive, 1663 // Release the first two sockets from "a". Because this is a keepalive,
1666 // the first release will unblock the pending request for "a". The 1664 // the first release will unblock the pending request for "a". The
1667 // second release will unblock a request for "c", becaue it is the next 1665 // second release will unblock a request for "c", becaue it is the next
1668 // high priority socket. 1666 // high priority socket.
1669 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1667 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 ClientSocketHandle handle; 1725 ClientSocketHandle handle;
1728 TestCompletionCallback callback; 1726 TestCompletionCallback callback;
1729 CapturingBoundNetLog log; 1727 CapturingBoundNetLog log;
1730 // Set the additional error state members to ensure that they get cleared. 1728 // Set the additional error state members to ensure that they get cleared.
1731 handle.set_is_ssl_error(true); 1729 handle.set_is_ssl_error(true);
1732 HttpResponseInfo info; 1730 HttpResponseInfo info;
1733 info.headers = new HttpResponseHeaders(std::string()); 1731 info.headers = new HttpResponseHeaders(std::string());
1734 handle.set_ssl_error_response_info(info); 1732 handle.set_ssl_error_response_info(info);
1735 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1733 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
1736 params_, 1734 params_,
1737 kDefaultPriority, 1735 DEFAULT_PRIORITY,
1738 callback.callback(), 1736 callback.callback(),
1739 pool_.get(), 1737 pool_.get(),
1740 log.bound())); 1738 log.bound()));
1741 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1739 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
1742 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 1740 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
1743 EXPECT_FALSE(handle.is_ssl_error()); 1741 EXPECT_FALSE(handle.is_ssl_error());
1744 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 1742 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
1745 1743
1746 CapturingNetLog::CapturedEntryList entries; 1744 CapturingNetLog::CapturedEntryList entries;
1747 log.GetEntries(&entries); 1745 log.GetEntries(&entries);
(...skipping 15 matching lines...) Expand all
1763 1761
1764 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1762 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1765 ClientSocketHandle handle; 1763 ClientSocketHandle handle;
1766 TestCompletionCallback callback; 1764 TestCompletionCallback callback;
1767 ClientSocketHandle handle2; 1765 ClientSocketHandle handle2;
1768 TestCompletionCallback callback2; 1766 TestCompletionCallback callback2;
1769 1767
1770 EXPECT_EQ(ERR_IO_PENDING, 1768 EXPECT_EQ(ERR_IO_PENDING,
1771 handle.Init("a", 1769 handle.Init("a",
1772 params_, 1770 params_,
1773 kDefaultPriority, 1771 DEFAULT_PRIORITY,
1774 callback.callback(), 1772 callback.callback(),
1775 pool_.get(), 1773 pool_.get(),
1776 BoundNetLog())); 1774 BoundNetLog()));
1777 CapturingBoundNetLog log2; 1775 CapturingBoundNetLog log2;
1778 EXPECT_EQ(ERR_IO_PENDING, 1776 EXPECT_EQ(ERR_IO_PENDING,
1779 handle2.Init("a", 1777 handle2.Init("a",
1780 params_, 1778 params_,
1781 kDefaultPriority, 1779 DEFAULT_PRIORITY,
1782 callback2.callback(), 1780 callback2.callback(),
1783 pool_.get(), 1781 pool_.get(),
1784 BoundNetLog())); 1782 BoundNetLog()));
1785 1783
1786 handle.Reset(); 1784 handle.Reset();
1787 1785
1788 1786
1789 // At this point, request 2 is just waiting for the connect job to finish. 1787 // At this point, request 2 is just waiting for the connect job to finish.
1790 1788
1791 EXPECT_EQ(OK, callback2.WaitForResult()); 1789 EXPECT_EQ(OK, callback2.WaitForResult());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1823 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1821 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1824 1822
1825 // Start job 1 (async OK) 1823 // Start job 1 (async OK)
1826 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1824 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1827 1825
1828 std::vector<TestSocketRequest*> request_order; 1826 std::vector<TestSocketRequest*> request_order;
1829 size_t completion_count; // unused 1827 size_t completion_count; // unused
1830 TestSocketRequest req1(&request_order, &completion_count); 1828 TestSocketRequest req1(&request_order, &completion_count);
1831 int rv = req1.handle()->Init("a", 1829 int rv = req1.handle()->Init("a",
1832 params_, 1830 params_,
1833 kDefaultPriority, 1831 DEFAULT_PRIORITY,
1834 req1.callback(), pool_.get(), 1832 req1.callback(), pool_.get(),
1835 BoundNetLog()); 1833 BoundNetLog());
1836 EXPECT_EQ(ERR_IO_PENDING, rv); 1834 EXPECT_EQ(ERR_IO_PENDING, rv);
1837 EXPECT_EQ(OK, req1.WaitForResult()); 1835 EXPECT_EQ(OK, req1.WaitForResult());
1838 1836
1839 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending 1837 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1840 // without a job. 1838 // without a job.
1841 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1839 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1842 1840
1843 TestSocketRequest req2(&request_order, &completion_count); 1841 TestSocketRequest req2(&request_order, &completion_count);
1844 rv = req2.handle()->Init("a", 1842 rv = req2.handle()->Init("a",
1845 params_, 1843 params_,
1846 kDefaultPriority, 1844 DEFAULT_PRIORITY,
1847 req2.callback(), 1845 req2.callback(),
1848 pool_.get(), 1846 pool_.get(),
1849 BoundNetLog()); 1847 BoundNetLog());
1850 EXPECT_EQ(ERR_IO_PENDING, rv); 1848 EXPECT_EQ(ERR_IO_PENDING, rv);
1851 TestSocketRequest req3(&request_order, &completion_count); 1849 TestSocketRequest req3(&request_order, &completion_count);
1852 rv = req3.handle()->Init("a", 1850 rv = req3.handle()->Init("a",
1853 params_, 1851 params_,
1854 kDefaultPriority, 1852 DEFAULT_PRIORITY,
1855 req3.callback(), 1853 req3.callback(),
1856 pool_.get(), 1854 pool_.get(),
1857 BoundNetLog()); 1855 BoundNetLog());
1858 EXPECT_EQ(ERR_IO_PENDING, rv); 1856 EXPECT_EQ(ERR_IO_PENDING, rv);
1859 1857
1860 // Both Requests 2 and 3 are pending. We release socket 1 which should 1858 // Both Requests 2 and 3 are pending. We release socket 1 which should
1861 // service request 2. Request 3 should still be waiting. 1859 // service request 2. Request 3 should still be waiting.
1862 req1.handle()->Reset(); 1860 req1.handle()->Reset();
1863 // Run the released socket wakeups. 1861 // Run the released socket wakeups.
1864 base::MessageLoop::current()->RunUntilIdle(); 1862 base::MessageLoop::current()->RunUntilIdle();
(...skipping 18 matching lines...) Expand all
1883 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { 1881 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
1884 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1882 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1885 // First two jobs are async. 1883 // First two jobs are async.
1886 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1884 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1887 1885
1888 std::vector<TestSocketRequest*> request_order; 1886 std::vector<TestSocketRequest*> request_order;
1889 size_t completion_count; // unused 1887 size_t completion_count; // unused
1890 TestSocketRequest req1(&request_order, &completion_count); 1888 TestSocketRequest req1(&request_order, &completion_count);
1891 int rv = req1.handle()->Init("a", 1889 int rv = req1.handle()->Init("a",
1892 params_, 1890 params_,
1893 kDefaultPriority, 1891 DEFAULT_PRIORITY,
1894 req1.callback(), 1892 req1.callback(),
1895 pool_.get(), 1893 pool_.get(),
1896 BoundNetLog()); 1894 BoundNetLog());
1897 EXPECT_EQ(ERR_IO_PENDING, rv); 1895 EXPECT_EQ(ERR_IO_PENDING, rv);
1898 1896
1899 TestSocketRequest req2(&request_order, &completion_count); 1897 TestSocketRequest req2(&request_order, &completion_count);
1900 rv = req2.handle()->Init("a", 1898 rv = req2.handle()->Init("a",
1901 params_, 1899 params_,
1902 kDefaultPriority, 1900 DEFAULT_PRIORITY,
1903 req2.callback(), 1901 req2.callback(),
1904 pool_.get(), 1902 pool_.get(),
1905 BoundNetLog()); 1903 BoundNetLog());
1906 EXPECT_EQ(ERR_IO_PENDING, rv); 1904 EXPECT_EQ(ERR_IO_PENDING, rv);
1907 1905
1908 // The pending job is sync. 1906 // The pending job is sync.
1909 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1907 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1910 1908
1911 TestSocketRequest req3(&request_order, &completion_count); 1909 TestSocketRequest req3(&request_order, &completion_count);
1912 rv = req3.handle()->Init("a", 1910 rv = req3.handle()->Init("a",
1913 params_, 1911 params_,
1914 kDefaultPriority, 1912 DEFAULT_PRIORITY,
1915 req3.callback(), 1913 req3.callback(),
1916 pool_.get(), 1914 pool_.get(),
1917 BoundNetLog()); 1915 BoundNetLog());
1918 EXPECT_EQ(ERR_IO_PENDING, rv); 1916 EXPECT_EQ(ERR_IO_PENDING, rv);
1919 1917
1920 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); 1918 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult());
1921 EXPECT_EQ(OK, req2.WaitForResult()); 1919 EXPECT_EQ(OK, req2.WaitForResult());
1922 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); 1920 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult());
1923 1921
1924 ASSERT_EQ(3U, request_order.size()); 1922 ASSERT_EQ(3U, request_order.size());
1925 EXPECT_EQ(&req1, request_order[0]); 1923 EXPECT_EQ(&req1, request_order[0]);
1926 EXPECT_EQ(&req2, request_order[1]); 1924 EXPECT_EQ(&req2, request_order[1]);
1927 EXPECT_EQ(&req3, request_order[2]); 1925 EXPECT_EQ(&req3, request_order[2]);
1928 } 1926 }
1929 1927
1930 // Test GetLoadState in the case there's only one socket request. 1928 // Test GetLoadState in the case there's only one socket request.
1931 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { 1929 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
1932 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1930 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1933 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1931 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1934 1932
1935 ClientSocketHandle handle; 1933 ClientSocketHandle handle;
1936 TestCompletionCallback callback; 1934 TestCompletionCallback callback;
1937 int rv = handle.Init("a", 1935 int rv = handle.Init("a",
1938 params_, 1936 params_,
1939 kDefaultPriority, 1937 DEFAULT_PRIORITY,
1940 callback.callback(), 1938 callback.callback(),
1941 pool_.get(), 1939 pool_.get(),
1942 BoundNetLog()); 1940 BoundNetLog());
1943 EXPECT_EQ(ERR_IO_PENDING, rv); 1941 EXPECT_EQ(ERR_IO_PENDING, rv);
1944 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 1942 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1945 1943
1946 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); 1944 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1947 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); 1945 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1948 1946
1949 // No point in completing the connection, since ClientSocketHandles only 1947 // No point in completing the connection, since ClientSocketHandles only
1950 // expect the LoadState to be checked while connecting. 1948 // expect the LoadState to be checked while connecting.
1951 } 1949 }
1952 1950
1953 // Test GetLoadState in the case there are two socket requests. 1951 // Test GetLoadState in the case there are two socket requests.
1954 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { 1952 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
1955 CreatePool(2, 2); 1953 CreatePool(2, 2);
1956 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1954 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1957 1955
1958 ClientSocketHandle handle; 1956 ClientSocketHandle handle;
1959 TestCompletionCallback callback; 1957 TestCompletionCallback callback;
1960 int rv = handle.Init("a", 1958 int rv = handle.Init("a",
1961 params_, 1959 params_,
1962 kDefaultPriority, 1960 DEFAULT_PRIORITY,
1963 callback.callback(), 1961 callback.callback(),
1964 pool_.get(), 1962 pool_.get(),
1965 BoundNetLog()); 1963 BoundNetLog());
1966 EXPECT_EQ(ERR_IO_PENDING, rv); 1964 EXPECT_EQ(ERR_IO_PENDING, rv);
1967 1965
1968 ClientSocketHandle handle2; 1966 ClientSocketHandle handle2;
1969 TestCompletionCallback callback2; 1967 TestCompletionCallback callback2;
1970 rv = handle2.Init("a", 1968 rv = handle2.Init("a",
1971 params_, 1969 params_,
1972 kDefaultPriority, 1970 DEFAULT_PRIORITY,
1973 callback2.callback(), 1971 callback2.callback(),
1974 pool_.get(), 1972 pool_.get(),
1975 BoundNetLog()); 1973 BoundNetLog());
1976 EXPECT_EQ(ERR_IO_PENDING, rv); 1974 EXPECT_EQ(ERR_IO_PENDING, rv);
1977 1975
1978 // If the first Job is in an earlier state than the second, the state of 1976 // If the first Job is in an earlier state than the second, the state of
1979 // the second job should be used for both handles. 1977 // the second job should be used for both handles.
1980 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); 1978 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
1981 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 1979 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1982 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); 1980 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2045 2043
2046 // Test GetLoadState in the case the per-pool limit is reached. 2044 // Test GetLoadState in the case the per-pool limit is reached.
2047 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { 2045 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2048 CreatePool(2, 2); 2046 CreatePool(2, 2);
2049 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2047 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2050 2048
2051 ClientSocketHandle handle; 2049 ClientSocketHandle handle;
2052 TestCompletionCallback callback; 2050 TestCompletionCallback callback;
2053 int rv = handle.Init("a", 2051 int rv = handle.Init("a",
2054 params_, 2052 params_,
2055 kDefaultPriority, 2053 DEFAULT_PRIORITY,
2056 callback.callback(), 2054 callback.callback(),
2057 pool_.get(), 2055 pool_.get(),
2058 BoundNetLog()); 2056 BoundNetLog());
2059 EXPECT_EQ(ERR_IO_PENDING, rv); 2057 EXPECT_EQ(ERR_IO_PENDING, rv);
2060 2058
2061 // Request for socket from another pool. 2059 // Request for socket from another pool.
2062 ClientSocketHandle handle2; 2060 ClientSocketHandle handle2;
2063 TestCompletionCallback callback2; 2061 TestCompletionCallback callback2;
2064 rv = handle2.Init("b", 2062 rv = handle2.Init("b",
2065 params_, 2063 params_,
2066 kDefaultPriority, 2064 DEFAULT_PRIORITY,
2067 callback2.callback(), 2065 callback2.callback(),
2068 pool_.get(), 2066 pool_.get(),
2069 BoundNetLog()); 2067 BoundNetLog());
2070 EXPECT_EQ(ERR_IO_PENDING, rv); 2068 EXPECT_EQ(ERR_IO_PENDING, rv);
2071 2069
2072 // Request another socket from the first pool. Request should stall at the 2070 // Request another socket from the first pool. Request should stall at the
2073 // socket pool limit. 2071 // socket pool limit.
2074 ClientSocketHandle handle3; 2072 ClientSocketHandle handle3;
2075 TestCompletionCallback callback3; 2073 TestCompletionCallback callback3;
2076 rv = handle3.Init("a", 2074 rv = handle3.Init("a",
2077 params_, 2075 params_,
2078 kDefaultPriority, 2076 DEFAULT_PRIORITY,
2079 callback2.callback(), 2077 callback2.callback(),
2080 pool_.get(), 2078 pool_.get(),
2081 BoundNetLog()); 2079 BoundNetLog());
2082 EXPECT_EQ(ERR_IO_PENDING, rv); 2080 EXPECT_EQ(ERR_IO_PENDING, rv);
2083 2081
2084 // The third handle should remain stalled as the other sockets in its group 2082 // The third handle should remain stalled as the other sockets in its group
2085 // goes through the connect process. 2083 // goes through the connect process.
2086 2084
2087 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 2085 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2088 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); 2086 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
(...skipping 13 matching lines...) Expand all
2102 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); 2100 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
2103 } 2101 }
2104 2102
2105 TEST_F(ClientSocketPoolBaseTest, Recoverable) { 2103 TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2106 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2104 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2107 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); 2105 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2108 2106
2109 ClientSocketHandle handle; 2107 ClientSocketHandle handle;
2110 TestCompletionCallback callback; 2108 TestCompletionCallback callback;
2111 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, 2109 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
2112 handle.Init("a", params_, kDefaultPriority, callback.callback(), 2110 handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(),
2113 pool_.get(), BoundNetLog())); 2111 pool_.get(), BoundNetLog()));
2114 EXPECT_TRUE(handle.is_initialized()); 2112 EXPECT_TRUE(handle.is_initialized());
2115 EXPECT_TRUE(handle.socket()); 2113 EXPECT_TRUE(handle.socket());
2116 } 2114 }
2117 2115
2118 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { 2116 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2119 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2117 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2120 2118
2121 connect_job_factory_->set_job_type( 2119 connect_job_factory_->set_job_type(
2122 TestConnectJob::kMockPendingRecoverableJob); 2120 TestConnectJob::kMockPendingRecoverableJob);
2123 ClientSocketHandle handle; 2121 ClientSocketHandle handle;
2124 TestCompletionCallback callback; 2122 TestCompletionCallback callback;
2125 EXPECT_EQ(ERR_IO_PENDING, 2123 EXPECT_EQ(ERR_IO_PENDING,
2126 handle.Init("a", 2124 handle.Init("a",
2127 params_, 2125 params_,
2128 kDefaultPriority, 2126 DEFAULT_PRIORITY,
2129 callback.callback(), 2127 callback.callback(),
2130 pool_.get(), 2128 pool_.get(),
2131 BoundNetLog())); 2129 BoundNetLog()));
2132 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2130 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2133 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); 2131 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
2134 EXPECT_TRUE(handle.is_initialized()); 2132 EXPECT_TRUE(handle.is_initialized());
2135 EXPECT_TRUE(handle.socket()); 2133 EXPECT_TRUE(handle.socket());
2136 } 2134 }
2137 2135
2138 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { 2136 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2137 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2140 connect_job_factory_->set_job_type( 2138 connect_job_factory_->set_job_type(
2141 TestConnectJob::kMockAdditionalErrorStateJob); 2139 TestConnectJob::kMockAdditionalErrorStateJob);
2142 2140
2143 ClientSocketHandle handle; 2141 ClientSocketHandle handle;
2144 TestCompletionCallback callback; 2142 TestCompletionCallback callback;
2145 EXPECT_EQ(ERR_CONNECTION_FAILED, 2143 EXPECT_EQ(ERR_CONNECTION_FAILED,
2146 handle.Init("a", 2144 handle.Init("a",
2147 params_, 2145 params_,
2148 kDefaultPriority, 2146 DEFAULT_PRIORITY,
2149 callback.callback(), 2147 callback.callback(),
2150 pool_.get(), 2148 pool_.get(),
2151 BoundNetLog())); 2149 BoundNetLog()));
2152 EXPECT_FALSE(handle.is_initialized()); 2150 EXPECT_FALSE(handle.is_initialized());
2153 EXPECT_FALSE(handle.socket()); 2151 EXPECT_FALSE(handle.socket());
2154 EXPECT_TRUE(handle.is_ssl_error()); 2152 EXPECT_TRUE(handle.is_ssl_error());
2155 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 2153 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
2156 } 2154 }
2157 2155
2158 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) { 2156 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2159 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2157 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2160 2158
2161 connect_job_factory_->set_job_type( 2159 connect_job_factory_->set_job_type(
2162 TestConnectJob::kMockPendingAdditionalErrorStateJob); 2160 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2163 ClientSocketHandle handle; 2161 ClientSocketHandle handle;
2164 TestCompletionCallback callback; 2162 TestCompletionCallback callback;
2165 EXPECT_EQ(ERR_IO_PENDING, 2163 EXPECT_EQ(ERR_IO_PENDING,
2166 handle.Init("a", 2164 handle.Init("a",
2167 params_, 2165 params_,
2168 kDefaultPriority, 2166 DEFAULT_PRIORITY,
2169 callback.callback(), 2167 callback.callback(),
2170 pool_.get(), 2168 pool_.get(),
2171 BoundNetLog())); 2169 BoundNetLog()));
2172 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2170 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2173 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 2171 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
2174 EXPECT_FALSE(handle.is_initialized()); 2172 EXPECT_FALSE(handle.is_initialized());
2175 EXPECT_FALSE(handle.socket()); 2173 EXPECT_FALSE(handle.socket());
2176 EXPECT_TRUE(handle.is_ssl_error()); 2174 EXPECT_TRUE(handle.is_ssl_error());
2177 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 2175 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
2178 } 2176 }
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 EXPECT_EQ(OK, callback_a[i].WaitForResult()); 2524 EXPECT_EQ(OK, callback_a[i].WaitForResult());
2527 } 2525 }
2528 } 2526 }
2529 2527
2530 TEST_F(ClientSocketPoolBaseTest, 2528 TEST_F(ClientSocketPoolBaseTest,
2531 ReleasingDisconnectedSocketsMaintainsPriorityOrder) { 2529 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2532 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2530 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2533 2531
2534 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2532 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2535 2533
2536 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2534 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2537 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2535 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2538 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2536 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2539 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2537 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY));
2540 2538
2541 EXPECT_EQ(OK, (*requests())[0]->WaitForResult()); 2539 EXPECT_EQ(OK, (*requests())[0]->WaitForResult());
2542 EXPECT_EQ(OK, (*requests())[1]->WaitForResult()); 2540 EXPECT_EQ(OK, (*requests())[1]->WaitForResult());
2543 EXPECT_EQ(2u, completion_count()); 2541 EXPECT_EQ(2u, completion_count());
2544 2542
2545 // Releases one connection. 2543 // Releases one connection.
2546 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); 2544 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
2547 EXPECT_EQ(OK, (*requests())[2]->WaitForResult()); 2545 EXPECT_EQ(OK, (*requests())[2]->WaitForResult());
2548 2546
2549 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); 2547 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
(...skipping 26 matching lines...) Expand all
2576 ClientSocketHandle* handle() { return &handle_; } 2574 ClientSocketHandle* handle() { return &handle_; }
2577 2575
2578 const CompletionCallback& callback() const { return callback_; } 2576 const CompletionCallback& callback() const { return callback_; }
2579 2577
2580 private: 2578 private:
2581 void OnComplete(int result) { 2579 void OnComplete(int result) {
2582 SetResult(result); 2580 SetResult(result);
2583 if (reset_releasing_handle_) 2581 if (reset_releasing_handle_)
2584 handle_.Reset(); 2582 handle_.Reset();
2585 2583
2586 scoped_refptr<TestSocketParams> con_params(new TestSocketParams()); 2584 scoped_refptr<TestSocketParams> con_params(
2585 new TestSocketParams(false /* ignore_limits */));
2587 EXPECT_EQ(expected_result_, 2586 EXPECT_EQ(expected_result_,
2588 handle2_.Init("a", con_params, kDefaultPriority, 2587 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
2589 callback2_.callback(), pool_, BoundNetLog())); 2588 callback2_.callback(), pool_, BoundNetLog()));
2590 } 2589 }
2591 2590
2592 TestClientSocketPool* const pool_; 2591 TestClientSocketPool* const pool_;
2593 int expected_result_; 2592 int expected_result_;
2594 bool reset_releasing_handle_; 2593 bool reset_releasing_handle_;
2595 ClientSocketHandle handle_; 2594 ClientSocketHandle handle_;
2596 ClientSocketHandle handle2_; 2595 ClientSocketHandle handle2_;
2597 CompletionCallback callback_; 2596 CompletionCallback callback_;
2598 TestCompletionCallback callback2_; 2597 TestCompletionCallback callback2_;
2599 }; 2598 };
2600 2599
2601 2600
2602 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { 2601 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2603 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2602 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2604 2603
2605 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 2604 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
2606 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 2605 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY));
2607 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 2606 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY));
2608 2607
2609 EXPECT_EQ(static_cast<int>(requests_size()), 2608 EXPECT_EQ(static_cast<int>(requests_size()),
2610 client_socket_factory_.allocation_count()); 2609 client_socket_factory_.allocation_count());
2611 2610
2612 connect_job_factory_->set_job_type( 2611 connect_job_factory_->set_job_type(
2613 TestConnectJob::kMockPendingAdditionalErrorStateJob); 2612 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2614 TestReleasingSocketRequest req(pool_.get(), OK, false); 2613 TestReleasingSocketRequest req(pool_.get(), OK, false);
2615 EXPECT_EQ(ERR_IO_PENDING, 2614 EXPECT_EQ(ERR_IO_PENDING,
2616 req.handle()->Init("a", params_, kDefaultPriority, req.callback(), 2615 req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(),
2617 pool_.get(), BoundNetLog())); 2616 pool_.get(), BoundNetLog()));
2618 // The next job should complete synchronously 2617 // The next job should complete synchronously
2619 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2618 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2620 2619
2621 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 2620 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult());
2622 EXPECT_FALSE(req.handle()->is_initialized()); 2621 EXPECT_FALSE(req.handle()->is_initialized());
2623 EXPECT_FALSE(req.handle()->socket()); 2622 EXPECT_FALSE(req.handle()->socket());
2624 EXPECT_TRUE(req.handle()->is_ssl_error()); 2623 EXPECT_TRUE(req.handle()->is_ssl_error());
2625 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); 2624 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
2626 } 2625 }
2627 2626
2628 // http://crbug.com/44724 regression test. 2627 // http://crbug.com/44724 regression test.
2629 // We start releasing the pool when we flush on network change. When that 2628 // We start releasing the pool when we flush on network change. When that
2630 // happens, the only active references are in the ClientSocketHandles. When a 2629 // happens, the only active references are in the ClientSocketHandles. When a
2631 // ConnectJob completes and calls back into the last ClientSocketHandle, that 2630 // ConnectJob completes and calls back into the last ClientSocketHandle, that
2632 // callback can release the last reference and delete the pool. After the 2631 // callback can release the last reference and delete the pool. After the
2633 // callback finishes, we go back to the stack frame within the now-deleted pool. 2632 // callback finishes, we go back to the stack frame within the now-deleted pool.
2634 // Executing any code that refers to members of the now-deleted pool can cause 2633 // Executing any code that refers to members of the now-deleted pool can cause
2635 // crashes. 2634 // crashes.
2636 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { 2635 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2637 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2636 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2638 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 2637 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2639 2638
2640 ClientSocketHandle handle; 2639 ClientSocketHandle handle;
2641 TestCompletionCallback callback; 2640 TestCompletionCallback callback;
2642 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2641 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2643 params_, 2642 params_,
2644 kDefaultPriority, 2643 DEFAULT_PRIORITY,
2645 callback.callback(), 2644 callback.callback(),
2646 pool_.get(), 2645 pool_.get(),
2647 BoundNetLog())); 2646 BoundNetLog()));
2648 2647
2649 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2648 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2650 2649
2651 // We'll call back into this now. 2650 // We'll call back into this now.
2652 callback.WaitForResult(); 2651 callback.WaitForResult();
2653 } 2652 }
2654 2653
2655 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { 2654 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2656 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2655 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2657 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2656 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2658 2657
2659 ClientSocketHandle handle; 2658 ClientSocketHandle handle;
2660 TestCompletionCallback callback; 2659 TestCompletionCallback callback;
2661 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2660 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2662 params_, 2661 params_,
2663 kDefaultPriority, 2662 DEFAULT_PRIORITY,
2664 callback.callback(), 2663 callback.callback(),
2665 pool_.get(), 2664 pool_.get(),
2666 BoundNetLog())); 2665 BoundNetLog()));
2667 EXPECT_EQ(OK, callback.WaitForResult()); 2666 EXPECT_EQ(OK, callback.WaitForResult());
2668 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2667 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2669 2668
2670 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2669 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2671 2670
2672 handle.Reset(); 2671 handle.Reset();
2673 base::MessageLoop::current()->RunUntilIdle(); 2672 base::MessageLoop::current()->RunUntilIdle();
2674 2673
2675 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2674 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2676 params_, 2675 params_,
2677 kDefaultPriority, 2676 DEFAULT_PRIORITY,
2678 callback.callback(), 2677 callback.callback(),
2679 pool_.get(), 2678 pool_.get(),
2680 BoundNetLog())); 2679 BoundNetLog()));
2681 EXPECT_EQ(OK, callback.WaitForResult()); 2680 EXPECT_EQ(OK, callback.WaitForResult());
2682 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2681 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2683 } 2682 }
2684 2683
2685 class ConnectWithinCallback : public TestCompletionCallbackBase { 2684 class ConnectWithinCallback : public TestCompletionCallbackBase {
2686 public: 2685 public:
2687 ConnectWithinCallback( 2686 ConnectWithinCallback(
(...skipping 14 matching lines...) Expand all
2702 } 2701 }
2703 2702
2704 const CompletionCallback& callback() const { return callback_; } 2703 const CompletionCallback& callback() const { return callback_; }
2705 2704
2706 private: 2705 private:
2707 void OnComplete(int result) { 2706 void OnComplete(int result) {
2708 SetResult(result); 2707 SetResult(result);
2709 EXPECT_EQ(ERR_IO_PENDING, 2708 EXPECT_EQ(ERR_IO_PENDING,
2710 handle_.Init(group_name_, 2709 handle_.Init(group_name_,
2711 params_, 2710 params_,
2712 kDefaultPriority, 2711 DEFAULT_PRIORITY,
2713 nested_callback_.callback(), 2712 nested_callback_.callback(),
2714 pool_, 2713 pool_,
2715 BoundNetLog())); 2714 BoundNetLog()));
2716 } 2715 }
2717 2716
2718 const std::string group_name_; 2717 const std::string group_name_;
2719 const scoped_refptr<TestSocketParams> params_; 2718 const scoped_refptr<TestSocketParams> params_;
2720 TestClientSocketPool* const pool_; 2719 TestClientSocketPool* const pool_;
2721 ClientSocketHandle handle_; 2720 ClientSocketHandle handle_;
2722 CompletionCallback callback_; 2721 CompletionCallback callback_;
2723 TestCompletionCallback nested_callback_; 2722 TestCompletionCallback nested_callback_;
2724 2723
2725 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback); 2724 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
2726 }; 2725 };
2727 2726
2728 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { 2727 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2729 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2728 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2730 2729
2731 // First job will be waiting until it gets aborted. 2730 // First job will be waiting until it gets aborted.
2732 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2731 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2733 2732
2734 ClientSocketHandle handle; 2733 ClientSocketHandle handle;
2735 ConnectWithinCallback callback("a", params_, pool_.get()); 2734 ConnectWithinCallback callback("a", params_, pool_.get());
2736 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2735 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
2737 params_, 2736 params_,
2738 kDefaultPriority, 2737 DEFAULT_PRIORITY,
2739 callback.callback(), 2738 callback.callback(),
2740 pool_.get(), 2739 pool_.get(),
2741 BoundNetLog())); 2740 BoundNetLog()));
2742 2741
2743 // Second job will be started during the first callback, and will 2742 // Second job will be started during the first callback, and will
2744 // asynchronously complete with OK. 2743 // asynchronously complete with OK.
2745 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2744 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2746 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2745 pool_->FlushWithError(ERR_NETWORK_CHANGED);
2747 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); 2746 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult());
2748 EXPECT_EQ(OK, callback.WaitForNestedResult()); 2747 EXPECT_EQ(OK, callback.WaitForNestedResult());
2749 } 2748 }
2750 2749
2751 // Cancel a pending socket request while we're at max sockets, 2750 // Cancel a pending socket request while we're at max sockets,
2752 // and verify that the backup socket firing doesn't cause a crash. 2751 // and verify that the backup socket firing doesn't cause a crash.
2753 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { 2752 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2754 // Max 4 sockets globally, max 4 sockets per group. 2753 // Max 4 sockets globally, max 4 sockets per group.
2755 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2754 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2756 pool_->EnableConnectBackupJobs(); 2755 pool_->EnableConnectBackupJobs();
2757 2756
2758 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2757 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2759 // timer. 2758 // timer.
2760 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2759 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2761 ClientSocketHandle handle; 2760 ClientSocketHandle handle;
2762 TestCompletionCallback callback; 2761 TestCompletionCallback callback;
2763 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2762 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar",
2764 params_, 2763 params_,
2765 kDefaultPriority, 2764 DEFAULT_PRIORITY,
2766 callback.callback(), 2765 callback.callback(),
2767 pool_.get(), 2766 pool_.get(),
2768 BoundNetLog())); 2767 BoundNetLog()));
2769 2768
2770 // Start (MaxSockets - 1) connected sockets to reach max sockets. 2769 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2771 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2770 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2772 ClientSocketHandle handles[kDefaultMaxSockets]; 2771 ClientSocketHandle handles[kDefaultMaxSockets];
2773 for (int i = 1; i < kDefaultMaxSockets; ++i) { 2772 for (int i = 1; i < kDefaultMaxSockets; ++i) {
2774 TestCompletionCallback callback; 2773 TestCompletionCallback callback;
2775 EXPECT_EQ(OK, handles[i].Init("bar", 2774 EXPECT_EQ(OK, handles[i].Init("bar",
2776 params_, 2775 params_,
2777 kDefaultPriority, 2776 DEFAULT_PRIORITY,
2778 callback.callback(), 2777 callback.callback(),
2779 pool_.get(), 2778 pool_.get(),
2780 BoundNetLog())); 2779 BoundNetLog()));
2781 } 2780 }
2782 2781
2783 base::MessageLoop::current()->RunUntilIdle(); 2782 base::MessageLoop::current()->RunUntilIdle();
2784 2783
2785 // Cancel the pending request. 2784 // Cancel the pending request.
2786 handle.Reset(); 2785 handle.Reset();
2787 2786
2788 // Wait for the backup timer to fire (add some slop to ensure it fires) 2787 // Wait for the backup timer to fire (add some slop to ensure it fires)
2789 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2788 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2790 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2789 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
2791 2790
2792 base::MessageLoop::current()->RunUntilIdle(); 2791 base::MessageLoop::current()->RunUntilIdle();
2793 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 2792 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2794 } 2793 }
2795 2794
2796 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { 2795 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
2797 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2796 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2798 pool_->EnableConnectBackupJobs(); 2797 pool_->EnableConnectBackupJobs();
2799 2798
2800 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2799 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2801 // timer. 2800 // timer.
2802 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2801 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2803 ClientSocketHandle handle; 2802 ClientSocketHandle handle;
2804 TestCompletionCallback callback; 2803 TestCompletionCallback callback;
2805 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2804 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar",
2806 params_, 2805 params_,
2807 kDefaultPriority, 2806 DEFAULT_PRIORITY,
2808 callback.callback(), 2807 callback.callback(),
2809 pool_.get(), 2808 pool_.get(),
2810 BoundNetLog())); 2809 BoundNetLog()));
2811 ASSERT_TRUE(pool_->HasGroup("bar")); 2810 ASSERT_TRUE(pool_->HasGroup("bar"));
2812 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2811 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2813 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); 2812 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
2814 2813
2815 // Cancel the socket request. This should cancel the backup timer. Wait for 2814 // Cancel the socket request. This should cancel the backup timer. Wait for
2816 // the backup time to see if it indeed got canceled. 2815 // the backup time to see if it indeed got canceled.
2817 handle.Reset(); 2816 handle.Reset();
2818 // Wait for the backup timer to fire (add some slop to ensure it fires) 2817 // Wait for the backup timer to fire (add some slop to ensure it fires)
2819 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2818 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2820 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2819 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
2821 base::MessageLoop::current()->RunUntilIdle(); 2820 base::MessageLoop::current()->RunUntilIdle();
2822 ASSERT_TRUE(pool_->HasGroup("bar")); 2821 ASSERT_TRUE(pool_->HasGroup("bar"));
2823 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2822 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2824 } 2823 }
2825 2824
2826 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { 2825 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2827 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2826 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2828 pool_->EnableConnectBackupJobs(); 2827 pool_->EnableConnectBackupJobs();
2829 2828
2830 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2829 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2831 // timer. 2830 // timer.
2832 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2831 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2833 ClientSocketHandle handle; 2832 ClientSocketHandle handle;
2834 TestCompletionCallback callback; 2833 TestCompletionCallback callback;
2835 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2834 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar",
2836 params_, 2835 params_,
2837 kDefaultPriority, 2836 DEFAULT_PRIORITY,
2838 callback.callback(), 2837 callback.callback(),
2839 pool_.get(), 2838 pool_.get(),
2840 BoundNetLog())); 2839 BoundNetLog()));
2841 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2842 ClientSocketHandle handle2; 2841 ClientSocketHandle handle2;
2843 TestCompletionCallback callback2; 2842 TestCompletionCallback callback2;
2844 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", 2843 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar",
2845 params_, 2844 params_,
2846 kDefaultPriority, 2845 DEFAULT_PRIORITY,
2847 callback2.callback(), 2846 callback2.callback(),
2848 pool_.get(), 2847 pool_.get(),
2849 BoundNetLog())); 2848 BoundNetLog()));
2850 ASSERT_TRUE(pool_->HasGroup("bar")); 2849 ASSERT_TRUE(pool_->HasGroup("bar"));
2851 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); 2850 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2852 2851
2853 // Cancel request 1 and then complete request 2. With the requests finished, 2852 // Cancel request 1 and then complete request 2. With the requests finished,
2854 // the backup timer should be cancelled. 2853 // the backup timer should be cancelled.
2855 handle.Reset(); 2854 handle.Reset();
2856 EXPECT_EQ(OK, callback2.WaitForResult()); 2855 EXPECT_EQ(OK, callback2.WaitForResult());
2857 // Wait for the backup timer to fire (add some slop to ensure it fires) 2856 // Wait for the backup timer to fire (add some slop to ensure it fires)
2858 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2857 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2859 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2858 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
2860 base::MessageLoop::current()->RunUntilIdle(); 2859 base::MessageLoop::current()->RunUntilIdle();
2861 } 2860 }
2862 2861
2863 // Test delayed socket binding for the case where we have two connects, 2862 // Test delayed socket binding for the case where we have two connects,
2864 // and while one is waiting on a connect, the other frees up. 2863 // and while one is waiting on a connect, the other frees up.
2865 // The socket waiting on a connect should switch immediately to the freed 2864 // The socket waiting on a connect should switch immediately to the freed
2866 // up socket. 2865 // up socket.
2867 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { 2866 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2868 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2869 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2868 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2870 2869
2871 ClientSocketHandle handle1; 2870 ClientSocketHandle handle1;
2872 TestCompletionCallback callback; 2871 TestCompletionCallback callback;
2873 EXPECT_EQ(ERR_IO_PENDING, 2872 EXPECT_EQ(ERR_IO_PENDING,
2874 handle1.Init("a", 2873 handle1.Init("a",
2875 params_, 2874 params_,
2876 kDefaultPriority, 2875 DEFAULT_PRIORITY,
2877 callback.callback(), 2876 callback.callback(),
2878 pool_.get(), 2877 pool_.get(),
2879 BoundNetLog())); 2878 BoundNetLog()));
2880 EXPECT_EQ(OK, callback.WaitForResult()); 2879 EXPECT_EQ(OK, callback.WaitForResult());
2881 2880
2882 // No idle sockets, no pending jobs. 2881 // No idle sockets, no pending jobs.
2883 EXPECT_EQ(0, pool_->IdleSocketCount()); 2882 EXPECT_EQ(0, pool_->IdleSocketCount());
2884 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2883 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2885 2884
2886 // Create a second socket to the same host, but this one will wait. 2885 // Create a second socket to the same host, but this one will wait.
2887 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2886 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2888 ClientSocketHandle handle2; 2887 ClientSocketHandle handle2;
2889 EXPECT_EQ(ERR_IO_PENDING, 2888 EXPECT_EQ(ERR_IO_PENDING,
2890 handle2.Init("a", 2889 handle2.Init("a",
2891 params_, 2890 params_,
2892 kDefaultPriority, 2891 DEFAULT_PRIORITY,
2893 callback.callback(), 2892 callback.callback(),
2894 pool_.get(), 2893 pool_.get(),
2895 BoundNetLog())); 2894 BoundNetLog()));
2896 // No idle sockets, and one connecting job. 2895 // No idle sockets, and one connecting job.
2897 EXPECT_EQ(0, pool_->IdleSocketCount()); 2896 EXPECT_EQ(0, pool_->IdleSocketCount());
2898 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2897 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2899 2898
2900 // Return the first handle to the pool. This will initiate the delayed 2899 // Return the first handle to the pool. This will initiate the delayed
2901 // binding. 2900 // binding.
2902 handle1.Reset(); 2901 handle1.Reset();
(...skipping 21 matching lines...) Expand all
2924 // of the group's sockets frees up. 2923 // of the group's sockets frees up.
2925 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { 2924 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2926 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2925 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2927 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2926 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2928 2927
2929 ClientSocketHandle handle1; 2928 ClientSocketHandle handle1;
2930 TestCompletionCallback callback; 2929 TestCompletionCallback callback;
2931 EXPECT_EQ(ERR_IO_PENDING, 2930 EXPECT_EQ(ERR_IO_PENDING,
2932 handle1.Init("a", 2931 handle1.Init("a",
2933 params_, 2932 params_,
2934 kDefaultPriority, 2933 DEFAULT_PRIORITY,
2935 callback.callback(), 2934 callback.callback(),
2936 pool_.get(), 2935 pool_.get(),
2937 BoundNetLog())); 2936 BoundNetLog()));
2938 EXPECT_EQ(OK, callback.WaitForResult()); 2937 EXPECT_EQ(OK, callback.WaitForResult());
2939 2938
2940 // No idle sockets, no pending jobs. 2939 // No idle sockets, no pending jobs.
2941 EXPECT_EQ(0, pool_->IdleSocketCount()); 2940 EXPECT_EQ(0, pool_->IdleSocketCount());
2942 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2941 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2943 2942
2944 // Create a second socket to the same host, but this one will wait. 2943 // Create a second socket to the same host, but this one will wait.
2945 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2944 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2946 ClientSocketHandle handle2; 2945 ClientSocketHandle handle2;
2947 EXPECT_EQ(ERR_IO_PENDING, 2946 EXPECT_EQ(ERR_IO_PENDING,
2948 handle2.Init("a", 2947 handle2.Init("a",
2949 params_, 2948 params_,
2950 kDefaultPriority, 2949 DEFAULT_PRIORITY,
2951 callback.callback(), 2950 callback.callback(),
2952 pool_.get(), 2951 pool_.get(),
2953 BoundNetLog())); 2952 BoundNetLog()));
2954 // No idle sockets, and one connecting job. 2953 // No idle sockets, and one connecting job.
2955 EXPECT_EQ(0, pool_->IdleSocketCount()); 2954 EXPECT_EQ(0, pool_->IdleSocketCount());
2956 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2955 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2957 2956
2958 // Return the first handle to the pool. This will initiate the delayed 2957 // Return the first handle to the pool. This will initiate the delayed
2959 // binding. 2958 // binding.
2960 handle1.Reset(); 2959 handle1.Reset();
(...skipping 23 matching lines...) Expand all
2984 // should complete, by taking the first socket's idle socket. 2983 // should complete, by taking the first socket's idle socket.
2985 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { 2984 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2986 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2985 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2987 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2986 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2988 2987
2989 ClientSocketHandle handle1; 2988 ClientSocketHandle handle1;
2990 TestCompletionCallback callback; 2989 TestCompletionCallback callback;
2991 EXPECT_EQ(ERR_IO_PENDING, 2990 EXPECT_EQ(ERR_IO_PENDING,
2992 handle1.Init("a", 2991 handle1.Init("a",
2993 params_, 2992 params_,
2994 kDefaultPriority, 2993 DEFAULT_PRIORITY,
2995 callback.callback(), 2994 callback.callback(),
2996 pool_.get(), 2995 pool_.get(),
2997 BoundNetLog())); 2996 BoundNetLog()));
2998 EXPECT_EQ(OK, callback.WaitForResult()); 2997 EXPECT_EQ(OK, callback.WaitForResult());
2999 2998
3000 // No idle sockets, no pending jobs. 2999 // No idle sockets, no pending jobs.
3001 EXPECT_EQ(0, pool_->IdleSocketCount()); 3000 EXPECT_EQ(0, pool_->IdleSocketCount());
3002 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3001 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3003 3002
3004 // Create a second socket to the same host, but this one will wait. 3003 // Create a second socket to the same host, but this one will wait.
3005 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 3004 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3006 ClientSocketHandle handle2; 3005 ClientSocketHandle handle2;
3007 EXPECT_EQ(ERR_IO_PENDING, 3006 EXPECT_EQ(ERR_IO_PENDING,
3008 handle2.Init("a", 3007 handle2.Init("a",
3009 params_, 3008 params_,
3010 kDefaultPriority, 3009 DEFAULT_PRIORITY,
3011 callback.callback(), 3010 callback.callback(),
3012 pool_.get(), 3011 pool_.get(),
3013 BoundNetLog())); 3012 BoundNetLog()));
3014 // No idle sockets, and one connecting job. 3013 // No idle sockets, and one connecting job.
3015 EXPECT_EQ(0, pool_->IdleSocketCount()); 3014 EXPECT_EQ(0, pool_->IdleSocketCount());
3016 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3015 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3017 3016
3018 // Return the first handle to the pool. This will initiate the delayed 3017 // Return the first handle to the pool. This will initiate the delayed
3019 // binding. 3018 // binding.
3020 handle1.Reset(); 3019 handle1.Reset();
(...skipping 26 matching lines...) Expand all
3047 3046
3048 // Make the first request asynchronous fail. 3047 // Make the first request asynchronous fail.
3049 // This will free up a socket slot later. 3048 // This will free up a socket slot later.
3050 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 3049 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3051 3050
3052 ClientSocketHandle handle1; 3051 ClientSocketHandle handle1;
3053 TestCompletionCallback callback1; 3052 TestCompletionCallback callback1;
3054 EXPECT_EQ(ERR_IO_PENDING, 3053 EXPECT_EQ(ERR_IO_PENDING,
3055 handle1.Init("a", 3054 handle1.Init("a",
3056 params_, 3055 params_,
3057 kDefaultPriority, 3056 DEFAULT_PRIORITY,
3058 callback1.callback(), 3057 callback1.callback(),
3059 pool_.get(), 3058 pool_.get(),
3060 BoundNetLog())); 3059 BoundNetLog()));
3061 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3060 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3062 3061
3063 // Make the second request synchronously fail. This should make the Group 3062 // Make the second request synchronously fail. This should make the Group
3064 // empty. 3063 // empty.
3065 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3064 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3066 ClientSocketHandle handle2; 3065 ClientSocketHandle handle2;
3067 TestCompletionCallback callback2; 3066 TestCompletionCallback callback2;
3068 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail 3067 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3069 // when created. 3068 // when created.
3070 EXPECT_EQ(ERR_IO_PENDING, 3069 EXPECT_EQ(ERR_IO_PENDING,
3071 handle2.Init("a", 3070 handle2.Init("a",
3072 params_, 3071 params_,
3073 kDefaultPriority, 3072 DEFAULT_PRIORITY,
3074 callback2.callback(), 3073 callback2.callback(),
3075 pool_.get(), 3074 pool_.get(),
3076 BoundNetLog())); 3075 BoundNetLog()));
3077 3076
3078 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3077 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3079 3078
3080 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult()); 3079 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult());
3081 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult()); 3080 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult());
3082 EXPECT_FALSE(pool_->HasGroup("a")); 3081 EXPECT_FALSE(pool_->HasGroup("a"));
3083 } 3082 }
3084 3083
3085 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { 3084 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3086 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3085 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3087 3086
3088 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3087 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3089 3088
3090 ClientSocketHandle handle1; 3089 ClientSocketHandle handle1;
3091 TestCompletionCallback callback1; 3090 TestCompletionCallback callback1;
3092 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3091 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3093 params_, 3092 params_,
3094 kDefaultPriority, 3093 DEFAULT_PRIORITY,
3095 callback1.callback(), 3094 callback1.callback(),
3096 pool_.get(), 3095 pool_.get(),
3097 BoundNetLog())); 3096 BoundNetLog()));
3098 3097
3099 ClientSocketHandle handle2; 3098 ClientSocketHandle handle2;
3100 TestCompletionCallback callback2; 3099 TestCompletionCallback callback2;
3101 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3100 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3102 params_, 3101 params_,
3103 kDefaultPriority, 3102 DEFAULT_PRIORITY,
3104 callback2.callback(), 3103 callback2.callback(),
3105 pool_.get(), 3104 pool_.get(),
3106 BoundNetLog())); 3105 BoundNetLog()));
3107 ClientSocketHandle handle3; 3106 ClientSocketHandle handle3;
3108 TestCompletionCallback callback3; 3107 TestCompletionCallback callback3;
3109 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 3108 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a",
3110 params_, 3109 params_,
3111 kDefaultPriority, 3110 DEFAULT_PRIORITY,
3112 callback3.callback(), 3111 callback3.callback(),
3113 pool_.get(), 3112 pool_.get(),
3114 BoundNetLog())); 3113 BoundNetLog()));
3115 3114
3116 EXPECT_EQ(OK, callback1.WaitForResult()); 3115 EXPECT_EQ(OK, callback1.WaitForResult());
3117 EXPECT_EQ(OK, callback2.WaitForResult()); 3116 EXPECT_EQ(OK, callback2.WaitForResult());
3118 EXPECT_EQ(OK, callback3.WaitForResult()); 3117 EXPECT_EQ(OK, callback3.WaitForResult());
3119 3118
3120 // Use the socket. 3119 // Use the socket.
3121 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); 3120 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
3122 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); 3121 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
3123 3122
3124 handle1.Reset(); 3123 handle1.Reset();
3125 handle2.Reset(); 3124 handle2.Reset();
3126 handle3.Reset(); 3125 handle3.Reset();
3127 3126
3128 EXPECT_EQ(OK, handle1.Init("a", 3127 EXPECT_EQ(OK, handle1.Init("a",
3129 params_, 3128 params_,
3130 kDefaultPriority, 3129 DEFAULT_PRIORITY,
3131 callback1.callback(), 3130 callback1.callback(),
3132 pool_.get(), 3131 pool_.get(),
3133 BoundNetLog())); 3132 BoundNetLog()));
3134 EXPECT_EQ(OK, handle2.Init("a", 3133 EXPECT_EQ(OK, handle2.Init("a",
3135 params_, 3134 params_,
3136 kDefaultPriority, 3135 DEFAULT_PRIORITY,
3137 callback2.callback(), 3136 callback2.callback(),
3138 pool_.get(), 3137 pool_.get(),
3139 BoundNetLog())); 3138 BoundNetLog()));
3140 EXPECT_EQ(OK, handle3.Init("a", 3139 EXPECT_EQ(OK, handle3.Init("a",
3141 params_, 3140 params_,
3142 kDefaultPriority, 3141 DEFAULT_PRIORITY,
3143 callback3.callback(), 3142 callback3.callback(),
3144 pool_.get(), 3143 pool_.get(),
3145 BoundNetLog())); 3144 BoundNetLog()));
3146 3145
3147 EXPECT_TRUE(handle1.socket()->WasEverUsed()); 3146 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3148 EXPECT_TRUE(handle2.socket()->WasEverUsed()); 3147 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3149 EXPECT_FALSE(handle3.socket()->WasEverUsed()); 3148 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3150 } 3149 }
3151 3150
3152 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { 3151 TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3153 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3152 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3154 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3153 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3155 3154
3156 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3155 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3157 3156
3158 ASSERT_TRUE(pool_->HasGroup("a")); 3157 ASSERT_TRUE(pool_->HasGroup("a"));
3159 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3158 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3160 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3159 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
3161 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3160 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3162 3161
3163 ClientSocketHandle handle1; 3162 ClientSocketHandle handle1;
3164 TestCompletionCallback callback1; 3163 TestCompletionCallback callback1;
3165 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3164 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3166 params_, 3165 params_,
3167 kDefaultPriority, 3166 DEFAULT_PRIORITY,
3168 callback1.callback(), 3167 callback1.callback(),
3169 pool_.get(), 3168 pool_.get(),
3170 BoundNetLog())); 3169 BoundNetLog()));
3171 3170
3172 ClientSocketHandle handle2; 3171 ClientSocketHandle handle2;
3173 TestCompletionCallback callback2; 3172 TestCompletionCallback callback2;
3174 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3173 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3175 params_, 3174 params_,
3176 kDefaultPriority, 3175 DEFAULT_PRIORITY,
3177 callback2.callback(), 3176 callback2.callback(),
3178 pool_.get(), 3177 pool_.get(),
3179 BoundNetLog())); 3178 BoundNetLog()));
3180 3179
3181 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3180 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3182 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3181 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3183 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3182 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3184 3183
3185 EXPECT_EQ(OK, callback1.WaitForResult()); 3184 EXPECT_EQ(OK, callback1.WaitForResult());
3186 EXPECT_EQ(OK, callback2.WaitForResult()); 3185 EXPECT_EQ(OK, callback2.WaitForResult());
3187 handle1.Reset(); 3186 handle1.Reset();
3188 handle2.Reset(); 3187 handle2.Reset();
3189 3188
3190 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3189 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3191 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3190 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3192 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3191 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3193 } 3192 }
3194 3193
3195 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { 3194 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3196 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3195 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3197 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3196 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3198 3197
3199 ClientSocketHandle handle1; 3198 ClientSocketHandle handle1;
3200 TestCompletionCallback callback1; 3199 TestCompletionCallback callback1;
3201 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3200 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3202 params_, 3201 params_,
3203 kDefaultPriority, 3202 DEFAULT_PRIORITY,
3204 callback1.callback(), 3203 callback1.callback(),
3205 pool_.get(), 3204 pool_.get(),
3206 BoundNetLog())); 3205 BoundNetLog()));
3207 3206
3208 ASSERT_TRUE(pool_->HasGroup("a")); 3207 ASSERT_TRUE(pool_->HasGroup("a"));
3209 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3208 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3210 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3209 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3211 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3210 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3212 3211
3213 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3212 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3214 3213
3215 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3214 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3216 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3215 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3217 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3216 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3218 3217
3219 ClientSocketHandle handle2; 3218 ClientSocketHandle handle2;
3220 TestCompletionCallback callback2; 3219 TestCompletionCallback callback2;
3221 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3220 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3222 params_, 3221 params_,
3223 kDefaultPriority, 3222 DEFAULT_PRIORITY,
3224 callback2.callback(), 3223 callback2.callback(),
3225 pool_.get(), 3224 pool_.get(),
3226 BoundNetLog())); 3225 BoundNetLog()));
3227 3226
3228 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3227 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3229 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3228 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3230 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3229 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3231 3230
3232 EXPECT_EQ(OK, callback1.WaitForResult()); 3231 EXPECT_EQ(OK, callback1.WaitForResult());
3233 EXPECT_EQ(OK, callback2.WaitForResult()); 3232 EXPECT_EQ(OK, callback2.WaitForResult());
3234 handle1.Reset(); 3233 handle1.Reset();
3235 handle2.Reset(); 3234 handle2.Reset();
3236 3235
3237 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3236 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3238 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3237 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3239 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3238 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3240 } 3239 }
3241 3240
3242 TEST_F(ClientSocketPoolBaseTest, 3241 TEST_F(ClientSocketPoolBaseTest,
3243 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { 3242 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3244 CreatePool(4, 4); 3243 CreatePool(4, 4);
3245 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3244 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3246 3245
3247 ClientSocketHandle handle1; 3246 ClientSocketHandle handle1;
3248 TestCompletionCallback callback1; 3247 TestCompletionCallback callback1;
3249 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3248 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3250 params_, 3249 params_,
3251 kDefaultPriority, 3250 DEFAULT_PRIORITY,
3252 callback1.callback(), 3251 callback1.callback(),
3253 pool_.get(), 3252 pool_.get(),
3254 BoundNetLog())); 3253 BoundNetLog()));
3255 3254
3256 ClientSocketHandle handle2; 3255 ClientSocketHandle handle2;
3257 TestCompletionCallback callback2; 3256 TestCompletionCallback callback2;
3258 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3257 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a",
3259 params_, 3258 params_,
3260 kDefaultPriority, 3259 DEFAULT_PRIORITY,
3261 callback2.callback(), 3260 callback2.callback(),
3262 pool_.get(), 3261 pool_.get(),
3263 BoundNetLog())); 3262 BoundNetLog()));
3264 3263
3265 ClientSocketHandle handle3; 3264 ClientSocketHandle handle3;
3266 TestCompletionCallback callback3; 3265 TestCompletionCallback callback3;
3267 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 3266 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a",
3268 params_, 3267 params_,
3269 kDefaultPriority, 3268 DEFAULT_PRIORITY,
3270 callback3.callback(), 3269 callback3.callback(),
3271 pool_.get(), 3270 pool_.get(),
3272 BoundNetLog())); 3271 BoundNetLog()));
3273 3272
3274 ASSERT_TRUE(pool_->HasGroup("a")); 3273 ASSERT_TRUE(pool_->HasGroup("a"));
3275 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3274 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3276 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3275 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3277 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3276 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3278 3277
3279 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3278 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 } 3340 }
3342 3341
3343 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { 3342 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3344 CreatePool(4, 4); 3343 CreatePool(4, 4);
3345 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3344 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3346 3345
3347 ClientSocketHandle handle1; 3346 ClientSocketHandle handle1;
3348 TestCompletionCallback callback1; 3347 TestCompletionCallback callback1;
3349 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3348 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3350 params_, 3349 params_,
3351 kDefaultPriority, 3350 DEFAULT_PRIORITY,
3352 callback1.callback(), 3351 callback1.callback(),
3353 pool_.get(), 3352 pool_.get(),
3354 BoundNetLog())); 3353 BoundNetLog()));
3355 ASSERT_EQ(OK, callback1.WaitForResult()); 3354 ASSERT_EQ(OK, callback1.WaitForResult());
3356 handle1.Reset(); 3355 handle1.Reset();
3357 3356
3358 ASSERT_TRUE(pool_->HasGroup("a")); 3357 ASSERT_TRUE(pool_->HasGroup("a"));
3359 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3358 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3360 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3359 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3361 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3360 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3362 3361
3363 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3362 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3364 3363
3365 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3364 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3366 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3365 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3367 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3366 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3368 } 3367 }
3369 3368
3370 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { 3369 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3371 CreatePool(4, 4); 3370 CreatePool(4, 4);
3372 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3371 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3373 3372
3374 ClientSocketHandle handle1; 3373 ClientSocketHandle handle1;
3375 TestCompletionCallback callback1; 3374 TestCompletionCallback callback1;
3376 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3375 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3377 params_, 3376 params_,
3378 kDefaultPriority, 3377 DEFAULT_PRIORITY,
3379 callback1.callback(), 3378 callback1.callback(),
3380 pool_.get(), 3379 pool_.get(),
3381 BoundNetLog())); 3380 BoundNetLog()));
3382 ASSERT_EQ(OK, callback1.WaitForResult()); 3381 ASSERT_EQ(OK, callback1.WaitForResult());
3383 3382
3384 ASSERT_TRUE(pool_->HasGroup("a")); 3383 ASSERT_TRUE(pool_->HasGroup("a"));
3385 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3384 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3386 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3385 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3387 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3386 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3388 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3387 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
3445 3444
3446 pool_->RequestSockets("a", &params_, 2, BoundNetLog()); 3445 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3447 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3446 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3448 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3447 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
3449 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3448 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3450 3449
3451 ClientSocketHandle handle1; 3450 ClientSocketHandle handle1;
3452 TestCompletionCallback callback1; 3451 TestCompletionCallback callback1;
3453 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3452 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3454 params_, 3453 params_,
3455 kDefaultPriority, 3454 DEFAULT_PRIORITY,
3456 callback1.callback(), 3455 callback1.callback(),
3457 pool_.get(), 3456 pool_.get(),
3458 BoundNetLog())); 3457 BoundNetLog()));
3459 ASSERT_EQ(OK, callback1.WaitForResult()); 3458 ASSERT_EQ(OK, callback1.WaitForResult());
3460 3459
3461 ClientSocketHandle handle2; 3460 ClientSocketHandle handle2;
3462 TestCompletionCallback callback2; 3461 TestCompletionCallback callback2;
3463 int rv = handle2.Init("a", 3462 int rv = handle2.Init("a",
3464 params_, 3463 params_,
3465 kDefaultPriority, 3464 DEFAULT_PRIORITY,
3466 callback2.callback(), 3465 callback2.callback(),
3467 pool_.get(), 3466 pool_.get(),
3468 BoundNetLog()); 3467 BoundNetLog());
3469 if (rv != OK) { 3468 if (rv != OK) {
3470 EXPECT_EQ(ERR_IO_PENDING, rv); 3469 EXPECT_EQ(ERR_IO_PENDING, rv);
3471 EXPECT_EQ(OK, callback2.WaitForResult()); 3470 EXPECT_EQ(OK, callback2.WaitForResult());
3472 } 3471 }
3473 3472
3474 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3473 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3475 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3474 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
3524 3523
3525 ASSERT_TRUE(pool_->HasGroup("a")); 3524 ASSERT_TRUE(pool_->HasGroup("a"));
3526 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3525 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3527 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3526 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3528 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3527 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3529 3528
3530 ClientSocketHandle handle1; 3529 ClientSocketHandle handle1;
3531 TestCompletionCallback callback1; 3530 TestCompletionCallback callback1;
3532 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3531 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3533 params_, 3532 params_,
3534 kDefaultPriority, 3533 DEFAULT_PRIORITY,
3535 callback1.callback(), 3534 callback1.callback(),
3536 pool_.get(), 3535 pool_.get(),
3537 BoundNetLog())); 3536 BoundNetLog()));
3538 3537
3539 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3538 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3540 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3539 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3541 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3540 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3542 3541
3543 ASSERT_EQ(OK, callback1.WaitForResult()); 3542 ASSERT_EQ(OK, callback1.WaitForResult());
3544 3543
(...skipping 14 matching lines...) Expand all
3559 3558
3560 ASSERT_TRUE(pool_->HasGroup("a")); 3559 ASSERT_TRUE(pool_->HasGroup("a"));
3561 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3560 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3562 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3561 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3563 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3562 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3564 3563
3565 ClientSocketHandle handle; 3564 ClientSocketHandle handle;
3566 TestCompletionCallback callback; 3565 TestCompletionCallback callback;
3567 EXPECT_EQ(OK, handle.Init("a", 3566 EXPECT_EQ(OK, handle.Init("a",
3568 params_, 3567 params_,
3569 kDefaultPriority, 3568 DEFAULT_PRIORITY,
3570 callback.callback(), 3569 callback.callback(),
3571 pool_.get(), 3570 pool_.get(),
3572 BoundNetLog())); 3571 BoundNetLog()));
3573 3572
3574 // Make sure the idle socket was used. 3573 // Make sure the idle socket was used.
3575 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3574 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3576 3575
3577 TestLoadTimingInfoConnectedReused(handle); 3576 TestLoadTimingInfoConnectedReused(handle);
3578 handle.Reset(); 3577 handle.Reset();
3579 TestLoadTimingInfoNotConnected(handle); 3578 TestLoadTimingInfoNotConnected(handle);
3580 } 3579 }
3581 3580
3582 // http://crbug.com/64940 regression test. 3581 // http://crbug.com/64940 regression test.
3583 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { 3582 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3584 const int kMaxTotalSockets = 3; 3583 const int kMaxTotalSockets = 3;
3585 const int kMaxSocketsPerGroup = 2; 3584 const int kMaxSocketsPerGroup = 2;
3586 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); 3585 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3586 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3588 3587
3589 // Note that group name ordering matters here. "a" comes before "b", so 3588 // Note that group name ordering matters here. "a" comes before "b", so
3590 // CloseOneIdleSocket() will try to close "a"'s idle socket. 3589 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3591 3590
3592 // Set up one idle socket in "a". 3591 // Set up one idle socket in "a".
3593 ClientSocketHandle handle1; 3592 ClientSocketHandle handle1;
3594 TestCompletionCallback callback1; 3593 TestCompletionCallback callback1;
3595 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3594 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a",
3596 params_, 3595 params_,
3597 kDefaultPriority, 3596 DEFAULT_PRIORITY,
3598 callback1.callback(), 3597 callback1.callback(),
3599 pool_.get(), 3598 pool_.get(),
3600 BoundNetLog())); 3599 BoundNetLog()));
3601 3600
3602 ASSERT_EQ(OK, callback1.WaitForResult()); 3601 ASSERT_EQ(OK, callback1.WaitForResult());
3603 handle1.Reset(); 3602 handle1.Reset();
3604 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3603 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3605 3604
3606 // Set up two active sockets in "b". 3605 // Set up two active sockets in "b".
3607 ClientSocketHandle handle2; 3606 ClientSocketHandle handle2;
3608 TestCompletionCallback callback2; 3607 TestCompletionCallback callback2;
3609 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", 3608 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b",
3610 params_, 3609 params_,
3611 kDefaultPriority, 3610 DEFAULT_PRIORITY,
3612 callback1.callback(), 3611 callback1.callback(),
3613 pool_.get(), 3612 pool_.get(),
3614 BoundNetLog())); 3613 BoundNetLog()));
3615 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", 3614 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b",
3616 params_, 3615 params_,
3617 kDefaultPriority, 3616 DEFAULT_PRIORITY,
3618 callback2.callback(), 3617 callback2.callback(),
3619 pool_.get(), 3618 pool_.get(),
3620 BoundNetLog())); 3619 BoundNetLog()));
3621 3620
3622 ASSERT_EQ(OK, callback1.WaitForResult()); 3621 ASSERT_EQ(OK, callback1.WaitForResult());
3623 ASSERT_EQ(OK, callback2.WaitForResult()); 3622 ASSERT_EQ(OK, callback2.WaitForResult());
3624 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); 3623 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3625 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3624 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
3626 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); 3625 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3627 3626
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
3695 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3694 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3696 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3695 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3697 base::MessageLoop::current()->RunUntilIdle(); 3696 base::MessageLoop::current()->RunUntilIdle();
3698 3697
3699 // Make the backup job be a pending job, so it completes normally. 3698 // Make the backup job be a pending job, so it completes normally.
3700 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3699 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3701 ClientSocketHandle handle; 3700 ClientSocketHandle handle;
3702 TestCompletionCallback callback; 3701 TestCompletionCallback callback;
3703 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3702 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
3704 params_, 3703 params_,
3705 kDefaultPriority, 3704 DEFAULT_PRIORITY,
3706 callback.callback(), 3705 callback.callback(),
3707 pool_.get(), 3706 pool_.get(),
3708 BoundNetLog())); 3707 BoundNetLog()));
3709 // Timer has started, but the backup connect job shouldn't be created yet. 3708 // Timer has started, but the backup connect job shouldn't be created yet.
3710 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3709 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3711 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3710 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3712 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3711 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3713 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3712 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3714 ASSERT_EQ(OK, callback.WaitForResult()); 3713 ASSERT_EQ(OK, callback.WaitForResult());
3715 3714
3716 // The hung connect job should still be there, but everything else should be 3715 // The hung connect job should still be there, but everything else should be
3717 // complete. 3716 // complete.
3718 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3717 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3719 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3718 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3720 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3719 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3721 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3720 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3722 } 3721 }
3723 3722
3724 class MockLayeredPool : public HigherLayeredPool { 3723 class MockLayeredPool : public HigherLayeredPool {
3725 public: 3724 public:
3726 MockLayeredPool(TestClientSocketPool* pool, 3725 MockLayeredPool(TestClientSocketPool* pool,
3727 const std::string& group_name) 3726 const std::string& group_name)
3728 : pool_(pool), 3727 : pool_(pool),
3729 params_(new TestSocketParams),
3730 group_name_(group_name), 3728 group_name_(group_name),
3731 can_release_connection_(true) { 3729 can_release_connection_(true) {
3732 pool_->AddHigherLayeredPool(this); 3730 pool_->AddHigherLayeredPool(this);
3733 } 3731 }
3734 3732
3735 ~MockLayeredPool() { 3733 ~MockLayeredPool() {
3736 pool_->RemoveHigherLayeredPool(this); 3734 pool_->RemoveHigherLayeredPool(this);
3737 } 3735 }
3738 3736
3739 int RequestSocket(TestClientSocketPool* pool) { 3737 int RequestSocket(TestClientSocketPool* pool) {
3740 return handle_.Init(group_name_, params_, kDefaultPriority, 3738 scoped_refptr<TestSocketParams> params(
3739 new TestSocketParams(false /* ignore_limits */));
3740 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
3741 callback_.callback(), pool, BoundNetLog()); 3741 callback_.callback(), pool, BoundNetLog());
3742 } 3742 }
3743 3743
3744 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { 3744 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
3745 params_->set_ignore_limits(true); 3745 scoped_refptr<TestSocketParams> params(
3746 return handle_.Init(group_name_, params_, kDefaultPriority, 3746 new TestSocketParams(true /* ignore_limits */));
3747 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
3747 callback_.callback(), pool, BoundNetLog()); 3748 callback_.callback(), pool, BoundNetLog());
3748 } 3749 }
3749 3750
3750 bool ReleaseOneConnection() { 3751 bool ReleaseOneConnection() {
3751 if (!handle_.is_initialized() || !can_release_connection_) { 3752 if (!handle_.is_initialized() || !can_release_connection_) {
3752 return false; 3753 return false;
3753 } 3754 }
3754 handle_.socket()->Disconnect(); 3755 handle_.socket()->Disconnect();
3755 handle_.Reset(); 3756 handle_.Reset();
3756 return true; 3757 return true;
3757 } 3758 }
3758 3759
3759 void set_can_release_connection(bool can_release_connection) { 3760 void set_can_release_connection(bool can_release_connection) {
3760 can_release_connection_ = can_release_connection; 3761 can_release_connection_ = can_release_connection;
3761 } 3762 }
3762 3763
3763 MOCK_METHOD0(CloseOneIdleConnection, bool()); 3764 MOCK_METHOD0(CloseOneIdleConnection, bool());
3764 3765
3765 private: 3766 private:
3766 TestClientSocketPool* const pool_; 3767 TestClientSocketPool* const pool_;
3767 scoped_refptr<TestSocketParams> params_;
3768 ClientSocketHandle handle_; 3768 ClientSocketHandle handle_;
3769 TestCompletionCallback callback_; 3769 TestCompletionCallback callback_;
3770 const std::string group_name_; 3770 const std::string group_name_;
3771 bool can_release_connection_; 3771 bool can_release_connection_;
3772 }; 3772 };
3773 3773
3774 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { 3774 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3775 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3775 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3776 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3776 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3777 3777
(...skipping 24 matching lines...) Expand all
3802 3802
3803 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); 3803 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
3804 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3804 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3805 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3805 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3806 .WillOnce(Invoke(&mock_layered_pool, 3806 .WillOnce(Invoke(&mock_layered_pool,
3807 &MockLayeredPool::ReleaseOneConnection)); 3807 &MockLayeredPool::ReleaseOneConnection));
3808 ClientSocketHandle handle; 3808 ClientSocketHandle handle;
3809 TestCompletionCallback callback; 3809 TestCompletionCallback callback;
3810 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3810 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
3811 params_, 3811 params_,
3812 kDefaultPriority, 3812 DEFAULT_PRIORITY,
3813 callback.callback(), 3813 callback.callback(),
3814 pool_.get(), 3814 pool_.get(),
3815 BoundNetLog())); 3815 BoundNetLog()));
3816 EXPECT_EQ(OK, callback.WaitForResult()); 3816 EXPECT_EQ(OK, callback.WaitForResult());
3817 } 3817 }
3818 3818
3819 // Same as above, but the idle socket is in the same group as the stalled 3819 // Same as above, but the idle socket is in the same group as the stalled
3820 // socket, and closes the only other request in its group when closing requests 3820 // socket, and closes the only other request in its group when closing requests
3821 // in higher layered pools. This generally shouldn't happen, but it may be 3821 // in higher layered pools. This generally shouldn't happen, but it may be
3822 // possible if a higher level pool issues a request and the request is 3822 // possible if a higher level pool issues a request and the request is
3823 // subsequently cancelled. Even if it's not possible, best not to crash. 3823 // subsequently cancelled. Even if it's not possible, best not to crash.
3824 TEST_F(ClientSocketPoolBaseTest, 3824 TEST_F(ClientSocketPoolBaseTest,
3825 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { 3825 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3826 CreatePool(2, 2); 3826 CreatePool(2, 2);
3827 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3827 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3828 3828
3829 // Need a socket in another group for the pool to be stalled (If a group 3829 // Need a socket in another group for the pool to be stalled (If a group
3830 // has the maximum number of connections already, it's not stalled). 3830 // has the maximum number of connections already, it's not stalled).
3831 ClientSocketHandle handle1; 3831 ClientSocketHandle handle1;
3832 TestCompletionCallback callback1; 3832 TestCompletionCallback callback1;
3833 EXPECT_EQ(OK, handle1.Init("group1", 3833 EXPECT_EQ(OK, handle1.Init("group1",
3834 params_, 3834 params_,
3835 kDefaultPriority, 3835 DEFAULT_PRIORITY,
3836 callback1.callback(), 3836 callback1.callback(),
3837 pool_.get(), 3837 pool_.get(),
3838 BoundNetLog())); 3838 BoundNetLog()));
3839 3839
3840 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3840 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3841 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3841 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3842 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3842 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3843 .WillOnce(Invoke(&mock_layered_pool, 3843 .WillOnce(Invoke(&mock_layered_pool,
3844 &MockLayeredPool::ReleaseOneConnection)); 3844 &MockLayeredPool::ReleaseOneConnection));
3845 ClientSocketHandle handle; 3845 ClientSocketHandle handle;
3846 TestCompletionCallback callback2; 3846 TestCompletionCallback callback2;
3847 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2", 3847 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2",
3848 params_, 3848 params_,
3849 kDefaultPriority, 3849 DEFAULT_PRIORITY,
3850 callback2.callback(), 3850 callback2.callback(),
3851 pool_.get(), 3851 pool_.get(),
3852 BoundNetLog())); 3852 BoundNetLog()));
3853 EXPECT_EQ(OK, callback2.WaitForResult()); 3853 EXPECT_EQ(OK, callback2.WaitForResult());
3854 } 3854 }
3855 3855
3856 // Tests the case when an idle socket can be closed when a new request is 3856 // Tests the case when an idle socket can be closed when a new request is
3857 // issued, and the new request belongs to a group that was previously stalled. 3857 // issued, and the new request belongs to a group that was previously stalled.
3858 TEST_F(ClientSocketPoolBaseTest, 3858 TEST_F(ClientSocketPoolBaseTest,
3859 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { 3859 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3860 CreatePool(2, 2); 3860 CreatePool(2, 2);
3861 std::list<TestConnectJob::JobType> job_types; 3861 std::list<TestConnectJob::JobType> job_types;
3862 job_types.push_back(TestConnectJob::kMockJob); 3862 job_types.push_back(TestConnectJob::kMockJob);
3863 job_types.push_back(TestConnectJob::kMockJob); 3863 job_types.push_back(TestConnectJob::kMockJob);
3864 job_types.push_back(TestConnectJob::kMockJob); 3864 job_types.push_back(TestConnectJob::kMockJob);
3865 job_types.push_back(TestConnectJob::kMockJob); 3865 job_types.push_back(TestConnectJob::kMockJob);
3866 connect_job_factory_->set_job_types(&job_types); 3866 connect_job_factory_->set_job_types(&job_types);
3867 3867
3868 ClientSocketHandle handle1; 3868 ClientSocketHandle handle1;
3869 TestCompletionCallback callback1; 3869 TestCompletionCallback callback1;
3870 EXPECT_EQ(OK, handle1.Init("group1", 3870 EXPECT_EQ(OK, handle1.Init("group1",
3871 params_, 3871 params_,
3872 kDefaultPriority, 3872 DEFAULT_PRIORITY,
3873 callback1.callback(), 3873 callback1.callback(),
3874 pool_.get(), 3874 pool_.get(),
3875 BoundNetLog())); 3875 BoundNetLog()));
3876 3876
3877 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3877 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3878 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3878 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3879 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3879 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3880 .WillRepeatedly(Invoke(&mock_layered_pool, 3880 .WillRepeatedly(Invoke(&mock_layered_pool,
3881 &MockLayeredPool::ReleaseOneConnection)); 3881 &MockLayeredPool::ReleaseOneConnection));
3882 mock_layered_pool.set_can_release_connection(false); 3882 mock_layered_pool.set_can_release_connection(false);
3883 3883
3884 // The third request is made when the socket pool is in a stalled state. 3884 // The third request is made when the socket pool is in a stalled state.
3885 ClientSocketHandle handle3; 3885 ClientSocketHandle handle3;
3886 TestCompletionCallback callback3; 3886 TestCompletionCallback callback3;
3887 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", 3887 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3",
3888 params_, 3888 params_,
3889 kDefaultPriority, 3889 DEFAULT_PRIORITY,
3890 callback3.callback(), 3890 callback3.callback(),
3891 pool_.get(), 3891 pool_.get(),
3892 BoundNetLog())); 3892 BoundNetLog()));
3893 3893
3894 base::RunLoop().RunUntilIdle(); 3894 base::RunLoop().RunUntilIdle();
3895 EXPECT_FALSE(callback3.have_result()); 3895 EXPECT_FALSE(callback3.have_result());
3896 3896
3897 // The fourth request is made when the pool is no longer stalled. The third 3897 // The fourth request is made when the pool is no longer stalled. The third
3898 // request should be serviced first, since it was issued first and has the 3898 // request should be serviced first, since it was issued first and has the
3899 // same priority. 3899 // same priority.
3900 mock_layered_pool.set_can_release_connection(true); 3900 mock_layered_pool.set_can_release_connection(true);
3901 ClientSocketHandle handle4; 3901 ClientSocketHandle handle4;
3902 TestCompletionCallback callback4; 3902 TestCompletionCallback callback4;
3903 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", 3903 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3",
3904 params_, 3904 params_,
3905 kDefaultPriority, 3905 DEFAULT_PRIORITY,
3906 callback4.callback(), 3906 callback4.callback(),
3907 pool_.get(), 3907 pool_.get(),
3908 BoundNetLog())); 3908 BoundNetLog()));
3909 EXPECT_EQ(OK, callback3.WaitForResult()); 3909 EXPECT_EQ(OK, callback3.WaitForResult());
3910 EXPECT_FALSE(callback4.have_result()); 3910 EXPECT_FALSE(callback4.have_result());
3911 3911
3912 // Closing a handle should free up another socket slot. 3912 // Closing a handle should free up another socket slot.
3913 handle1.Reset(); 3913 handle1.Reset();
3914 EXPECT_EQ(OK, callback4.WaitForResult()); 3914 EXPECT_EQ(OK, callback4.WaitForResult());
3915 } 3915 }
(...skipping 11 matching lines...) Expand all
3927 job_types.push_back(TestConnectJob::kMockJob); 3927 job_types.push_back(TestConnectJob::kMockJob);
3928 job_types.push_back(TestConnectJob::kMockJob); 3928 job_types.push_back(TestConnectJob::kMockJob);
3929 job_types.push_back(TestConnectJob::kMockJob); 3929 job_types.push_back(TestConnectJob::kMockJob);
3930 job_types.push_back(TestConnectJob::kMockJob); 3930 job_types.push_back(TestConnectJob::kMockJob);
3931 connect_job_factory_->set_job_types(&job_types); 3931 connect_job_factory_->set_job_types(&job_types);
3932 3932
3933 ClientSocketHandle handle1; 3933 ClientSocketHandle handle1;
3934 TestCompletionCallback callback1; 3934 TestCompletionCallback callback1;
3935 EXPECT_EQ(OK, handle1.Init("group1", 3935 EXPECT_EQ(OK, handle1.Init("group1",
3936 params_, 3936 params_,
3937 kDefaultPriority, 3937 DEFAULT_PRIORITY,
3938 callback1.callback(), 3938 callback1.callback(),
3939 pool_.get(), 3939 pool_.get(),
3940 BoundNetLog())); 3940 BoundNetLog()));
3941 3941
3942 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3942 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
3943 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3943 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get()));
3944 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3944 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3945 .WillRepeatedly(Invoke(&mock_layered_pool, 3945 .WillRepeatedly(Invoke(&mock_layered_pool,
3946 &MockLayeredPool::ReleaseOneConnection)); 3946 &MockLayeredPool::ReleaseOneConnection));
3947 mock_layered_pool.set_can_release_connection(false); 3947 mock_layered_pool.set_can_release_connection(false);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3990 &MockLayeredPool::ReleaseOneConnection)); 3990 &MockLayeredPool::ReleaseOneConnection));
3991 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); 3991 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
3992 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); 3992 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()));
3993 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) 3993 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3994 .WillRepeatedly(Invoke(&mock_layered_pool2, 3994 .WillRepeatedly(Invoke(&mock_layered_pool2,
3995 &MockLayeredPool::ReleaseOneConnection)); 3995 &MockLayeredPool::ReleaseOneConnection));
3996 ClientSocketHandle handle; 3996 ClientSocketHandle handle;
3997 TestCompletionCallback callback; 3997 TestCompletionCallback callback;
3998 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3998 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a",
3999 params_, 3999 params_,
4000 kDefaultPriority, 4000 DEFAULT_PRIORITY,
4001 callback.callback(), 4001 callback.callback(),
4002 pool_.get(), 4002 pool_.get(),
4003 BoundNetLog())); 4003 BoundNetLog()));
4004 EXPECT_EQ(OK, callback.WaitForResult()); 4004 EXPECT_EQ(OK, callback.WaitForResult());
4005 } 4005 }
4006 4006
4007 // Test that when a socket pool and group are at their limits, a request 4007 // Test that when a socket pool and group are at their limits, a request
4008 // with |ignore_limits| triggers creation of a new socket, and gets the socket 4008 // with |ignore_limits| triggers creation of a new socket, and gets the socket
4009 // instead of a request with the same priority that was issued earlier, but 4009 // instead of a request with the same priority that was issued earlier, but
4010 // that does not have |ignore_limits| set. 4010 // that does not have |ignore_limits| set.
4011 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { 4011 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
4012 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); 4012 scoped_refptr<TestSocketParams> params_ignore_limits(
4013 params_ignore_limits->set_ignore_limits(true); 4013 new TestSocketParams(true /* ignore_limits */));
4014 CreatePool(1, 1); 4014 CreatePool(1, 1);
4015 4015
4016 // Issue a request to reach the socket pool limit. 4016 // Issue a request to reach the socket pool limit.
4017 EXPECT_EQ(OK, StartRequestWithParams("a", kDefaultPriority, params_)); 4017 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
4018 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4018 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4019 4019
4020 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 4020 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4021 4021
4022 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", kDefaultPriority, 4022 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
4023 params_)); 4023 params_));
4024 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4024 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4025 4025
4026 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", kDefaultPriority, 4026 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
4027 params_ignore_limits)); 4027 params_ignore_limits));
4028 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4028 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4029 4029
4030 EXPECT_EQ(OK, request(2)->WaitForResult()); 4030 EXPECT_EQ(OK, request(2)->WaitForResult());
4031 EXPECT_FALSE(request(1)->have_result()); 4031 EXPECT_FALSE(request(1)->have_result());
4032 } 4032 }
4033 4033
4034 // Test that when a socket pool and group are at their limits, a request with
4035 // |ignore_limits| set triggers creation of a new socket, and gets the socket
4036 // instead of a request with a higher priority that was issued earlier, but
4037 // that does not have |ignore_limits| set.
4038 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsLowPriority) {
4039 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams());
4040 params_ignore_limits->set_ignore_limits(true);
4041 CreatePool(1, 1);
4042
4043 // Issue a request to reach the socket pool limit.
4044 EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_));
4045 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4046
4047 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4048
4049 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_));
4050 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4051
4052 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", LOW,
4053 params_ignore_limits));
4054 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4055
4056 EXPECT_EQ(OK, request(2)->WaitForResult());
4057 EXPECT_FALSE(request(1)->have_result());
4058 }
4059
4060 // Test that when a socket pool and group are at their limits, a request with
4061 // |ignore_limits| set triggers creation of a new socket, and gets the socket
4062 // instead of a request with a higher priority that was issued later and
4063 // does not have |ignore_limits| set.
4064 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsLowPriority2) {
4065 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams());
4066 params_ignore_limits->set_ignore_limits(true);
4067 CreatePool(1, 1);
4068
4069 // Issue a request to reach the socket pool limit.
4070 EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_));
4071 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4072
4073 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4074
4075 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", LOW,
4076 params_ignore_limits));
4077 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4078
4079 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_));
4080 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4081
4082 EXPECT_EQ(OK, request(1)->WaitForResult());
4083 EXPECT_FALSE(request(2)->have_result());
4084 }
4085
4086 // Test that when a socket pool and group are at their limits, a ConnectJob 4034 // Test that when a socket pool and group are at their limits, a ConnectJob
4087 // issued for a request with |ignore_limits| set is not cancelled when a request 4035 // issued for a request with |ignore_limits| set is not cancelled when a request
4088 // without |ignore_limits| issued to the same group is cancelled. 4036 // without |ignore_limits| issued to the same group is cancelled.
4089 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { 4037 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
4090 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); 4038 scoped_refptr<TestSocketParams> params_ignore_limits(
4091 params_ignore_limits->set_ignore_limits(true); 4039 new TestSocketParams(true /* ignore_limits */));
4092 CreatePool(1, 1); 4040 CreatePool(1, 1);
4093 4041
4094 // Issue a request to reach the socket pool limit. 4042 // Issue a request to reach the socket pool limit.
4095 EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); 4043 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_));
4096 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4044 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4097 4045
4098 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 4046 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4099 4047
4100 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); 4048 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
4049 params_));
4101 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4050 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4102 4051
4103 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, 4052 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY,
4104 params_ignore_limits)); 4053 params_ignore_limits));
4105 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4054 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4106 4055
4107 // Cancel the pending request without ignore_limits set. The ConnectJob 4056 // Cancel the pending request without ignore_limits set. The ConnectJob
4108 // should not be cancelled. 4057 // should not be cancelled.
4109 request(1)->handle()->Reset(); 4058 request(1)->handle()->Reset();
4110 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4059 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4111 4060
4112 EXPECT_EQ(OK, request(2)->WaitForResult()); 4061 EXPECT_EQ(OK, request(2)->WaitForResult());
4113 EXPECT_FALSE(request(1)->have_result()); 4062 EXPECT_FALSE(request(1)->have_result());
4114 } 4063 }
4115 4064
4116 // More involved test of ignore limits. Issues a bunch of requests and later
4117 // checks the order in which they receive sockets.
4118 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsOrder) {
4119 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams());
4120 params_ignore_limits->set_ignore_limits(true);
4121 CreatePool(1, 1);
4122
4123 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4124
4125 // Requests 0 and 1 do not have ignore_limits set, so they finish last. Since
4126 // the maximum number of sockets per pool is 1, the second requests does not
4127 // trigger a ConnectJob.
4128 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_));
4129 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_));
4130
4131 // Requests 2 and 3 have ignore_limits set, but have a low priority, so they
4132 // finish just before the first two.
4133 EXPECT_EQ(ERR_IO_PENDING,
4134 StartRequestWithParams("a", LOW, params_ignore_limits));
4135 EXPECT_EQ(ERR_IO_PENDING,
4136 StartRequestWithParams("a", LOW, params_ignore_limits));
4137
4138 // Request 4 finishes first, since it is high priority and ignores limits.
4139 EXPECT_EQ(ERR_IO_PENDING,
4140 StartRequestWithParams("a", HIGHEST, params_ignore_limits));
4141
4142 // Request 5 and 6 are cancelled right after starting. This should result in
4143 // creating two ConnectJobs. Since only one request (Request 1) did not
4144 // result in creating a ConnectJob, only one of the ConnectJobs should be
4145 // cancelled when the requests are.
4146 EXPECT_EQ(ERR_IO_PENDING,
4147 StartRequestWithParams("a", HIGHEST, params_ignore_limits));
4148 EXPECT_EQ(ERR_IO_PENDING,
4149 StartRequestWithParams("a", HIGHEST, params_ignore_limits));
4150 EXPECT_EQ(6, pool_->NumConnectJobsInGroup("a"));
4151 request(5)->handle()->Reset();
4152 EXPECT_EQ(6, pool_->NumConnectJobsInGroup("a"));
4153 request(6)->handle()->Reset();
4154 ASSERT_EQ(5, pool_->NumConnectJobsInGroup("a"));
4155
4156 // Wait for the last request to get a socket.
4157 EXPECT_EQ(OK, request(1)->WaitForResult());
4158
4159 // Check order in which requests received sockets.
4160 // These are 1-based indices, while request(x) uses 0-based indices.
4161 EXPECT_EQ(1, GetOrderOfRequest(5));
4162 EXPECT_EQ(2, GetOrderOfRequest(3));
4163 EXPECT_EQ(3, GetOrderOfRequest(4));
4164 EXPECT_EQ(4, GetOrderOfRequest(1));
4165 EXPECT_EQ(5, GetOrderOfRequest(2));
4166 }
4167
4168 } // namespace 4065 } // namespace
4169 4066
4170 } // namespace net 4067 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_base.cc ('k') | net/url_request/url_fetcher_core.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698