blob: e2a16a5919b59434e6a3da141b588e4bdb19c04c [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync/base/sync_prefs.h"
#include <memory>
#include "base/test/metrics/histogram_tester.h"
#include "base/test/task_environment.h"
#include "build/chromeos_buildflags.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_value_map.h"
#include "components/prefs/testing_pref_service.h"
#include "components/sync/base/pref_names.h"
#include "components/sync/base/user_selectable_type.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
using ::testing::InSequence;
using ::testing::StrictMock;
class SyncPrefsTest : public testing::Test {
protected:
SyncPrefsTest() {
SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
sync_prefs_ = std::make_unique<SyncPrefs>(&pref_service_);
}
base::test::SingleThreadTaskEnvironment task_environment_;
TestingPrefServiceSimple pref_service_;
std::unique_ptr<SyncPrefs> sync_prefs_;
};
TEST_F(SyncPrefsTest, EncryptionBootstrapToken) {
EXPECT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
sync_prefs_->SetEncryptionBootstrapToken("token");
EXPECT_EQ("token", sync_prefs_->GetEncryptionBootstrapToken());
sync_prefs_->ClearEncryptionBootstrapToken();
EXPECT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
}
class MockSyncPrefObserver : public SyncPrefObserver {
public:
MOCK_METHOD(void, OnSyncManagedPrefChange, (bool), (override));
MOCK_METHOD(void, OnFirstSetupCompletePrefChange, (bool), (override));
MOCK_METHOD(void, OnPreferredDataTypesPrefChange, (), (override));
};
TEST_F(SyncPrefsTest, ObservedPrefs) {
StrictMock<MockSyncPrefObserver> mock_sync_pref_observer;
InSequence dummy;
EXPECT_CALL(mock_sync_pref_observer, OnSyncManagedPrefChange(true));
EXPECT_CALL(mock_sync_pref_observer, OnSyncManagedPrefChange(false));
EXPECT_CALL(mock_sync_pref_observer, OnFirstSetupCompletePrefChange(true));
EXPECT_CALL(mock_sync_pref_observer, OnFirstSetupCompletePrefChange(false));
ASSERT_FALSE(sync_prefs_->IsSyncClientDisabledByPolicy());
ASSERT_FALSE(sync_prefs_->IsFirstSetupComplete());
ASSERT_FALSE(sync_prefs_->IsSyncRequested());
sync_prefs_->AddSyncPrefObserver(&mock_sync_pref_observer);
pref_service_.SetBoolean(prefs::kSyncManaged, true);
EXPECT_TRUE(sync_prefs_->IsSyncClientDisabledByPolicy());
pref_service_.SetBoolean(prefs::kSyncManaged, false);
EXPECT_FALSE(sync_prefs_->IsSyncClientDisabledByPolicy());
sync_prefs_->SetFirstSetupComplete();
EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
sync_prefs_->ClearFirstSetupComplete();
EXPECT_FALSE(sync_prefs_->IsFirstSetupComplete());
sync_prefs_->SetSyncRequested(true);
EXPECT_TRUE(sync_prefs_->IsSyncRequested());
sync_prefs_->SetSyncRequested(false);
EXPECT_FALSE(sync_prefs_->IsSyncRequested());
sync_prefs_->RemoveSyncPrefObserver(&mock_sync_pref_observer);
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(SyncPrefsTest, SetSelectedOsTypesTriggersPreferredDataTypesPrefChange) {
StrictMock<MockSyncPrefObserver> mock_sync_pref_observer;
EXPECT_CALL(mock_sync_pref_observer, OnPreferredDataTypesPrefChange());
sync_prefs_->AddSyncPrefObserver(&mock_sync_pref_observer);
sync_prefs_->SetSelectedOsTypes(/*sync_all_os_types=*/false,
UserSelectableOsTypeSet(),
UserSelectableOsTypeSet());
sync_prefs_->RemoveSyncPrefObserver(&mock_sync_pref_observer);
}
#endif
TEST_F(SyncPrefsTest, Basic) {
EXPECT_FALSE(sync_prefs_->IsFirstSetupComplete());
sync_prefs_->SetFirstSetupComplete();
EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
EXPECT_FALSE(sync_prefs_->IsSyncRequested());
sync_prefs_->SetSyncRequested(true);
EXPECT_TRUE(sync_prefs_->IsSyncRequested());
sync_prefs_->SetSyncRequested(false);
EXPECT_FALSE(sync_prefs_->IsSyncRequested());
EXPECT_TRUE(sync_prefs_->HasKeepEverythingSynced());
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/false,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/UserSelectableTypeSet::All());
EXPECT_FALSE(sync_prefs_->HasKeepEverythingSynced());
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/true,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/UserSelectableTypeSet());
EXPECT_TRUE(sync_prefs_->HasKeepEverythingSynced());
}
TEST_F(SyncPrefsTest, SelectedTypesKeepEverythingSynced) {
ASSERT_TRUE(sync_prefs_->HasKeepEverythingSynced());
EXPECT_EQ(UserSelectableTypeSet::All(), sync_prefs_->GetSelectedTypes());
for (UserSelectableType type : UserSelectableTypeSet::All()) {
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/true,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/{type});
EXPECT_EQ(UserSelectableTypeSet::All(), sync_prefs_->GetSelectedTypes());
}
}
TEST_F(SyncPrefsTest, SelectedTypesKeepEverythingSyncedButPolicyRestricted) {
ASSERT_TRUE(sync_prefs_->HasKeepEverythingSynced());
pref_service_.SetManagedPref(prefs::kSyncPreferences, base::Value(false));
UserSelectableTypeSet expected_type_set = UserSelectableTypeSet::All();
expected_type_set.Remove(UserSelectableType::kPreferences);
EXPECT_EQ(expected_type_set, sync_prefs_->GetSelectedTypes());
}
TEST_F(SyncPrefsTest, SelectedTypesNotKeepEverythingSynced) {
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/false,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/UserSelectableTypeSet());
ASSERT_NE(UserSelectableTypeSet::All(), sync_prefs_->GetSelectedTypes());
for (UserSelectableType type : UserSelectableTypeSet::All()) {
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/false,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/{type});
EXPECT_EQ(UserSelectableTypeSet{type}, sync_prefs_->GetSelectedTypes());
}
}
TEST_F(SyncPrefsTest, SelectedTypesNotKeepEverythingSyncedAndPolicyRestricted) {
pref_service_.SetManagedPref(prefs::kSyncPreferences, base::Value(false));
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/false,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/UserSelectableTypeSet());
ASSERT_FALSE(
sync_prefs_->GetSelectedTypes().Has(UserSelectableType::kPreferences));
for (UserSelectableType type : UserSelectableTypeSet::All()) {
sync_prefs_->SetSelectedTypes(
/*keep_everything_synced=*/false,
/*registered_types=*/UserSelectableTypeSet::All(),
/*selected_types=*/{type});
UserSelectableTypeSet expected_type_set = UserSelectableTypeSet{type};
expected_type_set.Remove(UserSelectableType::kPreferences);
EXPECT_EQ(expected_type_set, sync_prefs_->GetSelectedTypes());
}
}
TEST_F(SyncPrefsTest, SetTypeDisabledByPolicy) {
// By default, data types are enabled, and not policy-controlled.
ASSERT_TRUE(
sync_prefs_->GetSelectedTypes().Has(UserSelectableType::kBookmarks));
ASSERT_FALSE(
sync_prefs_->IsTypeManagedByPolicy(UserSelectableType::kBookmarks));
ASSERT_TRUE(
sync_prefs_->GetSelectedTypes().Has(UserSelectableType::kAutofill));
ASSERT_FALSE(
sync_prefs_->IsTypeManagedByPolicy(UserSelectableType::kAutofill));
// Set up a policy to disable bookmarks.
PrefValueMap policy_prefs;
SyncPrefs::SetTypeDisabledByPolicy(&policy_prefs,
UserSelectableType::kBookmarks);
// Copy the policy prefs map over into the PrefService.
for (const auto& policy_pref : policy_prefs) {
pref_service_.SetManagedPref(policy_pref.first, policy_pref.second.Clone());
}
// The policy should take effect and disable bookmarks.
EXPECT_FALSE(
sync_prefs_->GetSelectedTypes().Has(UserSelectableType::kBookmarks));
EXPECT_TRUE(
sync_prefs_->IsTypeManagedByPolicy(UserSelectableType::kBookmarks));
// Other types should be unaffected.
EXPECT_TRUE(
sync_prefs_->GetSelectedTypes().Has(UserSelectableType::kAutofill));
EXPECT_FALSE(
sync_prefs_->IsTypeManagedByPolicy(UserSelectableType::kAutofill));
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(SyncPrefsTest, IsSyncAllOsTypesEnabled) {
EXPECT_TRUE(sync_prefs_->IsSyncAllOsTypesEnabled());
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/false,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/UserSelectableOsTypeSet::All());
EXPECT_FALSE(sync_prefs_->IsSyncAllOsTypesEnabled());
// Browser pref is not affected.
EXPECT_TRUE(sync_prefs_->HasKeepEverythingSynced());
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/true,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/UserSelectableOsTypeSet::All());
EXPECT_TRUE(sync_prefs_->IsSyncAllOsTypesEnabled());
}
TEST_F(SyncPrefsTest, GetSelectedOsTypesWithAllOsTypesEnabled) {
EXPECT_TRUE(sync_prefs_->IsSyncAllOsTypesEnabled());
EXPECT_EQ(UserSelectableOsTypeSet::All(), sync_prefs_->GetSelectedOsTypes());
for (UserSelectableOsType type : UserSelectableOsTypeSet::All()) {
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/true,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/{type});
EXPECT_EQ(UserSelectableOsTypeSet::All(),
sync_prefs_->GetSelectedOsTypes());
}
}
TEST_F(SyncPrefsTest, GetSelectedOsTypesNotAllOsTypesSelected) {
const UserSelectableTypeSet browser_types = sync_prefs_->GetSelectedTypes();
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/false,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/UserSelectableOsTypeSet());
EXPECT_EQ(UserSelectableOsTypeSet(), sync_prefs_->GetSelectedOsTypes());
// Browser types are not changed.
EXPECT_EQ(browser_types, sync_prefs_->GetSelectedTypes());
for (UserSelectableOsType type : UserSelectableOsTypeSet::All()) {
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/false,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/{type});
EXPECT_EQ(UserSelectableOsTypeSet{type}, sync_prefs_->GetSelectedOsTypes());
// Browser types are not changed.
EXPECT_EQ(browser_types, sync_prefs_->GetSelectedTypes());
}
}
TEST_F(SyncPrefsTest, SelectedOsTypesKeepEverythingSyncedButPolicyRestricted) {
ASSERT_TRUE(sync_prefs_->HasKeepEverythingSynced());
pref_service_.SetManagedPref(prefs::kSyncOsPreferences, base::Value(false));
UserSelectableOsTypeSet expected_type_set = UserSelectableOsTypeSet::All();
expected_type_set.Remove(UserSelectableOsType::kOsPreferences);
EXPECT_EQ(expected_type_set, sync_prefs_->GetSelectedOsTypes());
}
TEST_F(SyncPrefsTest,
SelectedOsTypesNotKeepEverythingSyncedAndPolicyRestricted) {
pref_service_.SetManagedPref(prefs::kSyncOsPreferences, base::Value(false));
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/false,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/UserSelectableOsTypeSet());
ASSERT_FALSE(sync_prefs_->GetSelectedOsTypes().Has(
UserSelectableOsType::kOsPreferences));
for (UserSelectableOsType type : UserSelectableOsTypeSet::All()) {
sync_prefs_->SetSelectedOsTypes(
/*sync_all_os_types=*/false,
/*registered_types=*/UserSelectableOsTypeSet::All(),
/*selected_types=*/{type});
UserSelectableOsTypeSet expected_type_set = UserSelectableOsTypeSet{type};
expected_type_set.Remove(UserSelectableOsType::kOsPreferences);
EXPECT_EQ(expected_type_set, sync_prefs_->GetSelectedOsTypes());
}
}
TEST_F(SyncPrefsTest, SetOsTypeDisabledByPolicy) {
// By default, data types are enabled, and not policy-controlled.
ASSERT_TRUE(
sync_prefs_->GetSelectedOsTypes().Has(UserSelectableOsType::kOsApps));
ASSERT_FALSE(
sync_prefs_->IsOsTypeManagedByPolicy(UserSelectableOsType::kOsApps));
ASSERT_TRUE(sync_prefs_->GetSelectedOsTypes().Has(
UserSelectableOsType::kOsPreferences));
ASSERT_FALSE(sync_prefs_->IsOsTypeManagedByPolicy(
UserSelectableOsType::kOsPreferences));
// Set up a policy to disable apps.
PrefValueMap policy_prefs;
SyncPrefs::SetOsTypeDisabledByPolicy(&policy_prefs,
UserSelectableOsType::kOsApps);
// Copy the policy prefs map over into the PrefService.
for (const auto& policy_pref : policy_prefs) {
pref_service_.SetManagedPref(policy_pref.first, policy_pref.second.Clone());
}
// The policy should take effect and disable apps.
EXPECT_FALSE(
sync_prefs_->GetSelectedOsTypes().Has(UserSelectableOsType::kOsApps));
EXPECT_TRUE(
sync_prefs_->IsOsTypeManagedByPolicy(UserSelectableOsType::kOsApps));
// Other types should be unaffected.
EXPECT_TRUE(sync_prefs_->GetSelectedOsTypes().Has(
UserSelectableOsType::kOsPreferences));
EXPECT_FALSE(sync_prefs_->IsOsTypeManagedByPolicy(
UserSelectableOsType::kOsPreferences));
}
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
TEST_F(SyncPrefsTest, ShouldSetAppsSyncEnabledByOsToFalseByDefault) {
EXPECT_FALSE(sync_prefs_->IsAppsSyncEnabledByOs());
}
TEST_F(SyncPrefsTest, ShouldChangeAppsSyncEnabledByOsAndNotifyObservers) {
StrictMock<MockSyncPrefObserver> mock_sync_pref_observer;
sync_prefs_->AddSyncPrefObserver(&mock_sync_pref_observer);
EXPECT_CALL(mock_sync_pref_observer, OnPreferredDataTypesPrefChange());
sync_prefs_->SetAppsSyncEnabledByOs(/*apps_sync_enabled=*/true);
EXPECT_TRUE(sync_prefs_->IsAppsSyncEnabledByOs());
testing::Mock::VerifyAndClearExpectations(&mock_sync_pref_observer);
EXPECT_CALL(mock_sync_pref_observer, OnPreferredDataTypesPrefChange());
sync_prefs_->SetAppsSyncEnabledByOs(/*apps_sync_enabled=*/false);
EXPECT_FALSE(sync_prefs_->IsAppsSyncEnabledByOs());
}
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
TEST_F(SyncPrefsTest, PassphrasePromptMutedProductVersion) {
EXPECT_EQ(0, sync_prefs_->GetPassphrasePromptMutedProductVersion());
sync_prefs_->SetPassphrasePromptMutedProductVersion(83);
EXPECT_EQ(83, sync_prefs_->GetPassphrasePromptMutedProductVersion());
sync_prefs_->ClearPassphrasePromptMutedProductVersion();
EXPECT_EQ(0, sync_prefs_->GetPassphrasePromptMutedProductVersion());
}
enum BooleanPrefState { PREF_FALSE, PREF_TRUE, PREF_UNSET };
// Similar to SyncPrefsTest, but does not create a SyncPrefs instance. This lets
// individual tests set up the "before" state of the PrefService before
// SyncPrefs gets created.
class SyncPrefsMigrationTest : public testing::Test {
protected:
SyncPrefsMigrationTest() {
SyncPrefs::RegisterProfilePrefs(pref_service_.registry());
}
void SetBooleanUserPrefValue(const char* pref_name, BooleanPrefState state) {
switch (state) {
case PREF_FALSE:
pref_service_.SetBoolean(pref_name, false);
break;
case PREF_TRUE:
pref_service_.SetBoolean(pref_name, true);
break;
case PREF_UNSET:
pref_service_.ClearPref(pref_name);
break;
}
}
BooleanPrefState GetBooleanUserPrefValue(const char* pref_name) const {
const base::Value* pref_value = pref_service_.GetUserPrefValue(pref_name);
if (!pref_value) {
return PREF_UNSET;
}
return pref_value->GetBool() ? PREF_TRUE : PREF_FALSE;
}
bool BooleanUserPrefMatches(const char* pref_name,
BooleanPrefState state) const {
const base::Value* pref_value = pref_service_.GetUserPrefValue(pref_name);
switch (state) {
case PREF_FALSE:
return pref_value && !pref_value->GetBool();
case PREF_TRUE:
return pref_value && pref_value->GetBool();
case PREF_UNSET:
return !pref_value;
}
}
base::test::SingleThreadTaskEnvironment task_environment_;
TestingPrefServiceSimple pref_service_;
};
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
TEST_F(SyncPrefsMigrationTest, SyncRequested_NothingSet) {
// None of the prefs is set explicitly.
ASSERT_FALSE(pref_service_.GetUserPrefValue(prefs::kSyncRequested));
ASSERT_FALSE(pref_service_.GetUserPrefValue(prefs::kSyncFirstSetupComplete));
ASSERT_FALSE(
pref_service_.GetUserPrefValue(prefs::kSyncKeepEverythingSynced));
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have left all the prefs unset.
EXPECT_FALSE(pref_service_.GetUserPrefValue(prefs::kSyncRequested));
EXPECT_FALSE(pref_service_.GetUserPrefValue(prefs::kSyncFirstSetupComplete));
EXPECT_FALSE(
pref_service_.GetUserPrefValue(prefs::kSyncKeepEverythingSynced));
}
TEST_F(SyncPrefsMigrationTest, SyncRequested_SyncRequestedWithAllTypes) {
pref_service_.SetBoolean(prefs::kSyncRequested, true);
pref_service_.SetBoolean(prefs::kSyncFirstSetupComplete, true);
pref_service_.SetBoolean(prefs::kSyncKeepEverythingSynced, true);
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have changed nothing.
SyncPrefs prefs(&pref_service_);
EXPECT_TRUE(prefs.IsSyncRequested());
EXPECT_TRUE(prefs.IsFirstSetupComplete());
EXPECT_TRUE(prefs.HasKeepEverythingSynced());
}
TEST_F(SyncPrefsMigrationTest, SyncRequested_SyncRequestedWithSomeTypes) {
const UserSelectableTypeSet enabled_types{UserSelectableType::kBookmarks,
UserSelectableType::kPreferences};
pref_service_.SetBoolean(prefs::kSyncRequested, true);
pref_service_.SetBoolean(prefs::kSyncFirstSetupComplete, true);
pref_service_.SetBoolean(prefs::kSyncKeepEverythingSynced, false);
for (UserSelectableType type : enabled_types) {
const char* pref_name = SyncPrefs::GetPrefNameForTypeForTesting(type);
pref_service_.SetBoolean(pref_name, true);
}
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have changed nothing.
SyncPrefs prefs(&pref_service_);
EXPECT_TRUE(prefs.IsSyncRequested());
EXPECT_TRUE(prefs.IsFirstSetupComplete());
EXPECT_FALSE(prefs.HasKeepEverythingSynced());
EXPECT_EQ(prefs.GetSelectedTypes(), enabled_types);
}
TEST_F(SyncPrefsMigrationTest, SyncRequested_SyncRequestedWithNoTypes) {
pref_service_.SetBoolean(prefs::kSyncRequested, true);
pref_service_.SetBoolean(prefs::kSyncFirstSetupComplete, true);
pref_service_.SetBoolean(prefs::kSyncKeepEverythingSynced, false);
// All selectable types are false by default.
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have changed nothing.
SyncPrefs prefs(&pref_service_);
EXPECT_TRUE(prefs.IsSyncRequested());
EXPECT_TRUE(prefs.IsFirstSetupComplete());
EXPECT_FALSE(prefs.HasKeepEverythingSynced());
EXPECT_TRUE(prefs.GetSelectedTypes().Empty());
}
TEST_F(SyncPrefsMigrationTest, SyncRequested_SyncNotRequestedWithNoTypes) {
pref_service_.SetBoolean(prefs::kSyncRequested, false);
pref_service_.SetBoolean(prefs::kSyncFirstSetupComplete, true);
pref_service_.SetBoolean(prefs::kSyncKeepEverythingSynced, false);
// All selectable types are false by default.
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have set SyncRequested to true, but kept all data
// types disabled.
SyncPrefs prefs(&pref_service_);
EXPECT_TRUE(prefs.IsSyncRequested());
EXPECT_TRUE(prefs.IsFirstSetupComplete());
EXPECT_FALSE(prefs.HasKeepEverythingSynced());
EXPECT_TRUE(prefs.GetSelectedTypes().Empty());
}
TEST_F(SyncPrefsMigrationTest, SyncRequested_SyncNotRequestedWithSomeTypes) {
const UserSelectableTypeSet enabled_types{UserSelectableType::kBookmarks,
UserSelectableType::kPreferences};
pref_service_.SetBoolean(prefs::kSyncRequested, false);
pref_service_.SetBoolean(prefs::kSyncFirstSetupComplete, true);
pref_service_.SetBoolean(prefs::kSyncKeepEverythingSynced, false);
for (UserSelectableType type : enabled_types) {
const char* pref_name = SyncPrefs::GetPrefNameForTypeForTesting(type);
pref_service_.SetBoolean(pref_name, true);
}
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have set SyncRequested to true, but turned off all
// data types.
SyncPrefs prefs(&pref_service_);
EXPECT_TRUE(prefs.IsSyncRequested());
EXPECT_TRUE(prefs.IsFirstSetupComplete());
EXPECT_FALSE(prefs.HasKeepEverythingSynced());
EXPECT_TRUE(prefs.GetSelectedTypes().Empty());
}
TEST_F(SyncPrefsMigrationTest, SyncRequested_SyncNotRequestedWithAllTypes) {
const UserSelectableTypeSet enabled_types{UserSelectableType::kBookmarks,
UserSelectableType::kPreferences};
pref_service_.SetBoolean(prefs::kSyncRequested, false);
pref_service_.SetBoolean(prefs::kSyncFirstSetupComplete, true);
pref_service_.SetBoolean(prefs::kSyncKeepEverythingSynced, true);
// Even though "Sync everything" is enabled, also explicitly set some of the
// individual data type prefs, to make sure the migration handles this case.
for (UserSelectableType type : enabled_types) {
const char* pref_name = SyncPrefs::GetPrefNameForTypeForTesting(type);
pref_service_.SetBoolean(pref_name, true);
}
// Run the migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// The migration should have set SyncRequested to true, but turned off all
// data types and the "sync everything" flag.
SyncPrefs prefs(&pref_service_);
EXPECT_TRUE(prefs.IsSyncRequested());
EXPECT_TRUE(prefs.IsFirstSetupComplete());
EXPECT_FALSE(prefs.HasKeepEverythingSynced());
EXPECT_TRUE(prefs.GetSelectedTypes().Empty());
}
// There are three boolean prefs which are relevant for the "SyncRequested"
// migration: kSyncRequested, kSyncFirstSetupComplete, and
// kSyncKeepEverythingSynced (and technically also all the data-type-specific
// prefs, which are not covered by this test). Each can be explicitly true,
// explicitly false, or unset. This class is parameterized to cover all possible
// combinations.
class SyncPrefsSyncRequestedMigrationCombinationsTest
: public SyncPrefsMigrationTest,
public testing::WithParamInterface<testing::tuple<BooleanPrefState,
BooleanPrefState,
BooleanPrefState>> {};
TEST_P(SyncPrefsSyncRequestedMigrationCombinationsTest, Idempotent) {
// Set the initial values (true, false, or unset) of the three prefs from the
// test params.
SetBooleanUserPrefValue(prefs::kSyncRequested, testing::get<0>(GetParam()));
SetBooleanUserPrefValue(prefs::kSyncFirstSetupComplete,
testing::get<1>(GetParam()));
SetBooleanUserPrefValue(prefs::kSyncKeepEverythingSynced,
testing::get<2>(GetParam()));
// Do the first migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// Record the resulting pref values.
BooleanPrefState expect_sync_requested =
GetBooleanUserPrefValue(prefs::kSyncRequested);
BooleanPrefState expect_first_setup_complete =
GetBooleanUserPrefValue(prefs::kSyncFirstSetupComplete);
BooleanPrefState expect_sync_everything =
GetBooleanUserPrefValue(prefs::kSyncKeepEverythingSynced);
// Do the second migration.
syncer::SyncPrefs::MigrateSyncRequestedPrefPostMice(&pref_service_);
// Verify that the pref values did not change.
EXPECT_TRUE(
BooleanUserPrefMatches(prefs::kSyncRequested, expect_sync_requested));
EXPECT_TRUE(BooleanUserPrefMatches(prefs::kSyncFirstSetupComplete,
expect_first_setup_complete));
EXPECT_TRUE(BooleanUserPrefMatches(prefs::kSyncKeepEverythingSynced,
expect_sync_everything));
}
// Not all combinations of pref values are possible in practice, but anyway the
// migration should always be idempotent, so we test all combinations here.
INSTANTIATE_TEST_SUITE_P(
All,
SyncPrefsSyncRequestedMigrationCombinationsTest,
testing::Combine(::testing::Values(PREF_FALSE, PREF_TRUE, PREF_UNSET),
::testing::Values(PREF_FALSE, PREF_TRUE, PREF_UNSET),
::testing::Values(PREF_FALSE, PREF_TRUE, PREF_UNSET)));
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
} // namespace
} // namespace syncer