diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-18 17:39:54 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-18 17:39:54 +0000 |
commit | 38839c8c3c5940c5903e631b7fd14b120b63caa0 (patch) | |
tree | 8d41d54a013a1625b30602cca9bc4c7a8114f0d7 /net/base/tcp_client_socket_pool_unittest.cc | |
parent | e72e8eb8fb4eb2daf5c4fd0e003e2eee04611ba6 (diff) | |
download | chromium_src-38839c8c3c5940c5903e631b7fd14b120b63caa0.zip chromium_src-38839c8c3c5940c5903e631b7fd14b120b63caa0.tar.gz chromium_src-38839c8c3c5940c5903e631b7fd14b120b63caa0.tar.bz2 |
Fix crashes stemming from ClientSocketPoolBase::ReleaseSocket().
BUG=http://crbug.com/13908
TEST=Go to a page that loads lots of content from the same host, and then triggers a redirect (which will cancel the requests). A good example is http://photo.sora.net/album/theme/index.php. Unittest coverage provided in TCPClientSocketPoolTest.CancelActiveRequestWithPendingRequests.
Review URL: http://codereview.chromium.org/131023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18718 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/tcp_client_socket_pool_unittest.cc')
-rw-r--r-- | net/base/tcp_client_socket_pool_unittest.cc | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/net/base/tcp_client_socket_pool_unittest.cc b/net/base/tcp_client_socket_pool_unittest.cc index 5334190..7892cb0 100644 --- a/net/base/tcp_client_socket_pool_unittest.cc +++ b/net/base/tcp_client_socket_pool_unittest.cc @@ -222,6 +222,12 @@ class TCPClientSocketPoolTest : public testing::Test { TestSocketRequest::completion_count = 0; } + virtual void TearDown() { + // The tests often call Reset() on handles at the end which may post + // DoReleaseSocket() tasks. + MessageLoop::current()->RunAllPending(); + } + ScopedHostMapper scoped_host_mapper_; HostResolver host_resolver_; MockClientSocketFactory client_socket_factory_; @@ -243,9 +249,6 @@ TEST_F(TCPClientSocketPoolTest, Basic) { EXPECT_TRUE(handle.socket()); handle.Reset(); - - // The handle's Reset method may have posted a task. - MessageLoop::current()->RunAllPending(); } TEST_F(TCPClientSocketPoolTest, InitHostResolutionFailure) { @@ -408,8 +411,6 @@ TEST_F(TCPClientSocketPoolTest, TwoRequestsCancelOne) { EXPECT_EQ(OK, req2.WaitForResult()); req2.handle.Reset(); - // The handle's Reset method may have posted a task. - MessageLoop::current()->RunAllPending(); } TEST_F(TCPClientSocketPoolTest, ConnectCancelConnect) { @@ -439,8 +440,6 @@ TEST_F(TCPClientSocketPoolTest, ConnectCancelConnect) { EXPECT_FALSE(callback.have_result()); handle.Reset(); - // The handle's Reset method may have posted a task. - MessageLoop::current()->RunAllPending(); } TEST_F(TCPClientSocketPoolTest, CancelRequest) { @@ -551,8 +550,37 @@ TEST_F(TCPClientSocketPoolTest, RequestTwice) { EXPECT_EQ(OK, callback.WaitForResult()); handle.Reset(); - // The handle's Reset method may have posted a task. - MessageLoop::current()->RunAllPending(); +} + +// Make sure that pending requests get serviced after active requests get +// cancelled. +TEST_F(TCPClientSocketPoolTest, CancelActiveRequestWithPendingRequests) { + client_socket_factory_.set_client_socket_type( + MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET); + + scoped_ptr<TestSocketRequest> reqs[kNumRequests]; + + // Queue up all the requests + + HostResolver::RequestInfo info("www.google.com", 80); + 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", info, 5, reqs[i].get()); + EXPECT_EQ(ERR_IO_PENDING, rv); + } + + // Now, kMaxSocketsPerGroup requests should be active. Let's cancel them. + for (int i = 0; i < kMaxSocketsPerGroup; ++i) + 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(); + } + + EXPECT_EQ(kNumPendingRequests, TestSocketRequest::completion_count); } } // namespace |