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

Unified Diff: net/proxy/multi_threaded_proxy_resolver_unittest.cc

Issue 1132943003: Deflake MultiThreadedProxyResolverTest.ThreeThreads_Basic. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/proxy/multi_threaded_proxy_resolver_unittest.cc
diff --git a/net/proxy/multi_threaded_proxy_resolver_unittest.cc b/net/proxy/multi_threaded_proxy_resolver_unittest.cc
index 2682b4641e9c3c992853e84fc05b2bdbcb3b4681..d270844a11afb31bde53e296a80303b763943bab 100644
--- a/net/proxy/multi_threaded_proxy_resolver_unittest.cc
+++ b/net/proxy/multi_threaded_proxy_resolver_unittest.cc
@@ -526,7 +526,7 @@ TEST_F(MultiThreadedProxyResolverTest, ThreeThreads_Basic) {
// One thread has been provisioned (i.e. one ProxyResolver was created).
ASSERT_EQ(1u, factory().resolvers().size());
- const int kNumRequests = 9;
+ const int kNumRequests = 8;
int rv;
TestCompletionCallback callback[kNumRequests];
ProxyInfo results[kNumRequests];
@@ -548,33 +548,32 @@ TEST_F(MultiThreadedProxyResolverTest, ThreeThreads_Basic) {
base::MessageLoop::current()->RunUntilIdle();
- // We now start 8 requests in parallel -- this will cause the maximum of
- // three threads to be provisioned (an additional two from what we already
- // have).
-
- for (int i = 1; i < kNumRequests; ++i) {
- rv = resolver().GetProxyForURL(
- GURL(base::StringPrintf("http://request%d", i)), &results[i],
- callback[i].callback(), &request[i], BoundNetLog());
- EXPECT_EQ(ERR_IO_PENDING, rv);
- }
-
- // Cancel 3 of the 8 oustanding requests.
- resolver().CancelRequest(request[1]);
- resolver().CancelRequest(request[3]);
- resolver().CancelRequest(request[6]);
-
- // Wait for the remaining requests to complete.
- int kNonCancelledRequests[] = {2, 4, 5, 7, 8};
- for (size_t i = 0; i < arraysize(kNonCancelledRequests); ++i) {
- int request_index = kNonCancelledRequests[i];
- EXPECT_GE(callback[request_index].WaitForResult(), 0);
- }
+ // We now block the first resolver to ensure a request is sent to the second
+ // thread.
+ factory().resolvers()[0]->Block();
+ rv = resolver().GetProxyForURL(GURL("http://request1"), &results[1],
+ callback[1].callback(), &request[1],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ rv = resolver().GetProxyForURL(GURL("http://request2"), &results[2],
+ callback[2].callback(), &request[2],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ EXPECT_EQ(0, callback[2].WaitForResult());
+ ASSERT_EQ(2u, factory().resolvers().size());
- // Check that the cancelled requests never invoked their callback.
- EXPECT_FALSE(callback[1].have_result());
- EXPECT_FALSE(callback[3].have_result());
- EXPECT_FALSE(callback[6].have_result());
+ // We now block the second resolver as well to ensure a request is sent to the
+ // third thread.
+ factory().resolvers()[1]->Block();
+ rv = resolver().GetProxyForURL(GURL("http://request3"), &results[3],
+ callback[3].callback(), &request[3],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ rv = resolver().GetProxyForURL(GURL("http://request4"), &results[4],
+ callback[4].callback(), &request[4],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ EXPECT_EQ(0, callback[4].WaitForResult());
// We should now have a total of 3 threads, each with its own ProxyResolver
// that will get initialized with the same data.
@@ -587,17 +586,41 @@ TEST_F(MultiThreadedProxyResolverTest, ThreeThreads_Basic) {
<< "i=" << i;
}
- // We don't know the exact ordering that requests ran on threads with,
- // but we do know the total count that should have reached the threads.
- // 8 total were submitted, and three were cancelled. Of the three that
- // were cancelled, one of them (request 1) was cancelled after it had
- // already been posted to the worker thread. So the resolvers will
- // have seen 6 total (and 1 from the run prior).
- int total_count = 0;
- for (int i = 0; i < 3; ++i) {
- total_count += factory().resolvers()[i]->request_count();
- }
- EXPECT_EQ(7, total_count);
+ // Start and cancel two requests. Since the first two threads are still
+ // blocked, they'll both be serviced by the third thread. The first request
+ // will reach the resolver, but the second will still be queued when canceled.
+ // Start a third request so we can be sure the resolver has completed running
+ // the first request.
+ rv = resolver().GetProxyForURL(GURL("http://request5"), &results[5],
+ callback[5].callback(), &request[5],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ rv = resolver().GetProxyForURL(GURL("http://request6"), &results[6],
+ callback[6].callback(), &request[6],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ rv = resolver().GetProxyForURL(GURL("http://request7"), &results[7],
+ callback[7].callback(), &request[7],
+ BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ resolver().CancelRequest(request[5]);
+ resolver().CancelRequest(request[6]);
+
+ EXPECT_EQ(2, callback[7].WaitForResult());
+
+ // Check that the cancelled requests never invoked their callback.
+ EXPECT_FALSE(callback[5].have_result());
+ EXPECT_FALSE(callback[6].have_result());
+
+ // Unblock the first two threads and wait for their requests to complete.
+ factory().resolvers()[0]->Unblock();
+ factory().resolvers()[1]->Unblock();
+ EXPECT_EQ(1, callback[1].WaitForResult());
+ EXPECT_EQ(1, callback[3].WaitForResult());
+
+ EXPECT_EQ(2, factory().resolvers()[0]->request_count());
+ EXPECT_EQ(2, factory().resolvers()[1]->request_count());
+ EXPECT_EQ(3, factory().resolvers()[2]->request_count());
}
// Tests using two threads. The first request hangs the first thread. Checks
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698