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

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

Issue 15927019: net: Socket pools prioritize requests with ignore_limits (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Remove bonus spaces. Created 7 years, 6 months 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
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 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698