Index: components/navigation_interception/intercept_navigation_resource_throttle_unittest.cc |
diff --git a/components/navigation_interception/intercept_navigation_resource_throttle_unittest.cc b/components/navigation_interception/intercept_navigation_resource_throttle_unittest.cc |
deleted file mode 100644 |
index 8855f4248f7ad6bf26893932ffb49441f7de77bc..0000000000000000000000000000000000000000 |
--- a/components/navigation_interception/intercept_navigation_resource_throttle_unittest.cc |
+++ /dev/null |
@@ -1,481 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/run_loop.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "components/navigation_interception/intercept_navigation_resource_throttle.h" |
-#include "components/navigation_interception/navigation_params.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/render_frame_host.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/resource_context.h" |
-#include "content/public/browser/resource_controller.h" |
-#include "content/public/browser/resource_dispatcher_host.h" |
-#include "content/public/browser/resource_dispatcher_host_delegate.h" |
-#include "content/public/browser/resource_request_info.h" |
-#include "content/public/browser/resource_throttle.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_delegate.h" |
-#include "content/public/test/mock_resource_context.h" |
-#include "content/public/test/test_renderer_host.h" |
-#include "net/base/request_priority.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/http/http_response_info.h" |
-#include "net/url_request/redirect_info.h" |
-#include "net/url_request/url_request.h" |
-#include "net/url_request/url_request_test_util.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using content::ResourceType; |
-using testing::_; |
-using testing::Eq; |
-using testing::Ne; |
-using testing::Property; |
-using testing::Return; |
- |
-namespace navigation_interception { |
- |
-namespace { |
- |
-const char kTestUrl[] = "http://www.test.com/"; |
-const char kUnsafeTestUrl[] = "about:crash"; |
- |
-// The MS C++ compiler complains about not being able to resolve which url() |
-// method (const or non-const) to use if we use the Property matcher to check |
-// the return value of the NavigationParams::url() method. |
-// It is possible to suppress the error by specifying the types directly but |
-// that results in very ugly syntax, which is why these custom matchers are |
-// used instead. |
-MATCHER(NavigationParamsUrlIsTest, "") { |
- return arg.url() == GURL(kTestUrl); |
-} |
- |
-MATCHER(NavigationParamsUrlIsSafe, "") { |
- return arg.url() != GURL(kUnsafeTestUrl); |
-} |
- |
-} // namespace |
- |
- |
-// MockInterceptCallbackReceiver ---------------------------------------------- |
- |
-class MockInterceptCallbackReceiver { |
- public: |
- MOCK_METHOD2(ShouldIgnoreNavigation, |
- bool(content::WebContents* source, |
- const NavigationParams& navigation_params)); |
-}; |
- |
-// MockResourceController ----------------------------------------------------- |
-class MockResourceController : public content::ResourceController { |
- public: |
- enum Status { |
- UNKNOWN, |
- RESUMED, |
- CANCELLED |
- }; |
- |
- MockResourceController() |
- : status_(UNKNOWN) { |
- } |
- |
- Status status() const { return status_; } |
- |
- // ResourceController: |
- void Cancel() override { NOTREACHED(); } |
- void CancelAndIgnore() override { status_ = CANCELLED; } |
- void CancelWithError(int error_code) override { NOTREACHED(); } |
- void Resume() override { |
- DCHECK(status_ == UNKNOWN); |
- status_ = RESUMED; |
- } |
- |
- private: |
- Status status_; |
-}; |
- |
-// TestIOThreadState ---------------------------------------------------------- |
- |
-enum RedirectMode { |
- REDIRECT_MODE_NO_REDIRECT, |
- REDIRECT_MODE_302, |
-}; |
- |
-class TestIOThreadState { |
- public: |
- TestIOThreadState(const GURL& url, |
- int render_process_id, |
- int render_frame_id, |
- const std::string& request_method, |
- RedirectMode redirect_mode, |
- MockInterceptCallbackReceiver* callback_receiver) |
- : resource_context_(&test_url_request_context_), |
- request_(resource_context_.GetRequestContext()->CreateRequest( |
- url, |
- net::DEFAULT_PRIORITY, |
- NULL /* delegate */)) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
- if (render_process_id != MSG_ROUTING_NONE && |
- render_frame_id != MSG_ROUTING_NONE) { |
- content::ResourceRequestInfo::AllocateForTesting( |
- request_.get(), |
- content::RESOURCE_TYPE_MAIN_FRAME, |
- &resource_context_, |
- render_process_id, |
- MSG_ROUTING_NONE, |
- render_frame_id, |
- true, // is_main_frame |
- false, // parent_is_main_frame |
- true, // allow_download |
- false); // is_async |
- } |
- throttle_.reset(new InterceptNavigationResourceThrottle( |
- request_.get(), |
- base::Bind(&MockInterceptCallbackReceiver::ShouldIgnoreNavigation, |
- base::Unretained(callback_receiver)))); |
- throttle_->set_controller_for_testing(&throttle_controller_); |
- request_->set_method(request_method); |
- |
- if (redirect_mode == REDIRECT_MODE_302) { |
- net::HttpResponseInfo& response_info = |
- const_cast<net::HttpResponseInfo&>(request_->response_info()); |
- response_info.headers = new net::HttpResponseHeaders( |
- "Status: 302 Found\0\0"); |
- } |
- } |
- |
- void ThrottleWillStartRequest(bool* defer) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
- throttle_->WillStartRequest(defer); |
- } |
- |
- void ThrottleWillRedirectRequest(const net::RedirectInfo& redirect_info, |
- bool* defer) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
- throttle_->WillRedirectRequest(redirect_info, defer); |
- } |
- |
- bool request_resumed() const { |
- return throttle_controller_.status() == |
- MockResourceController::RESUMED; |
- } |
- |
- bool request_cancelled() const { |
- return throttle_controller_.status() == |
- MockResourceController::CANCELLED; |
- } |
- |
- private: |
- net::TestURLRequestContext test_url_request_context_; |
- content::MockResourceContext resource_context_; |
- scoped_ptr<net::URLRequest> request_; |
- scoped_ptr<InterceptNavigationResourceThrottle> throttle_; |
- MockResourceController throttle_controller_; |
-}; |
- |
-// InterceptNavigationResourceThrottleTest ------------------------------------ |
- |
-class InterceptNavigationResourceThrottleTest |
- : public content::RenderViewHostTestHarness { |
- public: |
- InterceptNavigationResourceThrottleTest() |
- : mock_callback_receiver_(new MockInterceptCallbackReceiver()), |
- io_thread_state_(NULL) { |
- } |
- |
- void SetUp() override { RenderViewHostTestHarness::SetUp(); } |
- |
- void TearDown() override { |
- if (web_contents()) |
- web_contents()->SetDelegate(NULL); |
- |
- content::BrowserThread::DeleteSoon( |
- content::BrowserThread::IO, FROM_HERE, io_thread_state_); |
- |
- RenderViewHostTestHarness::TearDown(); |
- } |
- |
- void SetIOThreadState(TestIOThreadState* io_thread_state) { |
- io_thread_state_ = io_thread_state; |
- } |
- |
- void RunThrottleWillStartRequestOnIOThread( |
- const GURL& url, |
- const std::string& request_method, |
- RedirectMode redirect_mode, |
- int render_process_id, |
- int render_frame_id, |
- bool* defer) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
- TestIOThreadState* io_thread_state = |
- new TestIOThreadState(url, render_process_id, render_frame_id, |
- request_method, redirect_mode, |
- mock_callback_receiver_.get()); |
- |
- SetIOThreadState(io_thread_state); |
- |
- if (redirect_mode == REDIRECT_MODE_NO_REDIRECT) { |
- io_thread_state->ThrottleWillStartRequest(defer); |
- } else { |
- // 302 redirects convert POSTs to gets. |
- net::RedirectInfo redirect_info; |
- redirect_info.new_url = url; |
- redirect_info.new_method = "GET"; |
- io_thread_state->ThrottleWillRedirectRequest(redirect_info, defer); |
- } |
- } |
- |
- protected: |
- enum ShouldIgnoreNavigationCallbackAction { |
- IgnoreNavigation, |
- DontIgnoreNavigation |
- }; |
- |
- void SetUpWebContentsDelegateAndDrainRunLoop( |
- ShouldIgnoreNavigationCallbackAction callback_action, |
- bool* defer) { |
- ON_CALL(*mock_callback_receiver_, ShouldIgnoreNavigation(_, _)) |
- .WillByDefault(Return(callback_action == IgnoreNavigation)); |
- EXPECT_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(web_contents(), |
- NavigationParamsUrlIsTest())) |
- .Times(1); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kTestUrl), |
- "GET", |
- REDIRECT_MODE_NO_REDIRECT, |
- web_contents()->GetRenderViewHost()->GetProcess()->GetID(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- base::Unretained(defer))); |
- |
- // Wait for the request to finish processing. |
- base::RunLoop().RunUntilIdle(); |
- } |
- |
- void WaitForPreviouslyScheduledIoThreadWork() { |
- base::WaitableEvent io_thread_work_done(true, false); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &base::WaitableEvent::Signal, |
- base::Unretained(&io_thread_work_done))); |
- io_thread_work_done.Wait(); |
- } |
- |
- scoped_ptr<MockInterceptCallbackReceiver> mock_callback_receiver_; |
- TestIOThreadState* io_thread_state_; |
-}; |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- RequestDeferredAndResumedIfNavigationNotIgnored) { |
- bool defer = false; |
- SetUpWebContentsDelegateAndDrainRunLoop(DontIgnoreNavigation, &defer); |
- |
- EXPECT_TRUE(defer); |
- ASSERT_TRUE(io_thread_state_); |
- EXPECT_TRUE(io_thread_state_->request_resumed()); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- RequestDeferredAndCancelledIfNavigationIgnored) { |
- bool defer = false; |
- SetUpWebContentsDelegateAndDrainRunLoop(IgnoreNavigation, &defer); |
- |
- EXPECT_TRUE(defer); |
- ASSERT_TRUE(io_thread_state_); |
- EXPECT_TRUE(io_thread_state_->request_cancelled()); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- NoCallbackMadeIfContentsDeletedWhileThrottleRunning) { |
- bool defer = false; |
- |
- // The tested scenario is when the WebContents is deleted after the |
- // ResourceThrottle has finished processing on the IO thread but before the |
- // UI thread callback has been processed. Since both threads in this test |
- // are serviced by one message loop, the post order is the execution order. |
- EXPECT_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(_, _)) |
- .Times(0); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kTestUrl), |
- "GET", |
- REDIRECT_MODE_NO_REDIRECT, |
- web_contents()->GetRenderViewHost()->GetProcess()->GetID(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- base::Unretained(&defer))); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind( |
- &RenderViewHostTestHarness::DeleteContents, |
- base::Unretained(this))); |
- |
- // The WebContents will now be deleted and only after that will the UI-thread |
- // callback posted by the ResourceThrottle be executed. |
- base::RunLoop().RunUntilIdle(); |
- |
- EXPECT_TRUE(defer); |
- ASSERT_TRUE(io_thread_state_); |
- EXPECT_TRUE(io_thread_state_->request_resumed()); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- RequestNotDeferredForRequestNotAssociatedWithARenderView) { |
- bool defer = false; |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kTestUrl), |
- "GET", |
- REDIRECT_MODE_NO_REDIRECT, |
- MSG_ROUTING_NONE, |
- MSG_ROUTING_NONE, |
- base::Unretained(&defer))); |
- |
- // Wait for the request to finish processing. |
- base::RunLoop().RunUntilIdle(); |
- |
- EXPECT_FALSE(defer); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- CallbackCalledWithFilteredUrl) { |
- bool defer = false; |
- |
- ON_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(_, NavigationParamsUrlIsSafe())) |
- .WillByDefault(Return(false)); |
- EXPECT_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(_, NavigationParamsUrlIsSafe())) |
- .Times(1); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kUnsafeTestUrl), |
- "GET", |
- REDIRECT_MODE_NO_REDIRECT, |
- web_contents()->GetRenderViewHost()->GetProcess()->GetID(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- base::Unretained(&defer))); |
- |
- // Wait for the request to finish processing. |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- CallbackIsPostFalseForGet) { |
- bool defer = false; |
- |
- EXPECT_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(_, AllOf( |
- NavigationParamsUrlIsSafe(), |
- Property(&NavigationParams::is_post, Eq(false))))) |
- .WillOnce(Return(false)); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kTestUrl), |
- "GET", |
- REDIRECT_MODE_NO_REDIRECT, |
- web_contents()->GetRenderViewHost()->GetProcess()->GetID(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- base::Unretained(&defer))); |
- |
- // Wait for the request to finish processing. |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- CallbackIsPostTrueForPost) { |
- bool defer = false; |
- |
- EXPECT_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(_, AllOf( |
- NavigationParamsUrlIsSafe(), |
- Property(&NavigationParams::is_post, Eq(true))))) |
- .WillOnce(Return(false)); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kTestUrl), |
- "POST", |
- REDIRECT_MODE_NO_REDIRECT, |
- web_contents()->GetRenderViewHost()->GetProcess()->GetID(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- base::Unretained(&defer))); |
- |
- // Wait for the request to finish processing. |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-TEST_F(InterceptNavigationResourceThrottleTest, |
- CallbackIsPostFalseForPostConvertedToGetBy302) { |
- bool defer = false; |
- |
- EXPECT_CALL(*mock_callback_receiver_, |
- ShouldIgnoreNavigation(_, AllOf( |
- NavigationParamsUrlIsSafe(), |
- Property(&NavigationParams::is_post, Eq(false))))) |
- .WillOnce(Return(false)); |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::IO, |
- FROM_HERE, |
- base::Bind( |
- &InterceptNavigationResourceThrottleTest:: |
- RunThrottleWillStartRequestOnIOThread, |
- base::Unretained(this), |
- GURL(kTestUrl), |
- "POST", |
- REDIRECT_MODE_302, |
- web_contents()->GetRenderViewHost()->GetProcess()->GetID(), |
- web_contents()->GetMainFrame()->GetRoutingID(), |
- base::Unretained(&defer))); |
- |
- // Wait for the request to finish processing. |
- base::RunLoop().RunUntilIdle(); |
-} |
- |
-} // namespace navigation_interception |