summaryrefslogtreecommitdiffstats
path: root/net/base/tcp_client_socket_pool_unittest.cc
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-18 17:39:54 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-18 17:39:54 +0000
commit38839c8c3c5940c5903e631b7fd14b120b63caa0 (patch)
tree8d41d54a013a1625b30602cca9bc4c7a8114f0d7 /net/base/tcp_client_socket_pool_unittest.cc
parente72e8eb8fb4eb2daf5c4fd0e003e2eee04611ba6 (diff)
downloadchromium_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.cc46
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