#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_;
};
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();
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");
}
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");
}
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) {
{
DevToolsSettings settings(&profile_);
settings.Register("setting", {RegisterOptions::SyncMode::kDontSync});
settings.Set("setting", "unsynced value");
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
"true");
}
{
ScopedDictPrefUpdate update(profile_.GetPrefs(),
prefs::kDevToolsSyncedPreferencesSyncEnabled);
update->Set("setting", "overwritten synced value");
}
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) {
DevToolsSettings settings(&profile_);
settings.Register("setting_unsynced", {RegisterOptions::SyncMode::kDontSync});
settings.Register("setting_synced", {RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "true");
settings.Set("setting_unsynced", "unsynced value");
settings.Set("setting_synced", "synced value");
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) {
DevToolsSettings settings(&profile_);
settings.Register("setting_unsynced", {RegisterOptions::SyncMode::kDontSync});
settings.Register("setting_synced", {RegisterOptions::SyncMode::kSync});
settings.Set(DevToolsSettings::kSyncDevToolsPreferencesFrontendName, "false");
settings.Set("setting_unsynced", "unsynced value");
settings.Set("setting_synced", "synced value");
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) {
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");
settings.Set("setting_unsynced", "unsynced value");
settings.Set("setting_synced", "synced value");
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);
}