Chromium Code Reviews| Index: net/socket/client_socket_pool_base_unittest.cc |
| diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc |
| index 7bb5ae71eb5b6976e68bd39b8ddb1a365007ce90..0258e933ce8c15e5d82826e050aea0599166fd69 100644 |
| --- a/net/socket/client_socket_pool_base_unittest.cc |
| +++ b/net/socket/client_socket_pool_base_unittest.cc |
| @@ -30,6 +30,8 @@ const int kNumPendingRequests = arraysize(kPriorities); |
| const int kNumRequests = kMaxSocketsPerGroup + kNumPendingRequests; |
| +const int kDefaultPriority = 5; |
| + |
| class MockClientSocket : public ClientSocket { |
| public: |
| MockClientSocket() : connected_(false) {} |
| @@ -55,7 +57,7 @@ class MockClientSocket : public ClientSocket { |
| virtual void Disconnect() { connected_ = false; } |
| virtual bool IsConnected() const { return connected_; } |
| virtual bool IsConnectedAndIdle() const { return connected_; } |
| - |
| + |
| #if defined(OS_LINUX) |
| virtual int GetPeerName(struct sockaddr* /* name */, |
| socklen_t* /* namelen */) { |
| @@ -292,6 +294,49 @@ class ClientSocketPoolBaseTest : public testing::Test { |
| MessageLoop::current()->RunAllPending(); |
| } |
| + void CreateConnections(scoped_ptr<TestSocketRequest>* reqs, size_t count) { |
|
willchan no longer on Chromium
2009/07/06 17:11:03
It strikes me as odd that you have |count| as a va
|
| + for (size_t i = 0; i < count; ++i) |
| + reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); |
| + |
| + // Create connections or queue up requests. |
| + for (int i = 0; i < kMaxSocketsPerGroup; ++i) { |
| + int rv = reqs[i]->handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, reqs[i].get()); |
| + EXPECT_EQ(OK, rv); |
| + request_order_.push_back(reqs[i].get()); |
| + } |
| + |
| + // The rest are pending since we've used all active sockets. |
| + for (int i = 0; i < kNumPendingRequests; ++i) { |
| + int rv = reqs[kMaxSocketsPerGroup + i]->handle.Init( |
| + "a", ignored_request_info_, kPriorities[i], |
| + reqs[kMaxSocketsPerGroup + i].get()); |
| + EXPECT_EQ(ERR_IO_PENDING, rv); |
| + } |
| + } |
| + |
| + enum KeepAlive { |
| + KEEP_ALIVE, |
| + NO_KEEP_ALIVE, |
| + }; |
| + |
| + void ReleaseAllConnections(scoped_ptr<TestSocketRequest>* reqs, |
| + size_t count, KeepAlive keep_alive) { |
| + bool released_one; |
| + do { |
| + released_one = false; |
| + for (size_t i = 0; i < count; ++i) { |
| + if (reqs[i]->handle.is_initialized()) { |
| + if (keep_alive == NO_KEEP_ALIVE) |
| + reqs[i]->handle.socket()->Disconnect(); |
| + reqs[i]->handle.Reset(); |
| + MessageLoop::current()->RunAllPending(); |
| + released_one = true; |
| + } |
| + } |
| + } while (released_one); |
| + } |
| + |
| HostResolver::RequestInfo ignored_request_info_; |
| MockClientSocketFactory client_socket_factory_; |
| TestConnectJobFactory* const connect_job_factory_; |
| @@ -302,8 +347,8 @@ class ClientSocketPoolBaseTest : public testing::Test { |
| TEST_F(ClientSocketPoolBaseTest, Basic) { |
| TestCompletionCallback callback; |
| ClientSocketHandle handle(pool_.get()); |
| - int rv = handle.Init("a", ignored_request_info_, 0, &callback); |
| - EXPECT_EQ(OK, rv); |
| + EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, |
| + &callback)); |
| EXPECT_TRUE(handle.is_initialized()); |
| EXPECT_TRUE(handle.socket()); |
| handle.Reset(); |
| @@ -313,43 +358,15 @@ TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { |
| connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
| TestSocketRequest req(pool_.get(), &request_order_); |
| EXPECT_EQ(ERR_CONNECTION_FAILED, |
| - req.handle.Init("a", ignored_request_info_, 5, &req)); |
| + req.handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &req)); |
| } |
| TEST_F(ClientSocketPoolBaseTest, PendingRequests) { |
| scoped_ptr<TestSocketRequest> reqs[kNumRequests]; |
| - for (size_t i = 0; i < arraysize(reqs); ++i) |
| - reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); |
| - |
| - // Create connections or queue up requests. |
| - |
| - for (int i = 0; i < kMaxSocketsPerGroup; ++i) { |
| - int rv = reqs[i]->handle.Init("a", ignored_request_info_, 5, reqs[i].get()); |
| - EXPECT_EQ(OK, rv); |
| - request_order_.push_back(reqs[i].get()); |
| - } |
| - |
| - // The rest are pending since we've used all active sockets. |
| - for (int i = 0; i < kNumPendingRequests; ++i) { |
| - int rv = reqs[kMaxSocketsPerGroup + i]->handle.Init( |
| - "a", ignored_request_info_, kPriorities[i], |
| - reqs[kMaxSocketsPerGroup + i].get()); |
| - EXPECT_EQ(ERR_IO_PENDING, rv); |
| - } |
| - |
| - // Release any connections until we have no connections. |
| - bool released_one; |
| - do { |
| - released_one = false; |
| - for (size_t i = 0; i < arraysize(reqs); ++i) { |
| - if (reqs[i]->handle.is_initialized()) { |
| - reqs[i]->handle.Reset(); |
| - MessageLoop::current()->RunAllPending(); |
| - released_one = true; |
| - } |
| - } |
| - } while (released_one); |
| + CreateConnections(reqs, arraysize(reqs)); |
| + ReleaseAllConnections(reqs, arraysize(reqs), KEEP_ALIVE); |
| EXPECT_EQ(kMaxSocketsPerGroup, client_socket_factory_.allocation_count()); |
| EXPECT_EQ(kNumPendingRequests, TestSocketRequest::completion_count); |
| @@ -374,37 +391,9 @@ TEST_F(ClientSocketPoolBaseTest, PendingRequests) { |
| TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { |
| scoped_ptr<TestSocketRequest> reqs[kNumRequests]; |
| - for (size_t i = 0; i < arraysize(reqs); ++i) |
| - reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); |
| - |
| - // Create connections or queue up requests. |
| - for (int i = 0; i < kMaxSocketsPerGroup; ++i) { |
| - int rv = reqs[i]->handle.Init("a", ignored_request_info_, 5, reqs[i].get()); |
| - EXPECT_EQ(OK, rv); |
| - request_order_.push_back(reqs[i].get()); |
| - } |
| - // The rest are pending since we've used all active sockets. |
| - for (int i = 0; i < kNumPendingRequests; ++i) { |
| - int rv = reqs[kMaxSocketsPerGroup + i]->handle.Init( |
| - "a", ignored_request_info_, kPriorities[i], |
| - reqs[kMaxSocketsPerGroup + i].get()); |
| - EXPECT_EQ(ERR_IO_PENDING, rv); |
| - } |
| - |
| - // Release any connections until we have no connections. |
| - bool released_one; |
| - do { |
| - released_one = false; |
| - for (size_t i = 0; i < arraysize(reqs); ++i) { |
| - if (reqs[i]->handle.is_initialized()) { |
| - reqs[i]->handle.socket()->Disconnect(); // No keep alive. |
| - reqs[i]->handle.Reset(); |
| - MessageLoop::current()->RunAllPending(); |
| - released_one = true; |
| - } |
| - } |
| - } while (released_one); |
| + CreateConnections(reqs, arraysize(reqs)); |
| + ReleaseAllConnections(reqs, arraysize(reqs), NO_KEEP_ALIVE); |
| for (int i = kMaxSocketsPerGroup; i < kNumRequests; ++i) |
| EXPECT_EQ(OK, reqs[i]->WaitForResult()); |
| @@ -420,7 +409,8 @@ TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { |
| connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| TestSocketRequest req(pool_.get(), &request_order_); |
| EXPECT_EQ(ERR_IO_PENDING, |
| - req.handle.Init("a", ignored_request_info_, 5, &req)); |
| + req.handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &req)); |
| req.handle.Reset(); |
| } |
| @@ -430,9 +420,11 @@ TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { |
| TestSocketRequest req2(pool_.get(), &request_order_); |
| EXPECT_EQ(ERR_IO_PENDING, |
| - req.handle.Init("a", ignored_request_info_, 5, &req)); |
| + req.handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &req)); |
| EXPECT_EQ(ERR_IO_PENDING, |
| - req2.handle.Init("a", ignored_request_info_, 5, &req2)); |
| + req2.handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &req2)); |
| req.handle.Reset(); |
| @@ -447,13 +439,15 @@ TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { |
| TestSocketRequest req(pool_.get(), &request_order_); |
| EXPECT_EQ(ERR_IO_PENDING, |
| - handle.Init("a", ignored_request_info_, 5, &callback)); |
| + handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &callback)); |
| handle.Reset(); |
| TestCompletionCallback callback2; |
| EXPECT_EQ(ERR_IO_PENDING, |
| - handle.Init("a", ignored_request_info_, 5, &callback2)); |
| + handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &callback2)); |
| EXPECT_EQ(OK, callback2.WaitForResult()); |
| EXPECT_FALSE(callback.have_result()); |
| @@ -464,40 +458,14 @@ TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { |
| TEST_F(ClientSocketPoolBaseTest, CancelRequest) { |
| scoped_ptr<TestSocketRequest> reqs[kNumRequests]; |
| - for (size_t i = 0; i < arraysize(reqs); ++i) |
| - reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); |
| - |
| - // Create connections or queue up requests. |
| - for (int i = 0; i < kMaxSocketsPerGroup; ++i) { |
| - int rv = reqs[i]->handle.Init("a", ignored_request_info_, 5, reqs[i].get()); |
| - EXPECT_EQ(OK, rv); |
| - request_order_.push_back(reqs[i].get()); |
| - } |
| - |
| - // The rest are pending since we've used all active sockets. |
| - for (int i = 0; i < kNumPendingRequests; ++i) { |
| - EXPECT_EQ(ERR_IO_PENDING, reqs[kMaxSocketsPerGroup + i]->handle.Init( |
| - "a", ignored_request_info_, kPriorities[i], |
| - reqs[kMaxSocketsPerGroup + i].get())); |
| - } |
| + CreateConnections(reqs, arraysize(reqs)); |
| // Cancel a request. |
| size_t index_to_cancel = kMaxSocketsPerGroup + 2; |
| EXPECT_TRUE(!reqs[index_to_cancel]->handle.is_initialized()); |
| reqs[index_to_cancel]->handle.Reset(); |
| - // Release any connections until we have no connections. |
| - bool released_one; |
| - do { |
| - released_one = false; |
| - for (size_t i = 0; i < arraysize(reqs); ++i) { |
| - if (reqs[i]->handle.is_initialized()) { |
| - reqs[i]->handle.Reset(); |
| - MessageLoop::current()->RunAllPending(); |
| - released_one = true; |
| - } |
| - } |
| - } while (released_one); |
| + ReleaseAllConnections(reqs, arraysize(reqs), KEEP_ALIVE); |
| EXPECT_EQ(kMaxSocketsPerGroup, client_socket_factory_.allocation_count()); |
| EXPECT_EQ(kNumPendingRequests - 1, TestSocketRequest::completion_count); |
| @@ -542,7 +510,8 @@ class RequestSocketCallback : public CallbackRunner< Tuple1<int> > { |
| handle_->Reset(); |
| within_callback_ = true; |
| int rv = handle_->Init( |
| - "a", HostResolver::RequestInfo("www.google.com", 80), 0, this); |
| + "a", HostResolver::RequestInfo("www.google.com", 80), |
| + kDefaultPriority, this); |
| switch (next_job_type_) { |
| case TestConnectJob::kMockJob: |
| EXPECT_EQ(OK, rv); |
| @@ -570,12 +539,12 @@ class RequestSocketCallback : public CallbackRunner< Tuple1<int> > { |
| }; |
| TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { |
| - connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| + connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| ClientSocketHandle handle(pool_.get()); |
| RequestSocketCallback callback( |
| &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); |
| int rv = handle.Init( |
| - "a", ignored_request_info_, 0, &callback); |
| + "a", ignored_request_info_, kDefaultPriority, &callback); |
| ASSERT_EQ(ERR_IO_PENDING, rv); |
| EXPECT_EQ(OK, callback.WaitForResult()); |
| @@ -583,12 +552,12 @@ TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { |
| } |
| TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { |
| - connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| + connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| ClientSocketHandle handle(pool_.get()); |
| RequestSocketCallback callback( |
| &handle, connect_job_factory_, TestConnectJob::kMockJob); |
| int rv = handle.Init( |
| - "a", ignored_request_info_, 0, &callback); |
| + "a", ignored_request_info_, kDefaultPriority, &callback); |
| ASSERT_EQ(ERR_IO_PENDING, rv); |
| EXPECT_EQ(OK, callback.WaitForResult()); |
| @@ -598,14 +567,15 @@ TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { |
| // Make sure that pending requests get serviced after active requests get |
| // cancelled. |
| TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { |
| - connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| + connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| scoped_ptr<TestSocketRequest> reqs[kNumRequests]; |
| // Queue up all the requests |
| for (size_t i = 0; i < arraysize(reqs); ++i) { |
| reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); |
| - int rv = reqs[i]->handle.Init("a", ignored_request_info_, 5, reqs[i].get()); |
| + int rv = reqs[i]->handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, reqs[i].get()); |
| EXPECT_EQ(ERR_IO_PENDING, rv); |
| } |
| @@ -614,7 +584,6 @@ TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { |
| reqs[i]->handle.Reset(); |
| // Let's wait for the rest to complete now. |
| - |
| for (size_t i = kMaxSocketsPerGroup; i < arraysize(reqs); ++i) { |
| EXPECT_EQ(OK, reqs[i]->WaitForResult()); |
| reqs[i]->handle.Reset(); |
| @@ -625,14 +594,15 @@ TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { |
| // Make sure that pending requests get serviced after active requests fail. |
| TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { |
| - connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| + connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| scoped_ptr<TestSocketRequest> reqs[kMaxSocketsPerGroup * 2 + 1]; |
| // Queue up all the requests |
| for (size_t i = 0; i < arraysize(reqs); ++i) { |
| reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); |
| - int rv = reqs[i]->handle.Init("a", ignored_request_info_, 5, reqs[i].get()); |
| + int rv = reqs[i]->handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, reqs[i].get()); |
| EXPECT_EQ(ERR_IO_PENDING, rv); |
| } |
| @@ -645,24 +615,25 @@ TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { |
| // should be first though. |
| TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { |
| // First two jobs are async. |
| - connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| + connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| // Start job 1 (async error). |
| TestSocketRequest req1(pool_.get(), &request_order_); |
| - int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); |
| + int rv = req1.handle.Init("a", ignored_request_info_, |
| + kDefaultPriority, &req1); |
| EXPECT_EQ(ERR_IO_PENDING, rv); |
| // Start job 2 (async error). |
| TestSocketRequest req2(pool_.get(), &request_order_); |
| - rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); |
| + rv = req2.handle.Init("a", ignored_request_info_, kDefaultPriority, &req2); |
| EXPECT_EQ(ERR_IO_PENDING, rv); |
| // The pending job is sync. |
| - connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| + connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| // Request 3 does not have a ConnectJob yet. It's just pending. |
| TestSocketRequest req3(pool_.get(), &request_order_); |
| - rv = req3.handle.Init("a", ignored_request_info_, 5, &req3); |
| + rv = req3.handle.Init("a", ignored_request_info_, kDefaultPriority, &req3); |
| EXPECT_EQ(ERR_IO_PENDING, rv); |
| EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); |