blob: 186e642054bf4bc38700dd999966afe3fd6464f8 [file] [log] [blame]
// Copyright 2018 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 "chrome/browser/browser_switcher/browser_switcher_navigation_throttle.h"
#include <memory>
#include <utility>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "chrome/browser/browser_switcher/browser_switcher_prefs.h"
#include "chrome/browser/browser_switcher/browser_switcher_service.h"
#include "chrome/browser/browser_switcher/browser_switcher_service_factory.h"
#include "chrome/browser/browser_switcher/browser_switcher_sitelist.h"
#include "chrome/browser/browser_switcher/ieem_sitelist_parser.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/navigation_throttle.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/mock_navigation_handle.h"
#include "content/public/test/test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using content::MockNavigationHandle;
using content::NavigationThrottle;
using ::testing::Return;
using ::testing::_;
namespace browser_switcher {
namespace {
class MockBrowserSwitcherSitelist : public BrowserSwitcherSitelist {
public:
MockBrowserSwitcherSitelist() = default;
~MockBrowserSwitcherSitelist() override = default;
MOCK_CONST_METHOD1(ShouldSwitch, bool(const GURL&));
MOCK_METHOD1(SetIeemSitelist, void(ParsedXml&&));
MOCK_METHOD1(SetExternalSitelist, void(ParsedXml&&));
MOCK_CONST_METHOD0(GetIeemSitelist, const RuleSet*());
MOCK_CONST_METHOD0(GetExternalSitelist, const RuleSet*());
};
} // namespace
class BrowserSwitcherNavigationThrottleTest
: public ChromeRenderViewHostTestHarness {
public:
BrowserSwitcherNavigationThrottleTest() = default;
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
BrowserSwitcherService* service =
BrowserSwitcherServiceFactory::GetForBrowserContext(
web_contents()->GetBrowserContext());
std::unique_ptr<MockBrowserSwitcherSitelist> sitelist =
std::make_unique<MockBrowserSwitcherSitelist>();
sitelist_ = sitelist.get();
service->SetSitelistForTesting(std::move(sitelist));
}
std::unique_ptr<MockNavigationHandle> CreateMockNavigationHandle(
const GURL& url) {
return std::make_unique<MockNavigationHandle>(url, main_rfh());
}
std::unique_ptr<NavigationThrottle> CreateNavigationThrottle(
content::NavigationHandle* handle) {
return BrowserSwitcherNavigationThrottle::MaybeCreateThrottleFor(handle);
}
MockBrowserSwitcherSitelist* sitelist() { return sitelist_; }
private:
MockBrowserSwitcherSitelist* sitelist_;
};
TEST_F(BrowserSwitcherNavigationThrottleTest, ShouldIgnoreNavigation) {
EXPECT_CALL(*sitelist(), ShouldSwitch(_)).WillOnce(Return(false));
std::unique_ptr<MockNavigationHandle> handle =
CreateMockNavigationHandle(GURL("https://example.com/"));
std::unique_ptr<NavigationThrottle> throttle =
CreateNavigationThrottle(handle.get());
EXPECT_EQ(NavigationThrottle::PROCEED, throttle->WillStartRequest());
}
TEST_F(BrowserSwitcherNavigationThrottleTest, LaunchesOnStartRequest) {
EXPECT_CALL(*sitelist(), ShouldSwitch(_)).WillOnce(Return(true));
std::unique_ptr<MockNavigationHandle> handle =
CreateMockNavigationHandle(GURL("https://example.com/"));
std::unique_ptr<NavigationThrottle> throttle =
CreateNavigationThrottle(handle.get());
EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE,
throttle->WillStartRequest());
base::RunLoop().RunUntilIdle();
}
TEST_F(BrowserSwitcherNavigationThrottleTest, LaunchesOnRedirectRequest) {
EXPECT_CALL(*sitelist(), ShouldSwitch(_))
.WillOnce(Return(false))
.WillOnce(Return(true));
std::unique_ptr<MockNavigationHandle> handle =
CreateMockNavigationHandle(GURL("https://yahoo.com/"));
std::unique_ptr<NavigationThrottle> throttle =
CreateNavigationThrottle(handle.get());
EXPECT_EQ(NavigationThrottle::PROCEED, throttle->WillStartRequest());
handle->set_url(GURL("https://bing.com/"));
EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE,
throttle->WillRedirectRequest());
base::RunLoop().RunUntilIdle();
}
} // namespace browser_switcher