blob: aa38ad2a7a1dd8f0c589cc423fc24c3b072d04cc [file] [log] [blame]
// Copyright 2021 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 "components/sync/driver/glue/sync_transport_data_prefs.h"
#include <memory>
#include "base/time/time.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
class SyncTransportDataPrefsTest : public testing::Test {
protected:
SyncTransportDataPrefsTest() {
SyncTransportDataPrefs::RegisterProfilePrefs(pref_service_.registry());
sync_prefs_ = std::make_unique<SyncTransportDataPrefs>(&pref_service_);
}
TestingPrefServiceSimple pref_service_;
std::unique_ptr<SyncTransportDataPrefs> sync_prefs_;
};
// Verify that invalidation versions are persisted and loaded correctly.
TEST_F(SyncTransportDataPrefsTest, InvalidationVersions) {
std::map<ModelType, int64_t> versions;
versions[BOOKMARKS] = 10;
versions[SESSIONS] = 20;
versions[PREFERENCES] = 30;
sync_prefs_->UpdateInvalidationVersions(versions);
std::map<ModelType, int64_t> versions2 =
sync_prefs_->GetInvalidationVersions();
EXPECT_EQ(versions.size(), versions2.size());
for (auto [type, version] : versions2) {
EXPECT_EQ(versions[type], version);
}
}
TEST_F(SyncTransportDataPrefsTest, MigrateInvalidationVersions) {
// Set up entries for all data types in the legacy pref.
base::Value legacy_invalidation_versions(base::Value::Type::DICTIONARY);
legacy_invalidation_versions.SetStringPath("Bookmarks", "11");
legacy_invalidation_versions.SetStringPath("Preferences", "12");
legacy_invalidation_versions.SetStringPath("Passwords", "13");
legacy_invalidation_versions.SetStringPath("Autofill Profiles", "14");
legacy_invalidation_versions.SetStringPath("Autofill", "15");
legacy_invalidation_versions.SetStringPath("Autofill Wallet", "16");
legacy_invalidation_versions.SetStringPath("Autofill Wallet Metadata", "17");
legacy_invalidation_versions.SetStringPath("Autofill Wallet Offer", "18");
legacy_invalidation_versions.SetStringPath("Themes", "19");
legacy_invalidation_versions.SetStringPath("Typed URLs", "20");
legacy_invalidation_versions.SetStringPath("Extensions", "21");
legacy_invalidation_versions.SetStringPath("Search Engines", "22");
legacy_invalidation_versions.SetStringPath("Sessions", "23");
legacy_invalidation_versions.SetStringPath("Apps", "24");
legacy_invalidation_versions.SetStringPath("App settings", "25");
legacy_invalidation_versions.SetStringPath("Extension settings", "26");
legacy_invalidation_versions.SetStringPath("History Delete Directives", "27");
legacy_invalidation_versions.SetStringPath("Dictionary", "28");
legacy_invalidation_versions.SetStringPath("Device Info", "29");
legacy_invalidation_versions.SetStringPath("Priority Preferences", "30");
legacy_invalidation_versions.SetStringPath("Managed User Settings", "31");
legacy_invalidation_versions.SetStringPath("App List", "32");
legacy_invalidation_versions.SetStringPath("Arc Package", "33");
legacy_invalidation_versions.SetStringPath("Printers", "34");
legacy_invalidation_versions.SetStringPath("Reading List", "35");
legacy_invalidation_versions.SetStringPath("Send Tab To Self", "36");
legacy_invalidation_versions.SetStringPath("Wifi Configurations", "37");
legacy_invalidation_versions.SetStringPath("Web Apps", "38");
legacy_invalidation_versions.SetStringPath("OS Preferences", "39");
legacy_invalidation_versions.SetStringPath("OS Priority Preferences", "40");
legacy_invalidation_versions.SetStringPath("Workspace Desk", "41");
legacy_invalidation_versions.SetStringPath("Encryption Keys", "42");
pref_service_.Set("sync.invalidation_versions", legacy_invalidation_versions);
const size_t data_type_count = legacy_invalidation_versions.DictSize();
// The legacy pref should not be used by GetInvalidationVersions().
ASSERT_TRUE(sync_prefs_->GetInvalidationVersions().empty());
// Run the migration!
SyncTransportDataPrefs::MigrateInvalidationVersions(&pref_service_);
// Make sure the entries were properly migrated.
std::map<ModelType, int64_t> versions =
sync_prefs_->GetInvalidationVersions();
EXPECT_EQ(versions.size(), data_type_count);
// Just spot-check the actual values for a few types.
EXPECT_EQ(versions[BOOKMARKS], 11);
EXPECT_EQ(versions[EXTENSION_SETTINGS], 26);
EXPECT_EQ(versions[NIGORI], 42);
// Make some changes to the invalidation versions, then run the migration
// again. This should *not* overwrite the new values.
versions[BOOKMARKS] = 50;
versions[EXTENSIONS] = 51;
versions.erase(OS_PREFERENCES);
sync_prefs_->UpdateInvalidationVersions(versions);
SyncTransportDataPrefs::MigrateInvalidationVersions(&pref_service_);
versions = sync_prefs_->GetInvalidationVersions();
EXPECT_EQ(versions.size(), data_type_count - 1);
EXPECT_EQ(versions[BOOKMARKS], 50);
EXPECT_EQ(versions[EXTENSIONS], 51);
}
TEST_F(SyncTransportDataPrefsTest, PollInterval) {
EXPECT_TRUE(sync_prefs_->GetPollInterval().is_zero());
sync_prefs_->SetPollInterval(base::Minutes(30));
EXPECT_FALSE(sync_prefs_->GetPollInterval().is_zero());
EXPECT_EQ(sync_prefs_->GetPollInterval().InMinutes(), 30);
}
TEST_F(SyncTransportDataPrefsTest, ResetsVeryShortPollInterval) {
// Set the poll interval to something unreasonably short.
sync_prefs_->SetPollInterval(base::Milliseconds(100));
// This should reset the pref to "empty", so that callers will use a
// reasonable default value.
EXPECT_TRUE(sync_prefs_->GetPollInterval().is_zero());
}
TEST_F(SyncTransportDataPrefsTest, LastSyncTime) {
EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
const base::Time now = base::Time::Now();
sync_prefs_->SetLastSyncedTime(now);
EXPECT_EQ(now, sync_prefs_->GetLastSyncedTime());
}
TEST_F(SyncTransportDataPrefsTest, ClearAll) {
sync_prefs_->SetLastSyncedTime(base::Time::Now());
ASSERT_NE(base::Time(), sync_prefs_->GetLastSyncedTime());
sync_prefs_->ClearAll();
EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
}
} // namespace
} // namespace syncer