#include "components/sync/service/sync_prefs.h"
#include <memory>
#include <vector>
#include "base/base64.h"
#include "base/test/scoped_feature_list.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/signin/public/base/gaia_id_hash.h"
#include "components/signin/public/base/signin_pref_names.h"
#include "components/signin/public/base/signin_switches.h"
#include "components/sync/base/features.h"
#include "components/sync/base/pref_names.h"
#include "components/sync/base/user_selectable_type.h"
#include "components/sync/protocol/nigori_specifics.pb.h"
#include "components/sync/service/glue/sync_transport_data_prefs.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
_;
AtMost;
InSequence;
StrictMock;
constexpr char kObsoleteAutofillWalletImportEnabled[] = …;
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
constexpr char kGaiaId[] = …;
#endif
class SyncPrefsTest : public testing::Test { … };
TEST_F(SyncPrefsTest, EncryptionBootstrapTokenPerAccountSignedOut) { … }
TEST_F(SyncPrefsTest, EncryptionBootstrapTokenPerAccount) { … }
TEST_F(SyncPrefsTest, ClearEncryptionBootstrapTokenPerAccount) { … }
TEST_F(SyncPrefsTest, CachedPassphraseType) { … }
TEST_F(SyncPrefsTest, CachedTrustedVaultAutoUpgradeExperimentGroup) { … }
TEST_F(SyncPrefsTest, CachedTrustedVaultAutoUpgradeExperimentGroupCorrupt) { … }
class MockSyncPrefObserver : public SyncPrefObserver { … };
TEST_F(SyncPrefsTest, ObservedPrefs) { … }
#if !BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(SyncPrefsTest, FirstSetupCompletePrefChange) { … }
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(SyncPrefsTest, SyncFeatureDisabledViaDashboard) {
EXPECT_FALSE(sync_prefs_->IsSyncFeatureDisabledViaDashboard());
sync_prefs_->SetSyncFeatureDisabledViaDashboard();
EXPECT_TRUE(sync_prefs_->IsSyncFeatureDisabledViaDashboard());
sync_prefs_->ClearSyncFeatureDisabledViaDashboard();
EXPECT_FALSE(sync_prefs_->IsSyncFeatureDisabledViaDashboard());
}
TEST_F(SyncPrefsTest, SetSelectedOsTypesTriggersPreferredDataTypesPrefChange) {
StrictMock<MockSyncPrefObserver> mock_sync_pref_observer;
EXPECT_CALL(mock_sync_pref_observer, OnSelectedTypesPrefChange);
sync_prefs_->AddObserver(&mock_sync_pref_observer);
sync_prefs_->SetSelectedOsTypes(false,
UserSelectableOsTypeSet(),
UserSelectableOsTypeSet());
sync_prefs_->RemoveObserver(&mock_sync_pref_observer);
}
#endif
TEST_F(SyncPrefsTest, Basic) { … }
TEST_F(SyncPrefsTest, SelectedTypesKeepEverythingSynced) { … }
TEST_F(SyncPrefsTest, SelectedTypesKeepEverythingSyncedButPolicyRestricted) { … }
TEST_F(SyncPrefsTest, SelectedTypesNotKeepEverythingSynced) { … }
TEST_F(SyncPrefsTest, SelectedTypesNotKeepEverythingSyncedAndPolicyRestricted) { … }
TEST_F(SyncPrefsTest, SetTypeDisabledByPolicy) { … }
TEST_F(SyncPrefsTest, SetTypeDisabledByCustodian) { … }
TEST_F(SyncPrefsTest,
DefaultSelectedTypesForAccountInTransportMode_SyncToSigninDisabled) { … }
TEST_F(SyncPrefsTest,
DefaultSelectedTypesForAccountInTransportMode_SyncToSigninEnabled) { … }
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
class SyncPrefsExplicitBrowserSigninTest : public SyncPrefsTest { … };
TEST_F(SyncPrefsExplicitBrowserSigninTest, DefaultWithExplicitBrowserSignin) { … }
#endif
TEST_F(SyncPrefsTest, SetSelectedTypesForAccountInTransportMode) { … }
TEST_F(SyncPrefsTest,
SetSelectedTypesForAccountInTransportModeWithPolicyRestrictedType) { … }
TEST_F(SyncPrefsTest, KeepAccountSettingsPrefsOnlyForUsers) { … }
#if BUILDFLAG(IS_CHROMEOS_ASH)
TEST_F(SyncPrefsTest, IsSyncAllOsTypesEnabled) {
EXPECT_TRUE(sync_prefs_->IsSyncAllOsTypesEnabled());
sync_prefs_->SetSelectedOsTypes(
false,
UserSelectableOsTypeSet::All(),
UserSelectableOsTypeSet::All());
EXPECT_FALSE(sync_prefs_->IsSyncAllOsTypesEnabled());
EXPECT_TRUE(sync_prefs_->HasKeepEverythingSynced());
sync_prefs_->SetSelectedOsTypes(
true,
UserSelectableOsTypeSet::All(),
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(
true,
UserSelectableOsTypeSet::All(),
{type});
EXPECT_EQ(UserSelectableOsTypeSet::All(),
sync_prefs_->GetSelectedOsTypes());
}
}
TEST_F(SyncPrefsTest, GetSelectedOsTypesNotAllOsTypesSelected) {
const UserSelectableTypeSet browser_types =
sync_prefs_->GetSelectedTypesForSyncingUser();
sync_prefs_->SetSelectedOsTypes(
false,
UserSelectableOsTypeSet::All(),
UserSelectableOsTypeSet());
EXPECT_EQ(UserSelectableOsTypeSet(), sync_prefs_->GetSelectedOsTypes());
EXPECT_EQ(browser_types, sync_prefs_->GetSelectedTypesForSyncingUser());
for (UserSelectableOsType type : UserSelectableOsTypeSet::All()) {
sync_prefs_->SetSelectedOsTypes(
false,
UserSelectableOsTypeSet::All(),
{type});
EXPECT_EQ(UserSelectableOsTypeSet({type}),
sync_prefs_->GetSelectedOsTypes());
EXPECT_EQ(browser_types, sync_prefs_->GetSelectedTypesForSyncingUser());
}
}
TEST_F(SyncPrefsTest, SelectedOsTypesKeepEverythingSyncedButPolicyRestricted) {
ASSERT_TRUE(sync_prefs_->HasKeepEverythingSynced());
pref_service_.SetManagedPref(prefs::internal::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::internal::kSyncOsPreferences,
base::Value(false));
sync_prefs_->SetSelectedOsTypes(
false,
UserSelectableOsTypeSet::All(),
UserSelectableOsTypeSet());
ASSERT_FALSE(sync_prefs_->GetSelectedOsTypes().Has(
UserSelectableOsType::kOsPreferences));
for (UserSelectableOsType type : UserSelectableOsTypeSet::All()) {
sync_prefs_->SetSelectedOsTypes(
false,
UserSelectableOsTypeSet::All(),
{type});
UserSelectableOsTypeSet expected_type_set = {type};
expected_type_set.Remove(UserSelectableOsType::kOsPreferences);
EXPECT_EQ(expected_type_set, sync_prefs_->GetSelectedOsTypes());
}
}
TEST_F(SyncPrefsTest, SetOsTypeDisabledByPolicy) {
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));
PrefValueMap policy_prefs;
SyncPrefs::SetOsTypeDisabledByPolicy(&policy_prefs,
UserSelectableOsType::kOsApps);
for (const auto& policy_pref : policy_prefs) {
pref_service_.SetManagedPref(policy_pref.first, policy_pref.second.Clone());
}
EXPECT_FALSE(
sync_prefs_->GetSelectedOsTypes().Has(UserSelectableOsType::kOsApps));
EXPECT_TRUE(
sync_prefs_->IsOsTypeManagedByPolicy(UserSelectableOsType::kOsApps));
EXPECT_TRUE(sync_prefs_->GetSelectedOsTypes().Has(
UserSelectableOsType::kOsPreferences));
EXPECT_FALSE(sync_prefs_->IsOsTypeManagedByPolicy(
UserSelectableOsType::kOsPreferences));
}
#endif
#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_->AddObserver(&mock_sync_pref_observer);
EXPECT_CALL(mock_sync_pref_observer, OnSelectedTypesPrefChange);
sync_prefs_->SetAppsSyncEnabledByOs(true);
EXPECT_TRUE(sync_prefs_->IsAppsSyncEnabledByOs());
testing::Mock::VerifyAndClearExpectations(&mock_sync_pref_observer);
EXPECT_CALL(mock_sync_pref_observer, OnSelectedTypesPrefChange);
sync_prefs_->SetAppsSyncEnabledByOs(false);
EXPECT_FALSE(sync_prefs_->IsAppsSyncEnabledByOs());
}
#endif
TEST_F(SyncPrefsTest, PassphrasePromptMutedProductVersion) { … }
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
TEST_F(SyncPrefsTest, GetNumberOfAccountsWithPasswordsSelected) { … }
#endif
TEST_F(SyncPrefsTest, PasswordSyncAllowed_DefaultValue) { … }
TEST_F(SyncPrefsTest, PasswordSyncAllowed_ExplicitValue) { … }
enum BooleanPrefState { … };
class SyncPrefsMigrationTest : public testing::Test { … };
TEST_F(SyncPrefsMigrationTest, MigrateAutofillWalletImportEnabledPrefIfSet) { … }
TEST_F(SyncPrefsMigrationTest, MigrateAutofillWalletImportEnabledPrefIfUnset) { … }
TEST_F(SyncPrefsMigrationTest,
MigrateAutofillWalletImportEnabledPrefIfUnsetWithSyncEverythingOff) { … }
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
TEST_F(SyncPrefsMigrationTest,
DoNotMigratePasswordsToPerAccountPrefIfLastGaiaIdMissing) { … }
TEST_F(SyncPrefsMigrationTest,
DoNotMigratePasswordsToPerAccountPrefIfSyncEverythingEnabled) { … }
TEST_F(SyncPrefsMigrationTest,
DoNotMigratePasswordsToPerAccountPrefIfPasswordsEnabled) { … }
TEST_F(SyncPrefsMigrationTest,
DoNotMigratePasswordsToPerAccountPrefIfFlagDisabled) { … }
TEST_F(SyncPrefsMigrationTest, MigratePasswordsToPerAccountPrefRunsOnce) { … }
TEST_F(SyncPrefsMigrationTest, MigrateAddressesToPerAccountPref) { … }
#endif
TEST_F(SyncPrefsMigrationTest, NoPassphraseMigrationForSignoutUsers) { … }
TEST_F(SyncPrefsMigrationTest, PassphraseMigrationDone) { … }
TEST_F(SyncPrefsMigrationTest, PassphraseMigrationOnlyOnce) { … }
TEST_F(SyncPrefsMigrationTest, PassphraseMigrationOnlyOnceWithBrowserRestart) { … }
TEST_F(SyncPrefsMigrationTest, NoMigrationForSignedOutUser) { … }
TEST_F(SyncPrefsMigrationTest, NoMigrationForSyncingUser) { … }
TEST_F(SyncPrefsMigrationTest, RunsOnlyOnce) { … }
TEST_F(SyncPrefsMigrationTest, RunsAgainAfterFeatureReenabled) { … }
TEST_F(SyncPrefsMigrationTest, GlobalPrefsAreUnchanged) { … }
TEST_F(SyncPrefsMigrationTest, TurnsPreferencesOff) { … }
TEST_F(SyncPrefsMigrationTest, MigratesBookmarksOptedIn) { … }
TEST_F(SyncPrefsMigrationTest, MigratesBookmarksNotOptedIn) { … }
TEST_F(SyncPrefsMigrationTest, TurnsAutofillOffForCustomPassphraseUser) { … }
TEST_F(SyncPrefsMigrationTest,
LeavesAutofillAloneForUserWithoutExplicitPassphrase) { … }
TEST_F(SyncPrefsMigrationTest, Part2RunsOnSecondAttempt) { … }
TEST_F(SyncPrefsMigrationTest, GlobalToAccount_DefaultState) { … }
TEST_F(SyncPrefsMigrationTest, GlobalToAccount_CustomState) { … }
TEST_F(SyncPrefsMigrationTest, GlobalToAccount_HistoryDisabled) { … }
TEST_F(SyncPrefsMigrationTest, GlobalToAccount_TabsDisabled) { … }
TEST_F(SyncPrefsMigrationTest, GlobalToAccount_CustomPassphrase) { … }
TEST_F(SyncPrefsMigrationTest,
GlobalToAccount_SuppressesSyncToSigninMigration) { … }
TEST_F(SyncPrefsTest, IsTypeDisabledByUserForAccount) { … }
}
}