blob: e6dfab79fc843970f13a512dc461036a2cc36f63 [file] [log] [blame]
// Copyright 2017 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 <algorithm>
#include <initializer_list>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "base/callback.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
#include "chrome/browser/profile_resetter/resettable_settings_snapshot.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_controller.h"
#include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h"
#include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_test_utils.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/test/test_browser_dialog.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
using safe_browsing::MockProfileResetter;
using safe_browsing::MockSettingsResetPromptConfig;
using testing::_;
using testing::ElementsAre;
using testing::NiceMock;
using testing::Not;
using testing::Return;
using testing::ReturnRef;
constexpr char kHomepageUrl[] = "http://www.some-homepage.com/some/path";
constexpr char kSearchUrl[] = "http://www.some-search.com/some/path/?q={%s}";
constexpr const char* kStartupUrls[] = {
"http://www.some-startup-1.com/some/path",
"http://www.some-startup-2.com/some/other/path",
"http://www.some-startup-3.com/some/third/path"};
enum class SettingType {
DEFAULT_SEARCH_ENGINE,
STARTUP_PAGE,
HOMEPAGE,
};
struct ModelParams {
SettingType setting_to_reset;
size_t startup_pages;
};
class MockSettingsResetPromptModel
: public safe_browsing::SettingsResetPromptModel {
public:
// Create a mock model that pretends that the settings passed in via
// |settings_to_reset| require resetting.
explicit MockSettingsResetPromptModel(Profile* profile,
const ModelParams& params)
: SettingsResetPromptModel(
profile,
std::make_unique<NiceMock<MockSettingsResetPromptConfig>>(),
std::make_unique<NiceMock<MockProfileResetter>>(profile)) {
EXPECT_LE(params.startup_pages, base::size(kStartupUrls));
// Set up startup URLs to be returned by member functions based on the
// constructor arguments.
for (size_t i = 0;
i < std::min(base::size(kStartupUrls), params.startup_pages); ++i) {
startup_urls_.push_back(GURL(kStartupUrls[i]));
}
if (params.setting_to_reset == SettingType::STARTUP_PAGE)
startup_urls_to_reset_ = startup_urls_;
ON_CALL(*this, ShouldPromptForReset()).WillByDefault(Return(true));
ON_CALL(*this, MockPerformReset(_, _)).WillByDefault(Return());
ON_CALL(*this, DialogShown()).WillByDefault(Return());
ON_CALL(*this, homepage()).WillByDefault(Return(GURL(kHomepageUrl)));
ON_CALL(*this, homepage_reset_state())
.WillByDefault(
Return(params.setting_to_reset == SettingType::HOMEPAGE
? RESET_REQUIRED
: NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED));
ON_CALL(*this, default_search()).WillByDefault(Return(GURL(kSearchUrl)));
ON_CALL(*this, default_search_reset_state())
.WillByDefault(
Return(params.setting_to_reset == SettingType::DEFAULT_SEARCH_ENGINE
? RESET_REQUIRED
: NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED));
ON_CALL(*this, startup_urls()).WillByDefault(ReturnRef(startup_urls_));
ON_CALL(*this, startup_urls_to_reset())
.WillByDefault(ReturnRef(startup_urls_to_reset_));
ON_CALL(*this, startup_urls_reset_state())
.WillByDefault(
Return(params.setting_to_reset == SettingType::STARTUP_PAGE
? RESET_REQUIRED
: NO_RESET_REQUIRED_DUE_TO_DOMAIN_NOT_MATCHED));
}
~MockSettingsResetPromptModel() override {}
void PerformReset(std::unique_ptr<BrandcodedDefaultSettings> default_settings,
const base::Closure& callback) override {
MockPerformReset(default_settings.get(), callback);
}
MOCK_METHOD2(MockPerformReset,
void(BrandcodedDefaultSettings*, const base::Closure&));
MOCK_CONST_METHOD0(ShouldPromptForReset, bool());
MOCK_METHOD0(DialogShown, void());
MOCK_CONST_METHOD0(homepage, GURL());
MOCK_CONST_METHOD0(homepage_reset_state, ResetState());
MOCK_CONST_METHOD0(default_search, GURL());
MOCK_CONST_METHOD0(default_search_reset_state, ResetState());
MOCK_CONST_METHOD0(startup_urls, const std::vector<GURL>&());
MOCK_CONST_METHOD0(startup_urls_to_reset, const std::vector<GURL>&());
MOCK_CONST_METHOD0(startup_urls_reset_state, ResetState());
private:
std::vector<GURL> startup_urls_;
std::vector<GURL> startup_urls_to_reset_;
DISALLOW_COPY_AND_ASSIGN(MockSettingsResetPromptModel);
};
class SettingsResetPromptDialogTest : public DialogBrowserTest {
public:
void ShowUi(const std::string& name) override {
const std::map<std::string, ModelParams> name_to_model_params = {
{"DefaultSearchEngineChanged", {SettingType::DEFAULT_SEARCH_ENGINE, 0}},
{"SingleStartupPageChanged", {SettingType::STARTUP_PAGE, 1}},
{"MultipleStartupPagesChanged", {SettingType::STARTUP_PAGE, 2}},
{"HomePageChanged", {SettingType::HOMEPAGE, 0}},
};
ASSERT_NE(name_to_model_params.find(name), name_to_model_params.end());
auto model = std::make_unique<NiceMock<MockSettingsResetPromptModel>>(
browser()->profile(), name_to_model_params.find(name)->second);
chrome::ShowSettingsResetPrompt(
browser(),
new safe_browsing::SettingsResetPromptController(
std::move(model), std::make_unique<BrandcodedDefaultSettings>()));
}
};
IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest,
InvokeUi_DefaultSearchEngineChanged) {
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest,
InvokeUi_SingleStartupPageChanged) {
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest,
InvokeUi_MultipleStartupPagesChanged) {
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(SettingsResetPromptDialogTest,
InvokeUi_HomePageChanged) {
ShowAndVerifyUi();
}
} // namespace