diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-15 22:19:48 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-15 22:19:48 +0000 |
commit | 8e2b6472071f38c065a3d00adb136ef259ef68a1 (patch) | |
tree | 8a05864f6463e4948c6468139998a59eb6b54899 /chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc | |
parent | 10a4a0aa5e9a1754752454ee2d4d8aff872a61a3 (diff) | |
download | chromium_src-8e2b6472071f38c065a3d00adb136ef259ef68a1.zip chromium_src-8e2b6472071f38c065a3d00adb136ef259ef68a1.tar.gz chromium_src-8e2b6472071f38c065a3d00adb136ef259ef68a1.tar.bz2 |
Create a ResourceMessageFilter to filter resource related IPCs. This gets rid of the awkward ResourceDispatcherHost::Receiver interface and allows a bunch of cleanup. I've also generalized the filtering done in WorkerProcessHost and moved it to ChildProcessHost (since it's now used to add the ResourceMessageFilter).
Review URL: http://codereview.chromium.org/5874002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@69335 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc')
-rw-r--r-- | chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc | 221 |
1 files changed, 102 insertions, 119 deletions
diff --git a/chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc b/chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc index 7240608..5b6758c 100644 --- a/chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc +++ b/chrome/browser/renderer_host/resource_dispatcher_host_unittest.cc @@ -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 @@ void ResourceIPCAccumulator::GetClassifiedMessages(ClassifiedMessages* msgs) { } // 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 @@ class ResourceDispatcherHostTest : public testing::Test, 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 @@ class ResourceDispatcherHostTest : public testing::Test, } } + scoped_refptr<ForwardingFilter> filter_; MessageLoopForIO message_loop_; BrowserThread ui_thread_; BrowserThread io_thread_; @@ -284,11 +278,11 @@ ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL; 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 @@ void ResourceDispatcherHostTest::MakeTestRequest( 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,35 +403,31 @@ TEST_F(ResourceDispatcherHostTest, Cancel) { EXPECT_EQ(URLRequestStatus::CANCELED, status.status()); } +// The host delegate acts as a second one so we can have some requests +// pending and some canceled. +class TestFilter : public ForwardingFilter { + public: + TestFilter() + : ForwardingFilter(NULL), + has_canceled_(false), + received_after_canceled_(0) { + } + + // 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) { - } - - // 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; + scoped_refptr<TestFilter> test_filter = new TestFilter(); // request 1 goes to the test delegate ViewHostMsg_Resource_Request request = CreateResourceRequest( @@ -445,13 +435,13 @@ TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { 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 +454,17 @@ TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { 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 +475,11 @@ TEST_F(ResourceDispatcherHostTest, TestProcessCancel) { // 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 +502,7 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { 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 +521,12 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { 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 +537,9 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingResumingRequests) { // 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 +560,11 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { 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 +573,29 @@ TEST_F(ResourceDispatcherHostTest, TestBlockingCancelingRequests) { // 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 +615,19 @@ TEST_F(ResourceDispatcherHostTest, TestBlockedRequestsProcessDies) { // 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 +692,7 @@ TEST_F(ResourceDispatcherHostTest, IncrementOutstandingRequestsMemoryCost) { // 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 +709,31 @@ TEST_F(ResourceDispatcherHostTest, TooManyOutstandingRequests) { // 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; |