Index: net/socket/client_socket_pool_base_unittest.cc |
=================================================================== |
--- net/socket/client_socket_pool_base_unittest.cc (revision 203448) |
+++ net/socket/client_socket_pool_base_unittest.cc (working copy) |
@@ -427,7 +427,7 @@ |
job_types_(NULL), |
client_socket_factory_(client_socket_factory), |
net_log_(net_log) { |
-} |
+ } |
virtual ~TestConnectJobFactory() {} |
@@ -700,13 +700,19 @@ |
connect_job_factory_)); |
} |
- int StartRequest(const std::string& group_name, |
- net::RequestPriority priority) { |
+ int StartRequestWithParams( |
+ const std::string& group_name, |
+ RequestPriority priority, |
+ const scoped_refptr<TestSocketParams>& params) { |
return test_base_.StartRequestUsingPool< |
TestClientSocketPool, TestSocketParams>( |
- pool_.get(), group_name, priority, params_); |
+ pool_.get(), group_name, priority, params); |
} |
+ int StartRequest(const std::string& group_name, RequestPriority priority) { |
+ return StartRequestWithParams(group_name, priority, params_); |
+ } |
+ |
int GetOrderOfRequest(size_t index) const { |
return test_base_.GetOrderOfRequest(index); |
} |
@@ -3847,7 +3853,167 @@ |
EXPECT_EQ(OK, callback.WaitForResult()); |
} |
+// Test that when a socket pool and group are at their limits, a request |
+// with |ignore_limits| triggers creation of a new socket, and gets the socket |
+// instead of a request with the same priority that was issued earlier, but |
+// that does not have |ignore_limits| set. |
+TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { |
+ scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); |
+ params_ignore_limits->set_ignore_limits(true); |
+ CreatePool(1, 1); |
+ // Issue a request to reach the socket pool limit. |
+ EXPECT_EQ(OK, StartRequestWithParams("a", kDefaultPriority, params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", kDefaultPriority, |
+ params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", kDefaultPriority, |
+ params_ignore_limits)); |
+ ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(OK, request(2)->WaitForResult()); |
+ EXPECT_FALSE(request(1)->have_result()); |
+} |
+ |
+// 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.
|
+// |ignore_limits| set triggers creation of a new socket, and gets the socket |
+// instead of a request with a higher priority that was issued earlier, but |
+// that does not have |ignore_limits| set. |
+TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsLowPriority) { |
+ scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); |
+ params_ignore_limits->set_ignore_limits(true); |
+ CreatePool(1, 1); |
+ |
+ // Issue a request to reach the socket pool limit. |
+ EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", LOW, |
+ params_ignore_limits)); |
+ ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(OK, request(2)->WaitForResult()); |
+ EXPECT_FALSE(request(1)->have_result()); |
+} |
+ |
+// Test that when a socket pool and group are at their limits, a request with |
+// |ignore_limits| set triggers creation of a new socket, and gets the socket |
+// instead of a request with a higher priority that was issued later and |
+// does not have |ignore_limits| set. |
+TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsLowPriority2) { |
+ scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); |
+ params_ignore_limits->set_ignore_limits(true); |
+ CreatePool(1, 1); |
+ |
+ // Issue a request to reach the socket pool limit. |
+ EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", LOW, |
+ params_ignore_limits)); |
+ ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(OK, request(1)->WaitForResult()); |
+ EXPECT_FALSE(request(2)->have_result()); |
+} |
+ |
+// Test that when a socket pool and group are at their limits, a ConnectJob |
+// issued for a request with |ignore_limits| set is not cancelled when a request |
+// without |ignore_limits| issued to the same group is cancelled. |
+TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { |
+ scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); |
+ params_ignore_limits->set_ignore_limits(true); |
+ CreatePool(1, 1); |
+ |
+ // Issue a request to reach the socket pool limit. |
+ EXPECT_EQ(OK, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, |
+ params_ignore_limits)); |
+ ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
+ |
+ // Cancel the pending request without ignore_limits set. The ConnectJob |
+ // should not be cancelled. |
+ request(1)->handle()->Reset(); |
+ ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
+ |
+ EXPECT_EQ(OK, request(2)->WaitForResult()); |
+ EXPECT_FALSE(request(1)->have_result()); |
+} |
+ |
+// More involved test of ignore limits. Issues a bunch of requests and later |
+// checks the order in which they receive sockets. |
+TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsOrder) { |
+ scoped_refptr<TestSocketParams> params_ignore_limits(new TestSocketParams()); |
+ params_ignore_limits->set_ignore_limits(true); |
+ CreatePool(1, 1); |
+ |
+ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
+ |
+ // Requests 0 and 1 do not have ignore_limits set, so they finish last. Since |
+ // the maximum number of sockets per pool is 1, the second requests does not |
+ // trigger a ConnectJob. |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); |
+ EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", HIGHEST, params_)); |
+ |
+ // Requests 2 and 3 have ignore_limits set, but have a low priority, so they |
+ // finish just before the first two. |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ StartRequestWithParams("a", LOW, params_ignore_limits)); |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ StartRequestWithParams("a", LOW, params_ignore_limits)); |
+ |
+ // Request 4 finishes first, since it is high priority and ignores limits. |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ StartRequestWithParams("a", HIGHEST, params_ignore_limits)); |
+ |
+ // Request 5 and 6 are cancelled right after starting. This should result in |
+ // creating two ConnectJobs. Since only one request (Request 1) did not |
+ // result in creating a ConnectJob, only one of the ConnectJobs should be |
+ // cancelled when the requests are. |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ StartRequestWithParams("a", HIGHEST, params_ignore_limits)); |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ StartRequestWithParams("a", HIGHEST, params_ignore_limits)); |
+ EXPECT_EQ(6, pool_->NumConnectJobsInGroup("a")); |
+ request(5)->handle()->Reset(); |
+ EXPECT_EQ(6, pool_->NumConnectJobsInGroup("a")); |
+ request(6)->handle()->Reset(); |
+ ASSERT_EQ(5, pool_->NumConnectJobsInGroup("a")); |
+ |
+ // Wait for the last request to get a socket. |
+ EXPECT_EQ(OK, request(1)->WaitForResult()); |
+ |
+ // Check order in which requests received sockets. |
+ // These are 1-based indices, while request(x) uses 0-based indices. |
+ EXPECT_EQ(1, GetOrderOfRequest(5)); |
+ EXPECT_EQ(2, GetOrderOfRequest(3)); |
+ EXPECT_EQ(3, GetOrderOfRequest(4)); |
+ EXPECT_EQ(4, GetOrderOfRequest(1)); |
+ EXPECT_EQ(5, GetOrderOfRequest(2)); |
+} |
+ |
} // namespace |
} // namespace net |