| Index: chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc (revision 7403)
|
| +++ chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc (working copy)
|
| @@ -51,6 +51,7 @@
|
| // This groups the messages by their request ID. The groups will be in order
|
| // that the first message for each request ID was received, and the messages
|
| // within the groups will be in the order that they appeared.
|
| + // Note that this clears messages_.
|
| typedef std::vector< std::vector<IPC::Message> > ClassifiedMessages;
|
| void GetClassifiedMessages(ClassifiedMessages* msgs);
|
|
|
| @@ -71,7 +72,7 @@
|
| if (id == cur_id) {
|
| cur_requests.push_back(messages_[i]);
|
| messages_.erase(messages_.begin() + i);
|
| - i --;
|
| + i--;
|
| }
|
| }
|
| messages_.erase(messages_.begin());
|
| @@ -106,7 +107,10 @@
|
| message_loop_.RunAllPending();
|
| }
|
|
|
| - void MakeTestRequest(int request_id, const GURL& url);
|
| + void MakeTestRequest(int render_process_id,
|
| + int render_view_id,
|
| + int request_id,
|
| + const GURL& url);
|
| void MakeCancelRequest(int request_id);
|
|
|
| void EnsureTestSchemeIsAllowed() {
|
| @@ -128,12 +132,14 @@
|
| MessageLoop::current()->RunAllPending();
|
| }
|
|
|
| -void ResourceDispatcherHostTest::MakeTestRequest(int request_id,
|
| +void ResourceDispatcherHostTest::MakeTestRequest(int render_process_id,
|
| + int render_view_id,
|
| + int request_id,
|
| const GURL& url) {
|
| ViewHostMsg_Resource_Request request = CreateResourceRequest("GET", url);
|
|
|
| - host_.BeginRequest(this, GetCurrentProcess(), 0, MSG_ROUTING_NONE,
|
| - request_id, request, NULL, NULL);
|
| + host_.BeginRequest(this, GetCurrentProcess(), render_process_id,
|
| + render_view_id, request_id, request, NULL, NULL);
|
| KickOffRequest();
|
| }
|
|
|
| @@ -183,9 +189,9 @@
|
|
|
| // Tests whether many messages get dispatched properly.
|
| TEST_F(ResourceDispatcherHostTest, TestMany) {
|
| - MakeTestRequest(1, URLRequestTestJob::test_url_1());
|
| - MakeTestRequest(2, URLRequestTestJob::test_url_2());
|
| - MakeTestRequest(3, URLRequestTestJob::test_url_3());
|
| + MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3());
|
|
|
| // flush all the pending requests
|
| while (URLRequestTestJob::ProcessOnePendingMessage());
|
| @@ -207,9 +213,9 @@
|
| TEST_F(ResourceDispatcherHostTest, Cancel) {
|
| ResourceDispatcherHost host(NULL);
|
|
|
| - MakeTestRequest(1, URLRequestTestJob::test_url_1());
|
| - MakeTestRequest(2, URLRequestTestJob::test_url_2());
|
| - MakeTestRequest(3, URLRequestTestJob::test_url_3());
|
| + MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3());
|
| MakeCancelRequest(2);
|
|
|
| // flush all the pending requests
|
| @@ -277,7 +283,7 @@
|
| KickOffRequest();
|
|
|
| // request 2 goes to us
|
| - MakeTestRequest(2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 2, URLRequestTestJob::test_url_2());
|
|
|
| // request 3 goes to the test delegate
|
| request.url = URLRequestTestJob::test_url_3();
|
| @@ -314,3 +320,139 @@
|
| CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2());
|
| }
|
|
|
| +// Tests blocking and resuming requests.
|
| +TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) {
|
| + host_.BlockRequestsForRenderView(0, 1);
|
| + host_.BlockRequestsForRenderView(0, 2);
|
| + host_.BlockRequestsForRenderView(0, 3);
|
| +
|
| + MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3());
|
| + MakeTestRequest(0, 1, 4, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 2, 5, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 3, 6, URLRequestTestJob::test_url_3());
|
| +
|
| + // Flush all the pending requests
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| +
|
| + // Sort out all the messages we saw by request
|
| + ResourceIPCAccumulator::ClassifiedMessages msgs;
|
| + accum_.GetClassifiedMessages(&msgs);
|
| +
|
| + // All requests but the 2 for the RVH 0 should have been blocked.
|
| + ASSERT_EQ(2, msgs.size());
|
| +
|
| + CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
|
| + CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
|
| +
|
| + // Resume requests for RVH 1 and flush pending requests.
|
| + host_.ResumeBlockedRequestsForRenderView(0, 1);
|
| + KickOffRequest();
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| +
|
| + msgs.clear();
|
| + accum_.GetClassifiedMessages(&msgs);
|
| + ASSERT_EQ(2, msgs.size());
|
| + CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2());
|
| + CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_1());
|
| +
|
| + // Test that new requests are not blocked for RVH 1.
|
| + MakeTestRequest(0, 1, 7, URLRequestTestJob::test_url_1());
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| + msgs.clear();
|
| + accum_.GetClassifiedMessages(&msgs);
|
| + ASSERT_EQ(1, msgs.size());
|
| + CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
|
| +
|
| + // Now resumes requests for all RVH (2 and 3).
|
| + host_.ResumeBlockedRequestsForRenderView(0, 2);
|
| + host_.ResumeBlockedRequestsForRenderView(0, 3);
|
| + KickOffRequest();
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| +
|
| + msgs.clear();
|
| + accum_.GetClassifiedMessages(&msgs);
|
| + ASSERT_EQ(2, msgs.size());
|
| + CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_2());
|
| + CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
|
| +}
|
| +
|
| +// Tests blocking and canceling requests.
|
| +TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) {
|
| + host_.BlockRequestsForRenderView(0, 1);
|
| +
|
| + MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3());
|
| + MakeTestRequest(0, 1, 4, URLRequestTestJob::test_url_1());
|
| +
|
| + // Flush all the pending requests.
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| +
|
| + // Sort out all the messages we saw by request.
|
| + ResourceIPCAccumulator::ClassifiedMessages msgs;
|
| + accum_.GetClassifiedMessages(&msgs);
|
| +
|
| + // The 2 requests for the RVH 0 should have been processed.
|
| + ASSERT_EQ(2, msgs.size());
|
| +
|
| + CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
|
| + CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
|
| +
|
| + // Cancel requests for RVH 1.
|
| + host_.CancelBlockedRequestsForRenderView(0, 1);
|
| + KickOffRequest();
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| + msgs.clear();
|
| + accum_.GetClassifiedMessages(&msgs);
|
| + ASSERT_EQ(0, msgs.size());
|
| +}
|
| +
|
| +// Tests that blocked requests are canceled if their associated process dies.
|
| +TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) {
|
| + host_.BlockRequestsForRenderView(1, 0);
|
| +
|
| + MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(1, 0, 2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3());
|
| + MakeTestRequest(1, 0, 4, URLRequestTestJob::test_url_1());
|
| +
|
| + // Simulate process death.
|
| + host_.CancelRequestsForProcess(1);
|
| +
|
| + // Flush all the pending requests.
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| +
|
| + // Sort out all the messages we saw by request.
|
| + ResourceIPCAccumulator::ClassifiedMessages msgs;
|
| + accum_.GetClassifiedMessages(&msgs);
|
| +
|
| + // The 2 requests for the RVH 0 should have been processed.
|
| + ASSERT_EQ(2, msgs.size());
|
| +
|
| + CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1());
|
| + CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3());
|
| +
|
| + EXPECT_TRUE(host_.blocked_requests_map_.empty());
|
| +}
|
| +
|
| +// Tests that blocked requests don't leak when the ResourceDispatcherHost goes
|
| +// away. Note that we rely on Purify for finding the leaks if any.
|
| +// If this test turns the Purify bot red, check the ResourceDispatcherHost
|
| +// destructor to make sure the blocked requests are deleted.
|
| +TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) {
|
| + host_.BlockRequestsForRenderView(0, 1);
|
| + host_.BlockRequestsForRenderView(0, 2);
|
| + host_.BlockRequestsForRenderView(1, 1);
|
| +
|
| + MakeTestRequest(0, 0, 1, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 1, 2, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 0, 3, URLRequestTestJob::test_url_3());
|
| + MakeTestRequest(1, 1, 4, URLRequestTestJob::test_url_1());
|
| + MakeTestRequest(0, 2, 5, URLRequestTestJob::test_url_2());
|
| + MakeTestRequest(0, 2, 6, URLRequestTestJob::test_url_3());
|
| +
|
| + // Flush all the pending requests.
|
| + while (URLRequestTestJob::ProcessOnePendingMessage());
|
| +}
|
|
|