| Index: components/web_restrictions/browser/web_restrictions_resource_throttle_unittest.cc
|
| diff --git a/components/web_restrictions/browser/web_restrictions_resource_throttle_unittest.cc b/components/web_restrictions/browser/web_restrictions_resource_throttle_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f3e7342f0f2d57d3b6ae2517a8bff0570af59943
|
| --- /dev/null
|
| +++ b/components/web_restrictions/browser/web_restrictions_resource_throttle_unittest.cc
|
| @@ -0,0 +1,157 @@
|
| +// Copyright 2016 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/run_loop.h"
|
| +#include "components/web_restrictions/browser/mock_web_restrictions_client.h"
|
| +#include "components/web_restrictions/browser/web_restrictions_client.h"
|
| +#include "components/web_restrictions/browser/web_restrictions_resource_throttle.h"
|
| +#include "content/public/browser/resource_controller.h"
|
| +#include "content/public/test/test_browser_thread_bundle.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/url_request/redirect_info.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace web_restrictions {
|
| +
|
| +namespace {
|
| +
|
| +class TestResourceController : public content::ResourceController {
|
| + public:
|
| + TestResourceController(const base::Closure& quit_closure)
|
| + : resume_called_(false),
|
| + cancel_with_error_called_(false),
|
| + error_code_(0),
|
| + quit_closure_(quit_closure) {}
|
| +
|
| + void Cancel() override {}
|
| + void CancelAndIgnore() override {}
|
| + void CancelWithError(int error_code) override {
|
| + cancel_with_error_called_ = true;
|
| + error_code_ = error_code;
|
| + quit_closure_.Run();
|
| + }
|
| + void Resume() override {
|
| + resume_called_ = true;
|
| + quit_closure_.Run();
|
| + }
|
| +
|
| + bool CancelWithErrorCalled() const { return cancel_with_error_called_; }
|
| +
|
| + int GetErrorCode() const { return error_code_; }
|
| +
|
| + bool ResumeCalled() const { return resume_called_; }
|
| +
|
| + private:
|
| + bool resume_called_;
|
| + bool cancel_with_error_called_;
|
| + int error_code_;
|
| + base::Closure quit_closure_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +class WebRestrictionsResourceThrottleTest : public testing::Test {
|
| + protected:
|
| + WebRestrictionsResourceThrottleTest()
|
| + : throttle_(&provider_, GURL("http://example.com"), true),
|
| + controller_(run_loop_.QuitClosure()) {
|
| + throttle_.set_controller_for_testing(&controller_);
|
| + }
|
| +
|
| + void StartProvider() {
|
| + provider_.SetAuthority("Good");
|
| + bool defer;
|
| + throttle_.WillStartRequest(&defer);
|
| + run_loop_.Run();
|
| + }
|
| +
|
| + // Mock the Java WebRestrictionsClient. The real version
|
| + // would need a content provider to do anything.
|
| + web_restrictions::MockWebRestrictionsClient mock_;
|
| + content::TestBrowserThreadBundle thread_bundle_;
|
| + WebRestrictionsClient provider_;
|
| + WebRestrictionsResourceThrottle throttle_;
|
| + base::RunLoop run_loop_;
|
| + TestResourceController controller_;
|
| +};
|
| +
|
| +TEST_F(WebRestrictionsResourceThrottleTest, WillStartRequest_NoAuthority) {
|
| + WebRestrictionsResourceThrottle throttle(&provider_,
|
| + GURL("http://example.com"), true);
|
| + bool defer;
|
| + throttle.WillStartRequest(&defer);
|
| + // If there is no authority the request won't be deferred.
|
| + EXPECT_FALSE(defer);
|
| +}
|
| +
|
| +TEST_F(WebRestrictionsResourceThrottleTest, WillStartRequest_DeferredAllow) {
|
| + // Test deferring with a resource provider, and that the correct results
|
| + // are received.
|
| + provider_.SetAuthority("Good");
|
| + bool defer;
|
| + throttle_.WillStartRequest(&defer);
|
| + EXPECT_TRUE(defer);
|
| + run_loop_.Run();
|
| + EXPECT_TRUE(controller_.ResumeCalled());
|
| + EXPECT_FALSE(controller_.CancelWithErrorCalled());
|
| +}
|
| +
|
| +TEST_F(WebRestrictionsResourceThrottleTest, WillStartRequest_DeferredForbid) {
|
| + provider_.SetAuthority("Bad");
|
| + bool defer;
|
| + throttle_.WillStartRequest(&defer);
|
| + EXPECT_TRUE(defer);
|
| + run_loop_.Run();
|
| + EXPECT_FALSE(controller_.ResumeCalled());
|
| + EXPECT_TRUE(controller_.CancelWithErrorCalled());
|
| + EXPECT_EQ(net::ERR_BLOCKED_BY_ADMINISTRATOR, controller_.GetErrorCode());
|
| +}
|
| +
|
| +TEST_F(WebRestrictionsResourceThrottleTest, WillStartRequest_Subresource) {
|
| + // Only the main frame should be deferred.
|
| + // Initialization of the controller is asynchronous, and this will only work
|
| + // correctly if the provider is initialized. Run a main frame through this
|
| + // first to ensure that everything is initialized.
|
| + StartProvider();
|
| + // Now the real test.
|
| + WebRestrictionsResourceThrottle throttle(
|
| + &provider_, GURL("http://example.com/sub"), false);
|
| + base::RunLoop test_run_loop;
|
| + TestResourceController test_controller(test_run_loop.QuitClosure());
|
| + throttle.set_controller_for_testing(&test_controller);
|
| + bool defer;
|
| + throttle.WillStartRequest(&defer);
|
| + EXPECT_FALSE(defer);
|
| +}
|
| +
|
| +TEST_F(WebRestrictionsResourceThrottleTest, WillRedirectRequest_KnownUrl) {
|
| + // Set up a cached url.
|
| + StartProvider();
|
| + // Using the same URL should not be deferred
|
| + net::RedirectInfo redirect;
|
| + redirect.new_url = GURL("http://example.com");
|
| + bool defer;
|
| + throttle_.WillRedirectRequest(redirect, &defer);
|
| + EXPECT_FALSE(defer);
|
| +}
|
| +
|
| +TEST_F(WebRestrictionsResourceThrottleTest, WillRedirectRequest_NewUrl) {
|
| + // Set up a cached url.
|
| + StartProvider();
|
| + // Using a different URL should be deferred
|
| + net::RedirectInfo redirect;
|
| + redirect.new_url = GURL("http://example.com/2");
|
| + base::RunLoop test_run_loop;
|
| + TestResourceController test_controller(test_run_loop.QuitClosure());
|
| + throttle_.set_controller_for_testing(&test_controller);
|
| + bool defer;
|
| + throttle_.WillRedirectRequest(redirect, &defer);
|
| + EXPECT_TRUE(defer);
|
| + // If we don't wait for the callback it may happen after the exit, which
|
| + // results in accesses the redirect_url after the stack frame is freed.
|
| + test_run_loop.Run();
|
| +}
|
| +
|
| +} // namespace web_restrictions
|
|
|