Chromium Code Reviews| Index: chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc |
| =================================================================== |
| --- chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc (revision 69229) |
| +++ chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc (working copy) |
| @@ -12,6 +12,7 @@ |
| #include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
| #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" |
| #include "chrome/browser/renderer_host/resource_handler.h" |
| +#include "chrome/browser/renderer_host/resource_message_filter.h" |
| #include "chrome/common/chrome_plugin_lib.h" |
| #include "chrome/common/render_messages.h" |
| #include "chrome/common/render_messages_params.h" |
| @@ -127,57 +128,49 @@ |
| } |
| // This class forwards the incoming messages to the ResourceDispatcherHostTest. |
| -// This is used to emulate different sub-procseses, since this receiver will |
| +// This is used to emulate different sub-processes, since this filter will |
| // have a different ID than the original. For the test, we want all the incoming |
| // messages to go to the same place, which is why this forwards. |
| -class ForwardingReceiver : public ResourceDispatcherHost::Receiver { |
| +class ForwardingFilter : public ResourceMessageFilter { |
| public: |
| - explicit ForwardingReceiver(ResourceDispatcherHost::Receiver* dest) |
| - : ResourceDispatcherHost::Receiver(dest->type(), -1), |
| + explicit ForwardingFilter(IPC::Message::Sender* dest) |
| + : ResourceMessageFilter(ChildProcessInfo::GenerateChildProcessUniqueId(), |
| + ChildProcessInfo::RENDER_PROCESS, |
| + NULL), |
| dest_(dest) { |
| - set_handle(dest->handle()); |
| + OnChannelConnected(base::GetCurrentProcId()); |
| } |
| - // ResourceDispatcherHost::Receiver implementation |
| + // ResourceMessageFilter override |
| virtual bool Send(IPC::Message* msg) { |
| + if (!dest_) |
| + return false; |
| return dest_->Send(msg); |
| } |
| - URLRequestContext* GetRequestContext( |
| - uint32 request_id, |
| - const ViewHostMsg_Resource_Request& request_data) { |
| - return dest_->GetRequestContext(request_id, request_data); |
| - } |
| private: |
| - ResourceDispatcherHost::Receiver* dest_; |
| + IPC::Message::Sender* dest_; |
| - DISALLOW_COPY_AND_ASSIGN(ForwardingReceiver); |
| + DISALLOW_COPY_AND_ASSIGN(ForwardingFilter); |
| }; |
| class ResourceDispatcherHostTest : public testing::Test, |
| - public ResourceDispatcherHost::Receiver { |
| + public IPC::Message::Sender { |
| public: |
| ResourceDispatcherHostTest() |
| - : Receiver(ChildProcessInfo::RENDER_PROCESS, -1), |
| + : ALLOW_THIS_IN_INITIALIZER_LIST(filter_(new ForwardingFilter(this))), |
| ui_thread_(BrowserThread::UI, &message_loop_), |
| io_thread_(BrowserThread::IO, &message_loop_), |
| old_factory_(NULL), |
| resource_type_(ResourceType::SUB_RESOURCE) { |
| - set_handle(base::GetCurrentProcessHandle()); |
| } |
| - // ResourceDispatcherHost::Receiver implementation |
| + // IPC::Message::Sender implementation |
| virtual bool Send(IPC::Message* msg) { |
| accum_.AddMessage(*msg); |
| delete msg; |
| return true; |
| } |
| - URLRequestContext* GetRequestContext( |
| - uint32 request_id, |
| - const ViewHostMsg_Resource_Request& request_data) { |
| - return NULL; |
| - } |
| - |
| protected: |
| // testing::Test |
| virtual void SetUp() { |
| @@ -210,14 +203,14 @@ |
| message_loop_.RunAllPending(); |
| } |
| - // Creates a request using the current test object as the receiver. |
| + // Creates a request using the current test object as the filter. |
| void MakeTestRequest(int render_view_id, |
| int request_id, |
| const GURL& url); |
| - // Generates a request using the given receiver. This will probably be a |
| - // ForwardingReceiver. |
| - void MakeTestRequest(ResourceDispatcherHost::Receiver* receiver, |
| + // Generates a request using the given filter. This will probably be a |
| + // ForwardingFilter. |
| + void MakeTestRequest(ResourceMessageFilter* filter, |
| int render_view_id, |
| int request_id, |
| const GURL& url); |
| @@ -266,6 +259,7 @@ |
| } |
| } |
| + scoped_refptr<ForwardingFilter> filter_; |
| MessageLoopForIO message_loop_; |
| BrowserThread ui_thread_; |
| BrowserThread io_thread_; |
| @@ -284,11 +278,11 @@ |
| void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id, |
| int request_id, |
| const GURL& url) { |
| - MakeTestRequest(this, render_view_id, request_id, url); |
| + MakeTestRequest(filter_.get(), render_view_id, request_id, url); |
| } |
| void ResourceDispatcherHostTest::MakeTestRequest( |
| - ResourceDispatcherHost::Receiver* receiver, |
| + ResourceMessageFilter* filter, |
| int render_view_id, |
| int request_id, |
| const GURL& url) { |
| @@ -296,12 +290,12 @@ |
| CreateResourceRequest("GET", resource_type_, url); |
| ViewHostMsg_RequestResource msg(render_view_id, request_id, request); |
| bool msg_was_ok; |
| - host_.OnMessageReceived(msg, receiver, &msg_was_ok); |
| + host_.OnMessageReceived(msg, filter, &msg_was_ok); |
| KickOffRequest(); |
| } |
| void ResourceDispatcherHostTest::MakeCancelRequest(int request_id) { |
| - host_.CancelRequest(id(), request_id, false); |
| + host_.CancelRequest(filter_->child_id(), request_id, false); |
| } |
| void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, |
| @@ -409,49 +403,44 @@ |
| EXPECT_EQ(URLRequestStatus::CANCELED, status.status()); |
| } |
| +// the host delegate acts as a second one so we can have some requests |
|
brettw
2010/12/15 21:31:10
Style nit: can you capitalize this?
jam
2010/12/15 21:41:04
Done.
|
| +// pending and some canceled |
| +class TestFilter : public ForwardingFilter { |
| + public: |
| + TestFilter() |
| + : ForwardingFilter(NULL), |
| + has_canceled_(false), received_after_canceled_(0) { |
|
brettw
2010/12/15 21:31:10
Style nit: can you move the last initializer to it
jam
2010/12/15 21:41:04
Done.
|
| + } |
| + |
| + // ForwardingFilter override |
| + virtual bool Send(IPC::Message* msg) { |
| + // no messages should be received when the process has been canceled |
| + if (has_canceled_) |
| + received_after_canceled_++; |
| + delete msg; |
| + return true; |
| + } |
| + bool has_canceled_; |
| + int received_after_canceled_; |
| +}; |
| + |
| // Tests CancelRequestsForProcess |
| TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { |
| - // the host delegate acts as a second one so we can have some requests |
| - // pending and some canceled |
| - class TestReceiver : public ResourceDispatcherHost::Receiver { |
| - public: |
| - TestReceiver() |
| - : Receiver(ChildProcessInfo::RENDER_PROCESS, -1), |
| - has_canceled_(false), |
| - received_after_canceled_(0) { |
| - } |
| + scoped_refptr<TestFilter> test_filter = new TestFilter(); |
| - // ResourceDispatcherHost::Receiver implementation |
| - virtual bool Send(IPC::Message* msg) { |
| - // no messages should be received when the process has been canceled |
| - if (has_canceled_) |
| - received_after_canceled_++; |
| - delete msg; |
| - return true; |
| - } |
| - URLRequestContext* GetRequestContext( |
| - uint32 request_id, |
| - const ViewHostMsg_Resource_Request& request_data) { |
| - return NULL; |
| - } |
| - bool has_canceled_; |
| - int received_after_canceled_; |
| - }; |
| - TestReceiver test_receiver; |
| - |
| // request 1 goes to the test delegate |
| ViewHostMsg_Resource_Request request = CreateResourceRequest( |
| "GET", ResourceType::SUB_RESOURCE, URLRequestTestJob::test_url_1()); |
| EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| - MakeTestRequest(&test_receiver, 0, 1, URLRequestTestJob::test_url_1()); |
| + MakeTestRequest(test_filter.get(), 0, 1, URLRequestTestJob::test_url_1()); |
| // request 2 goes to us |
| MakeTestRequest(0, 2, URLRequestTestJob::test_url_2()); |
| // request 3 goes to the test delegate |
| - MakeTestRequest(&test_receiver, 0, 3, URLRequestTestJob::test_url_3()); |
| + MakeTestRequest(test_filter.get(), 0, 3, URLRequestTestJob::test_url_3()); |
| // TODO(mbelshe): |
| // Now that the async IO path is in place, the IO always completes on the |
| @@ -464,18 +453,17 @@ |
| EXPECT_TRUE(URLRequestTestJob::ProcessOnePendingMessage()); |
| // Cancel the requests to the test process. |
| - host_.CancelRequestsForProcess(id()); |
| - test_receiver.has_canceled_ = true; |
| + host_.CancelRequestsForProcess(filter_->child_id()); |
| + test_filter->has_canceled_ = true; |
| // Flush all the pending requests. |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| EXPECT_EQ(0, host_.pending_requests()); |
| - EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( |
| - id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| // The test delegate should not have gotten any messages after being canceled. |
| - ASSERT_EQ(0, test_receiver.received_after_canceled_); |
| + ASSERT_EQ(0, test_filter->received_after_canceled_); |
| // We should have gotten exactly one result. |
| ResourceIPCAccumulator::ClassifiedMessages msgs; |
| @@ -486,12 +474,11 @@ |
| // Tests blocking and resuming requests. |
| TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { |
| - EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( |
| - id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| - host_.BlockRequestsForRoute(id(), 1); |
| - host_.BlockRequestsForRoute(id(), 2); |
| - host_.BlockRequestsForRoute(id(), 3); |
| + host_.BlockRequestsForRoute(filter_->child_id(), 1); |
| + host_.BlockRequestsForRoute(filter_->child_id(), 2); |
| + host_.BlockRequestsForRoute(filter_->child_id(), 3); |
| MakeTestRequest(0, 1, URLRequestTestJob::test_url_1()); |
| MakeTestRequest(1, 2, URLRequestTestJob::test_url_2()); |
| @@ -514,7 +501,7 @@ |
| CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); |
| // Resume requests for RVH 1 and flush pending requests. |
| - host_.ResumeBlockedRequestsForRoute(id(), 1); |
| + host_.ResumeBlockedRequestsForRoute(filter_->child_id(), 1); |
| KickOffRequest(); |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| @@ -533,13 +520,12 @@ |
| CheckSuccessfulRequest(msgs[0], URLRequestTestJob::test_data_1()); |
| // Now resumes requests for all RVH (2 and 3). |
| - host_.ResumeBlockedRequestsForRoute(id(), 2); |
| - host_.ResumeBlockedRequestsForRoute(id(), 3); |
| + host_.ResumeBlockedRequestsForRoute(filter_->child_id(), 2); |
| + host_.ResumeBlockedRequestsForRoute(filter_->child_id(), 3); |
| KickOffRequest(); |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| - EXPECT_EQ(0, |
| - host_.GetOutstandingRequestsMemoryCost(id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| msgs.clear(); |
| accum_.GetClassifiedMessages(&msgs); |
| @@ -550,10 +536,9 @@ |
| // Tests blocking and canceling requests. |
| TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { |
| - EXPECT_EQ(0, |
| - host_.GetOutstandingRequestsMemoryCost(id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| - host_.BlockRequestsForRoute(id(), 1); |
| + host_.BlockRequestsForRoute(filter_->child_id(), 1); |
| MakeTestRequest(0, 1, URLRequestTestJob::test_url_1()); |
| MakeTestRequest(1, 2, URLRequestTestJob::test_url_2()); |
| @@ -574,12 +559,11 @@ |
| CheckSuccessfulRequest(msgs[1], URLRequestTestJob::test_data_3()); |
| // Cancel requests for RVH 1. |
| - host_.CancelBlockedRequestsForRoute(id(), 1); |
| + host_.CancelBlockedRequestsForRoute(filter_->child_id(), 1); |
| KickOffRequest(); |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| - EXPECT_EQ(0, |
| - host_.GetOutstandingRequestsMemoryCost(id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| msgs.clear(); |
| accum_.GetClassifiedMessages(&msgs); |
| @@ -588,31 +572,29 @@ |
| // Tests that blocked requests are canceled if their associated process dies. |
| TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) { |
| - // This second receiver is used to emulate a second process. |
| - ForwardingReceiver second_receiver(this); |
| + // This second filter is used to emulate a second process. |
| + scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(this); |
| - EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( |
| - id())); |
| - EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( |
| - second_receiver.id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| + EXPECT_EQ(0, |
| + host_.GetOutstandingRequestsMemoryCost(second_filter->child_id())); |
| - host_.BlockRequestsForRoute(second_receiver.id(), 0); |
| + host_.BlockRequestsForRoute(second_filter->child_id(), 0); |
| - MakeTestRequest(this, 0, 1, URLRequestTestJob::test_url_1()); |
| - MakeTestRequest(&second_receiver, 0, 2, URLRequestTestJob::test_url_2()); |
| - MakeTestRequest(this, 0, 3, URLRequestTestJob::test_url_3()); |
| - MakeTestRequest(&second_receiver, 0, 4, URLRequestTestJob::test_url_1()); |
| + MakeTestRequest(filter_.get(), 0, 1, URLRequestTestJob::test_url_1()); |
| + MakeTestRequest(second_filter.get(), 0, 2, URLRequestTestJob::test_url_2()); |
| + MakeTestRequest(filter_.get(), 0, 3, URLRequestTestJob::test_url_3()); |
| + MakeTestRequest(second_filter.get(), 0, 4, URLRequestTestJob::test_url_1()); |
| // Simulate process death. |
| - host_.CancelRequestsForProcess(second_receiver.id()); |
| + host_.CancelRequestsForProcess(second_filter->child_id()); |
| // Flush all the pending requests. |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| - EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( |
| - id())); |
| - EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost( |
| - second_receiver.id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| + EXPECT_EQ(0, |
| + host_.GetOutstandingRequestsMemoryCost(second_filter->child_id())); |
| // Sort out all the messages we saw by request. |
| ResourceIPCAccumulator::ClassifiedMessages msgs; |
| @@ -632,19 +614,19 @@ |
| // If this test turns the Purify bot red, check the ResourceDispatcherHost |
| // destructor to make sure the blocked requests are deleted. |
| TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsDontLeak) { |
| - // This second receiver is used to emulate a second process. |
| - ForwardingReceiver second_receiver(this); |
| + // This second filter is used to emulate a second process. |
| + scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(this); |
| - host_.BlockRequestsForRoute(id(), 1); |
| - host_.BlockRequestsForRoute(id(), 2); |
| - host_.BlockRequestsForRoute(second_receiver.id(), 1); |
| + host_.BlockRequestsForRoute(filter_->child_id(), 1); |
| + host_.BlockRequestsForRoute(filter_->child_id(), 2); |
| + host_.BlockRequestsForRoute(second_filter->child_id(), 1); |
| - MakeTestRequest(this, 0, 1, URLRequestTestJob::test_url_1()); |
| - MakeTestRequest(this, 1, 2, URLRequestTestJob::test_url_2()); |
| - MakeTestRequest(this, 0, 3, URLRequestTestJob::test_url_3()); |
| - MakeTestRequest(&second_receiver, 1, 4, URLRequestTestJob::test_url_1()); |
| - MakeTestRequest(this, 2, 5, URLRequestTestJob::test_url_2()); |
| - MakeTestRequest(this, 2, 6, URLRequestTestJob::test_url_3()); |
| + MakeTestRequest(filter_.get(), 0, 1, URLRequestTestJob::test_url_1()); |
| + MakeTestRequest(filter_.get(), 1, 2, URLRequestTestJob::test_url_2()); |
| + MakeTestRequest(filter_.get(), 0, 3, URLRequestTestJob::test_url_3()); |
| + MakeTestRequest(second_filter.get(), 1, 4, URLRequestTestJob::test_url_1()); |
| + MakeTestRequest(filter_.get(), 2, 5, URLRequestTestJob::test_url_2()); |
| + MakeTestRequest(filter_.get(), 2, 6, URLRequestTestJob::test_url_3()); |
| // Flush all the pending requests. |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| @@ -709,8 +691,7 @@ |
| // Test that when too many requests are outstanding for a particular |
| // render_process_host_id, any subsequent request from it fails. |
| TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) { |
| - EXPECT_EQ(0, |
| - host_.GetOutstandingRequestsMemoryCost(id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| // Expected cost of each request as measured by |
| // ResourceDispatcherHost::CalculateApproximateMemoryCost(). |
| @@ -727,30 +708,31 @@ |
| // throttling kicks in. |
| size_t kMaxRequests = kMaxCostPerProcess / kMemoryCostOfTest2Req; |
| - // This second receiver is used to emulate a second process. |
| - ForwardingReceiver second_receiver(this); |
| + // This second filter is used to emulate a second process. |
| + scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(this); |
| // Saturate the number of outstanding requests for our process. |
| for (size_t i = 0; i < kMaxRequests; ++i) |
| - MakeTestRequest(this, 0, i + 1, URLRequestTestJob::test_url_2()); |
| + MakeTestRequest(filter_.get(), 0, i + 1, URLRequestTestJob::test_url_2()); |
| // Issue two more requests for our process -- these should fail immediately. |
| - MakeTestRequest(this, 0, kMaxRequests + 1, URLRequestTestJob::test_url_2()); |
| - MakeTestRequest(this, 0, kMaxRequests + 2, URLRequestTestJob::test_url_2()); |
| + MakeTestRequest(filter_.get(), 0, kMaxRequests + 1, |
| + URLRequestTestJob::test_url_2()); |
| + MakeTestRequest(filter_.get(), 0, kMaxRequests + 2, |
| + URLRequestTestJob::test_url_2()); |
| // Issue two requests for the second process -- these should succeed since |
| // it is just process 0 that is saturated. |
| - MakeTestRequest(&second_receiver, 0, kMaxRequests + 3, |
| + MakeTestRequest(second_filter.get(), 0, kMaxRequests + 3, |
| URLRequestTestJob::test_url_2()); |
| - MakeTestRequest(&second_receiver, 0, kMaxRequests + 4, |
| + MakeTestRequest(second_filter.get(), 0, kMaxRequests + 4, |
| URLRequestTestJob::test_url_2()); |
| // Flush all the pending requests. |
| while (URLRequestTestJob::ProcessOnePendingMessage()) {} |
| MessageLoop::current()->RunAllPending(); |
| - EXPECT_EQ(0, |
| - host_.GetOutstandingRequestsMemoryCost(id())); |
| + EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(filter_->child_id())); |
| // Sorts out all the messages we saw by request. |
| ResourceIPCAccumulator::ClassifiedMessages msgs; |