blob: ba5d923813534c1e0c9c9d39251a3779c4e89309 [file] [log] [blame]
// Copyright 2019 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/permissions/pref_notification_permission_ui_selector.h"
#include "base/optional.h"
#include "base/run_loop.h"
#include "base/test/mock_callback.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/common/chrome_features.h"
#include "chrome/test/base/testing_profile.h"
#include "components/content_settings/core/common/pref_names.h"
#include "components/permissions/test/mock_permission_request.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
using QuietUiReason = PrefNotificationPermissionUiSelector::QuietUiReason;
using WarningReason = PrefNotificationPermissionUiSelector::WarningReason;
using Decision = PrefNotificationPermissionUiSelector::Decision;
ACTION_P(QuitMessageLoop, loop) {
loop->Quit();
}
} // namespace
class PrefNotificationPermissionUiSelectorTest : public testing::Test {
public:
PrefNotificationPermissionUiSelectorTest()
: testing_profile_(std::make_unique<TestingProfile>()),
pref_selector_(testing_profile_.get()) {}
PrefNotificationPermissionUiSelector* pref_selector() {
return &pref_selector_;
}
TestingProfile* profile() { return testing_profile_.get(); }
private:
content::BrowserTaskEnvironment task_environment_;
std::unique_ptr<TestingProfile> testing_profile_;
PrefNotificationPermissionUiSelector pref_selector_;
DISALLOW_COPY_AND_ASSIGN(PrefNotificationPermissionUiSelectorTest);
};
TEST_F(PrefNotificationPermissionUiSelectorTest, FeatureAndPrefCombinations) {
const struct {
bool feature_enabled;
bool quiet_ui_enabled_in_prefs;
base::Optional<QuietUiReason> expected_reason;
} kTests[] = {
{true, false, Decision::UseNormalUi()},
{true, true, QuietUiReason::kEnabledInPrefs},
{false, true, Decision::UseNormalUi()},
{false, false, Decision::UseNormalUi()},
};
for (const auto& test_case : kTests) {
SCOPED_TRACE(base::StringPrintf("feature: %d, pref: %d",
test_case.feature_enabled,
test_case.quiet_ui_enabled_in_prefs));
// Init feature and pref settings.
base::test::ScopedFeatureList feature_list;
if (test_case.feature_enabled)
feature_list.InitAndEnableFeature(features::kQuietNotificationPrompts);
else
feature_list.InitAndDisableFeature(features::kQuietNotificationPrompts);
profile()->GetPrefs()->SetBoolean(
prefs::kEnableQuietNotificationPermissionUi,
test_case.quiet_ui_enabled_in_prefs);
// Setup and prepare for the request.
base::RunLoop callback_loop;
base::MockCallback<
PrefNotificationPermissionUiSelector::DecisionMadeCallback>
mock_callback;
Decision actual_decison(base::nullopt, base::nullopt);
// Make a request and wait for the callback.
EXPECT_CALL(mock_callback, Run)
.WillRepeatedly(DoAll(testing::SaveArg<0>(&actual_decison),
QuitMessageLoop(&callback_loop)));
permissions::MockPermissionRequest mock_request(
std::string(),
permissions::PermissionRequestType::PERMISSION_NOTIFICATIONS,
GURL("http://example.com"));
pref_selector()->SelectUiToUse(&mock_request, mock_callback.Get());
callback_loop.Run();
testing::Mock::VerifyAndClearExpectations(&mock_callback);
// Check expectations.
EXPECT_EQ(test_case.expected_reason, actual_decison.quiet_ui_reason);
EXPECT_EQ(Decision::ShowNoWarning(), actual_decison.warning_reason);
}
}