blob: 2c1c1b8418ad67c3abdc391f15e247fe49e7e002 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/devtools/devtools_settings.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
class DevToolsSettingsTest : public testing::Test {
protected:
content::BrowserTaskEnvironment task_environment_;
TestingProfile profile_;
};
// Simple smoke test to verify that the basic CRUD operations are working.
// Only verifies through the API, doesn't check the backend state.
TEST_F(DevToolsSettingsTest, BasicApiTest) {
DevToolsSettings settings(&profile_);
settings.Register("setting_a", {RegisterOptions::SyncMode::kSync});
settings.Register("setting_b", {RegisterOptions::SyncMode::kDontSync});
settings.Set("setting_a", "foo");
settings.Set("setting_b", "bar");
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting_a"), "foo");
EXPECT_EQ(*prefs.FindString("setting_b"), "bar");
settings.Remove("setting_a");
prefs = settings.Get();
EXPECT_EQ(prefs.FindString("setting_a"), nullptr);
settings.Clear();
prefs = settings.Get();
// kSyncDevToolsPreferenceFrontendName is always reported.
EXPECT_EQ(prefs.size(), static_cast<size_t>(1));
EXPECT_EQ(prefs.FindString("setting_b"), nullptr);
}
TEST_F(DevToolsSettingsTest, CanMoveUnsyncedSettingToBeingSynced) {
{
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kSync});
settings.Set("setting", "value");
}
// Simulate a new session by creating a new `DevToolsSettings` instance.
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kDontSync});
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting"), "value");
settings.Set("setting", "new_value");
prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting"), "new_value");
settings.Remove("setting");
prefs = settings.Get();
EXPECT_EQ(prefs.FindString("setting"), nullptr);
}
TEST_F(DevToolsSettingsTest, CanMoveSyncedSettingToBeingUnsynced) {
{
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kDontSync});
settings.Set("setting", "value");
}
// Simulate a new session by creating a new `DevToolsSettings` instance.
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kSync});
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting"), "value");
settings.Set("setting", "new_value");
prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting"), "new_value");
settings.Remove("setting");
prefs = settings.Get();
EXPECT_EQ(prefs.FindString("setting"), nullptr);
}
TEST_F(DevToolsSettingsTest, MovingUnsycnedToSyncedDoesNotOverwrite) {
// 1) Enable sync and register an unsynced setting.
{
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kDontSync});
settings.Set("setting", "unsynced value");
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
"true");
}
// 2) Simulate the update to synced plus setting of a new value on a
// different device.
{
ScopedDictPrefUpdate update(profile_.GetPrefs(),
prefs::kDevToolsSyncedPreferencesSyncEnabled);
update->Set("setting", "overwritten synced value");
}
// 3) Move the setting from unsynced to synced on this device but expect the
// already synced value to be honored.
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kSync});
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting"), "overwritten synced value");
}
TEST_F(DevToolsSettingsTest, Set_SetsTheUnderlyingTogglePreference) {
DevToolsSettings settings(&profile_);
settings.Register(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
{RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
EXPECT_TRUE(profile_.GetPrefs()->GetBoolean(prefs::kDevToolsSyncPreferences));
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "false");
EXPECT_FALSE(
profile_.GetPrefs()->GetBoolean(prefs::kDevToolsSyncPreferences));
}
TEST_F(DevToolsSettingsTest, Get_GetsTheUnderlyingTogglePreference) {
DevToolsSettings settings(&profile_);
settings.Register(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
{RegisterOptions::SyncMode::kSync});
profile_.GetPrefs()->SetBoolean(prefs::kDevToolsSyncPreferences, true);
auto prefs = settings.Get();
EXPECT_EQ(
*prefs.FindString(DevToolsSettings::kSyncDevToolsPreferencesFrontendName),
"true");
profile_.GetPrefs()->SetBoolean(prefs::kDevToolsSyncPreferences, false);
prefs = settings.Get();
EXPECT_EQ(
*prefs.FindString(DevToolsSettings::kSyncDevToolsPreferencesFrontendName),
"false");
}
TEST_F(DevToolsSettingsTest, Remove_ResetsUnderlyingTogglePreference) {
DevToolsSettings settings(&profile_);
settings.Register(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
{RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
settings.Remove(DevToolsSettings::kSyncDevToolsPreferencesFrontendName);
EXPECT_EQ(profile_.GetPrefs()->GetBoolean(prefs::kDevToolsSyncPreferences),
DevToolsSettings::kSyncDevToolsPreferencesDefault);
}
TEST_F(DevToolsSettingsTest, Remove_WorksOnBothStorages) {
{
ScopedDictPrefUpdate synced_update(
profile_.GetPrefs(), prefs::kDevToolsSyncedPreferencesSyncDisabled);
synced_update->Set("unknown setting", "value");
DevToolsSettings settings(&profile_);
settings.Register("synced setting", {RegisterOptions::SyncMode::kSync});
ScopedDictPrefUpdate unsynced_update(profile_.GetPrefs(),
prefs::kDevToolsPreferences);
unsynced_update->Set("synced setting", "value");
}
DevToolsSettings settings(&profile_);
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(prefs.size(), static_cast<size_t>(3));
settings.Remove("unknown setting");
settings.Remove("synced setting");
prefs = settings.Get();
EXPECT_EQ(prefs.size(), static_cast<size_t>(1));
}
TEST_F(DevToolsSettingsTest, Clear_ResetsUnderlyingTogglePreference) {
DevToolsSettings settings(&profile_);
settings.Register(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
{RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
settings.Clear();
EXPECT_EQ(profile_.GetPrefs()->GetBoolean(prefs::kDevToolsSyncPreferences),
DevToolsSettings::kSyncDevToolsPreferencesDefault);
}
TEST_F(DevToolsSettingsTest, EnableDisableSyncPreservesSettings) {
// 1) Enable sync and register settings
DevToolsSettings settings(&profile_);
settings.Register("setting_unsynced", {RegisterOptions::SyncMode::kDontSync});
settings.Register("setting_synced", {RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
// 2) Set initial values
settings.Set("setting_unsynced", "unsynced value");
settings.Set("setting_synced", "synced value");
// 3) Disable sync
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "false");
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting_unsynced"), "unsynced value");
EXPECT_EQ(*prefs.FindString("setting_synced"), "synced value");
}
TEST_F(DevToolsSettingsTest, DisableEnableSyncPreservesSettings) {
// 1) Disable sync and register settings
DevToolsSettings settings(&profile_);
settings.Register("setting_unsynced", {RegisterOptions::SyncMode::kDontSync});
settings.Register("setting_synced", {RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "false");
// 2) Set initial values
settings.Set("setting_unsynced", "unsynced value");
settings.Set("setting_synced", "synced value");
// 3) Enable sync
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
base::Value::Dict prefs = settings.Get();
EXPECT_EQ(*prefs.FindString("setting_unsynced"), "unsynced value");
EXPECT_EQ(*prefs.FindString("setting_synced"), "synced value");
}
TEST_F(DevToolsSettingsTest, GetPreference) {
// 1) Disable sync and register settings
DevToolsSettings settings(&profile_);
settings.Register("setting_unsynced", {RegisterOptions::SyncMode::kDontSync});
settings.Register("setting_synced", {RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "false");
EXPECT_EQ(
settings.Get(DevToolsSettings::kSyncDevToolsPreferencesFrontendName)
->GetString(),
"false");
// 2) Set initial values
settings.Set("setting_unsynced", "unsynced value");
settings.Set("setting_synced", "synced value");
// 3) Enable sync
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
EXPECT_EQ(
settings.Get(DevToolsSettings::kSyncDevToolsPreferencesFrontendName)
->GetString(),
"true");
EXPECT_EQ(settings.Get("setting_unsynced")->GetString(), "unsynced value");
EXPECT_EQ(settings.Get("setting_synced")->GetString(), "synced value");
EXPECT_EQ(settings.Get("nonexistent"), std::nullopt);
}