Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
| 6 | 6 |
| 7 #include <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 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 420 | 420 |
| 421 class TestConnectJobFactory | 421 class TestConnectJobFactory |
| 422 : public TestClientSocketPoolBase::ConnectJobFactory { | 422 : public TestClientSocketPoolBase::ConnectJobFactory { |
| 423 public: | 423 public: |
| 424 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory, | 424 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory, |
| 425 NetLog* net_log) | 425 NetLog* net_log) |
| 426 : job_type_(TestConnectJob::kMockJob), | 426 : job_type_(TestConnectJob::kMockJob), |
| 427 job_types_(NULL), | 427 job_types_(NULL), |
| 428 client_socket_factory_(client_socket_factory), | 428 client_socket_factory_(client_socket_factory), |
| 429 net_log_(net_log) { | 429 net_log_(net_log) { |
| 430 } | 430 } |
| 431 | 431 |
| 432 virtual ~TestConnectJobFactory() {} | 432 virtual ~TestConnectJobFactory() {} |
| 433 | 433 |
| 434 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } | 434 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } |
| 435 | 435 |
| 436 void set_job_types(std::list<TestConnectJob::JobType>* job_types) { | 436 void set_job_types(std::list<TestConnectJob::JobType>* job_types) { |
| 437 job_types_ = job_types; | 437 job_types_ = job_types; |
| 438 CHECK(!job_types_->empty()); | 438 CHECK(!job_types_->empty()); |
| 439 } | 439 } |
| 440 | 440 |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 693 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, | 693 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, |
| 694 &net_log_); | 694 &net_log_); |
| 695 pool_.reset(new TestClientSocketPool(max_sockets, | 695 pool_.reset(new TestClientSocketPool(max_sockets, |
| 696 max_sockets_per_group, | 696 max_sockets_per_group, |
| 697 &histograms_, | 697 &histograms_, |
| 698 unused_idle_socket_timeout, | 698 unused_idle_socket_timeout, |
| 699 used_idle_socket_timeout, | 699 used_idle_socket_timeout, |
| 700 connect_job_factory_)); | 700 connect_job_factory_)); |
| 701 } | 701 } |
| 702 | 702 |
| 703 int StartRequest(const std::string& group_name, | 703 int StartRequestWithParams( |
| 704 net::RequestPriority priority) { | 704 const std::string& group_name, |
| 705 RequestPriority priority, | |
| 706 const scoped_refptr<TestSocketParams>& params) { | |
| 705 return test_base_.StartRequestUsingPool< | 707 return test_base_.StartRequestUsingPool< |
| 706 TestClientSocketPool, TestSocketParams>( | 708 TestClientSocketPool, TestSocketParams>( |
| 707 pool_.get(), group_name, priority, params_); | 709 pool_.get(), group_name, priority, params); |
| 710 } | |
| 711 | |
| 712 int StartRequest(const std::string& group_name, RequestPriority priority) { | |
| 713 return StartRequestWithParams(group_name, priority, params_); | |
| 708 } | 714 } |
| 709 | 715 |
| 710 int GetOrderOfRequest(size_t index) const { | 716 int GetOrderOfRequest(size_t index) const { |
| 711 return test_base_.GetOrderOfRequest(index); | 717 return test_base_.GetOrderOfRequest(index); |
| 712 } | 718 } |
| 713 | 719 |
| 714 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { | 720 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { |
| 715 return test_base_.ReleaseOneConnection(keep_alive); | 721 return test_base_.ReleaseOneConnection(keep_alive); |
| 716 } | 722 } |
| 717 | 723 |
| (...skipping 3122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3840 TestCompletionCallback callback; | 3846 TestCompletionCallback callback; |
| 3841 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 3847 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", |
| 3842 params_, | 3848 params_, |
| 3843 kDefaultPriority, | 3849 kDefaultPriority, |
| 3844 callback.callback(), | 3850 callback.callback(), |
| 3845 pool_.get(), | 3851 pool_.get(), |
| 3846 BoundNetLog())); | 3852 BoundNetLog())); |
| 3847 EXPECT_EQ(OK, callback.WaitForResult()); | 3853 EXPECT_EQ(OK, callback.WaitForResult()); |
| 3848 } | 3854 } |
| 3849 | 3855 |
| 3856 // Test that when a socket pool and group are at their limits, a request | |
| 3857 // with |ignore_limits| triggers creation of a new socket, and gets the socket | |
| 3858 // instead of a request with the same priority that was issued earlier, but | |
| 3859 // that does not have |ignore_limits| set. | |
| 3860 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { | |
| 3861 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); | |
| 3862 params_ignore_limits->set_ignore_limits(true); | |
| 3863 CreatePool(1, 1); | |
| 3864 | |
| 3865 // Issue a request to reach the socket pool limit. | |
| 3866 EXPECT_EQ(OK, StartRequestWithParams("a", kDefaultPriority, params_)); | |
| 3867 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3868 | |
| 3869 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | |
| 3870 | |
| 3871 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", kDefaultPriority, | |
| 3872 params_)); | |
| 3873 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3874 | |
| 3875 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", kDefaultPriority, | |
| 3876 params_ignore_limits)); | |
| 3877 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | |
| 3878 | |
| 3879 EXPECT_EQ(OK, request(2)->WaitForResult()); | |
| 3880 EXPECT_FALSE(request(1)->have_result()); | |
| 3881 } | |
| 3882 | |
| 3883 // Test that when a socket pool and group are their limits, a request with | |
|
eroman
2013/06/04 20:42:21
"are at"
mmenke
2013/06/05 04:32:24
Done.
| |
| 3884 // |ignore_limits| set triggers creation of a new socket, and gets the socket | |
| 3885 // instead of a request with a higher priority that was issued earlier, but | |
| 3886 // that does not have |ignore_limits| set. | |
| 3887 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsLowPriority) { | |
| 3888 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); | |
| 3889 params_ignore_limits->set_ignore_limits(true); | |
| 3890 CreatePool(1, 1); | |
| 3891 | |
| 3892 // Issue a request to reach the socket pool limit. | |
| 3893 EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3894 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3895 | |
| 3896 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | |
| 3897 | |
| 3898 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3899 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3900 | |
| 3901 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", LOW, | |
| 3902 params_ignore_limits)); | |
| 3903 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | |
| 3904 | |
| 3905 EXPECT_EQ(OK, request(2)->WaitForResult()); | |
| 3906 EXPECT_FALSE(request(1)->have_result()); | |
| 3907 } | |
| 3908 | |
| 3909 // Test that when a socket pool and group are at their limits, a request with | |
| 3910 // |ignore_limits| set triggers creation of a new socket, and gets the socket | |
| 3911 // instead of a request with a higher priority that was issued later and | |
| 3912 // does not have |ignore_limits| set. | |
| 3913 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsLowPriority2) { | |
| 3914 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); | |
| 3915 params_ignore_limits->set_ignore_limits(true); | |
| 3916 CreatePool(1, 1); | |
| 3917 | |
| 3918 // Issue a request to reach the socket pool limit. | |
| 3919 EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3920 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3921 | |
| 3922 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | |
| 3923 | |
| 3924 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", LOW, | |
| 3925 params_ignore_limits)); | |
| 3926 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | |
| 3927 | |
| 3928 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3929 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | |
| 3930 | |
| 3931 EXPECT_EQ(OK, request(1)->WaitForResult()); | |
| 3932 EXPECT_FALSE(request(2)->have_result()); | |
| 3933 } | |
| 3934 | |
| 3935 // Test that when a socket pool and group are at their limits, a ConnectJob | |
| 3936 // issued for a request with |ignore_limits| set is not cancelled when a request | |
| 3937 // without |ignore_limits| issued to the same group is cancelled. | |
| 3938 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { | |
| 3939 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); | |
| 3940 params_ignore_limits->set_ignore_limits(true); | |
| 3941 CreatePool(1, 1); | |
| 3942 | |
| 3943 // Issue a request to reach the socket pool limit. | |
| 3944 EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3945 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3946 | |
| 3947 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | |
| 3948 | |
| 3949 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3950 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | |
| 3951 | |
| 3952 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, | |
| 3953 params_ignore_limits)); | |
| 3954 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | |
| 3955 | |
| 3956 // Cancel the pending request without ignore_limits set. The ConnectJob | |
| 3957 // should not be cancelled. | |
| 3958 request(1)->handle()->Reset(); | |
| 3959 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | |
| 3960 | |
| 3961 EXPECT_EQ(OK, request(2)->WaitForResult()); | |
| 3962 EXPECT_FALSE(request(1)->have_result()); | |
| 3963 } | |
| 3964 | |
| 3965 // More involved test of ignore limits. Issues a bunch of requests and later | |
| 3966 // checks the order in which they receive sockets. | |
| 3967 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsOrder) { | |
| 3968 scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); | |
| 3969 params_ignore_limits->set_ignore_limits(true); | |
| 3970 CreatePool(1, 1); | |
| 3971 | |
| 3972 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | |
| 3973 | |
| 3974 // Requests 0 and 1 do not have ignore_limits set, so they finish last. Since | |
| 3975 // the maximum number of sockets per pool is 1, the second requests does not | |
| 3976 // trigger a ConnectJob. | |
| 3977 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3978 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); | |
| 3979 | |
| 3980 // Requests 2 and 3 have ignore_limits set, but have a low priority, so they | |
| 3981 // finish just before the first two. | |
| 3982 EXPECT_EQ(ERR_IO_PENDING, | |
| 3983 StartRequestWithParams("a", LOW, params_ignore_limits)); | |
| 3984 EXPECT_EQ(ERR_IO_PENDING, | |
| 3985 StartRequestWithParams("a", LOW, params_ignore_limits)); | |
| 3986 | |
| 3987 // Request 4 finishes first, since it is high priority and ignores limits. | |
| 3988 EXPECT_EQ(ERR_IO_PENDING, | |
| 3989 StartRequestWithParams("a", HIGHEST, params_ignore_limits)); | |
| 3990 | |
| 3991 // Request 5 and 6 are cancelled right after starting. This should result in | |
| 3992 // creating two ConnectJobs. Since only one request (Request 1) did not | |
| 3993 // result in creating a ConnectJob, only one of the ConnectJobs should be | |
| 3994 // cancelled when the requests are. | |
| 3995 EXPECT_EQ(ERR_IO_PENDING, | |
| 3996 StartRequestWithParams("a", HIGHEST, params_ignore_limits)); | |
| 3997 EXPECT_EQ(ERR_IO_PENDING, | |
| 3998 StartRequestWithParams("a", HIGHEST, params_ignore_limits)); | |
| 3999 EXPECT_EQ(6, pool_->NumConnectJobsInGroup("a")); | |
| 4000 request(5)->handle()->Reset(); | |
| 4001 EXPECT_EQ(6, pool_->NumConnectJobsInGroup("a")); | |
| 4002 request(6)->handle()->Reset(); | |
| 4003 ASSERT_EQ(5, pool_->NumConnectJobsInGroup("a")); | |
| 4004 | |
| 4005 // Wait for the last request to get a socket. | |
| 4006 EXPECT_EQ(OK, request(1)->WaitForResult()); | |
| 4007 | |
| 4008 // Check order in which requests received sockets. | |
| 4009 // These are 1-based indices, while request(x) uses 0-based indices. | |
| 4010 EXPECT_EQ(1, GetOrderOfRequest(5)); | |
| 4011 EXPECT_EQ(2, GetOrderOfRequest(3)); | |
| 4012 EXPECT_EQ(3, GetOrderOfRequest(4)); | |
| 4013 EXPECT_EQ(4, GetOrderOfRequest(1)); | |
| 4014 EXPECT_EQ(5, GetOrderOfRequest(2)); | |
| 4015 } | |
| 3850 | 4016 |
| 3851 } // namespace | 4017 } // namespace |
| 3852 | 4018 |
| 3853 } // namespace net | 4019 } // namespace net |
| OLD | NEW |