| Index: chrome/browser/prefs/tracked/tracked_preferences_migration_unittest.cc
|
| diff --git a/chrome/browser/prefs/tracked/tracked_preferences_migration_unittest.cc b/chrome/browser/prefs/tracked/tracked_preferences_migration_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1c93a39fc0920e8cdfb6c93dc9538add9f755c5c
|
| --- /dev/null
|
| +++ b/chrome/browser/prefs/tracked/tracked_preferences_migration_unittest.cc
|
| @@ -0,0 +1,501 @@
|
| +// Copyright 2014 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 "chrome/browser/prefs/tracked/tracked_preferences_migration.h"
|
| +
|
| +#include <set>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/prefs/interceptable_pref_filter.h"
|
| +#include "chrome/browser/prefs/tracked/tracked_preferences_migration.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace {
|
| +
|
| +// An unprotected pref.
|
| +const char kUnprotectedPref[] = "unprotected";
|
| +// A protected pref.
|
| +const char kProtectedPref[] = "protected";
|
| +// A protected pref which is initially stored in the unprotected store.
|
| +const char kPreviouslyUnprotectedPref[] = "previously.unprotected";
|
| +// An unprotected pref which is initially stored in the protected store.
|
| +const char kPreviouslyProtectedPref[] = "previously.protected";
|
| +
|
| +const char kUnprotectedPrefValue[] = "unprotected_value";
|
| +const char kProtectedPrefValue[] = "protected_value";
|
| +const char kPreviouslyUnprotectedPrefValue[] = "previously_unprotected_value";
|
| +const char kPreviouslyProtectedPrefValue[] = "previously_protected_value";
|
| +
|
| +// A simple InterceptablePrefFilter which doesn't do anything but hand the prefs
|
| +// back downstream in FinalizeFilterOnLoad.
|
| +class SimpleInterceptablePrefFilter : public InterceptablePrefFilter {
|
| + public:
|
| + // PrefFilter remaining implementation.
|
| + virtual void FilterUpdate(const std::string& path) OVERRIDE {
|
| + ADD_FAILURE();
|
| + }
|
| + virtual void FilterSerializeData(
|
| + const base::DictionaryValue* pref_store_contents) OVERRIDE {
|
| + ADD_FAILURE();
|
| + }
|
| +
|
| + private:
|
| + // InterceptablePrefFilter implementation.
|
| + virtual void FinalizeFilterOnLoad(
|
| + const PostFilterOnLoadCallback& post_filter_on_load_callback,
|
| + scoped_ptr<base::DictionaryValue> pref_store_contents,
|
| + bool prefs_altered) OVERRIDE {
|
| + post_filter_on_load_callback.Run(pref_store_contents.Pass(), prefs_altered);
|
| + }
|
| +};
|
| +
|
| +// A test fixture designed to like this:
|
| +// 1) Set up initial store prefs with PresetStoreValue().
|
| +// 2) Hand both sets of prefs to the migrator via HandPrefsToMigrator().
|
| +// 3) Migration completes synchronously when the second store hands its prefs
|
| +// over.
|
| +// 4) Verifications can be made via various methods of this fixture.
|
| +// This fixture should not be re-used (i.e., only one migration should be
|
| +// performed per test).
|
| +class TrackedPreferencesMigrationTest : public testing::Test {
|
| + public:
|
| + enum MockPrefStoreID {
|
| + MOCK_UNPROTECTED_PREF_STORE,
|
| + MOCK_PROTECTED_PREF_STORE,
|
| + };
|
| +
|
| + TrackedPreferencesMigrationTest()
|
| + : unprotected_prefs_(new base::DictionaryValue),
|
| + protected_prefs_(new base::DictionaryValue),
|
| + migration_modified_unprotected_store_(false),
|
| + migration_modified_protected_store_(false),
|
| + unprotected_store_migration_complete_(false),
|
| + protected_store_migration_complete_(false) {}
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| + std::set<std::string> unprotected_pref_names;
|
| + std::set<std::string> protected_pref_names;
|
| + unprotected_pref_names.insert(kUnprotectedPref);
|
| + unprotected_pref_names.insert(kPreviouslyProtectedPref);
|
| + protected_pref_names.insert(kProtectedPref);
|
| + protected_pref_names.insert(kPreviouslyUnprotectedPref);
|
| +
|
| + SetupTrackedPreferencesMigration(
|
| + unprotected_pref_names,
|
| + protected_pref_names,
|
| + base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore,
|
| + base::Unretained(this), MOCK_UNPROTECTED_PREF_STORE),
|
| + base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore,
|
| + base::Unretained(this), MOCK_PROTECTED_PREF_STORE),
|
| + base::Bind(
|
| + &TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure,
|
| + base::Unretained(this), MOCK_UNPROTECTED_PREF_STORE),
|
| + base::Bind(
|
| + &TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure,
|
| + base::Unretained(this), MOCK_PROTECTED_PREF_STORE),
|
| + &mock_unprotected_pref_filter_,
|
| + &mock_protected_pref_filter_);
|
| +
|
| + // Verify initial expectations are met.
|
| + EXPECT_TRUE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_PROTECTED_PREF_STORE));
|
| +
|
| + std::vector<std::pair<std::string, std::string> > no_prefs_stored;
|
| + VerifyValuesStored(MOCK_UNPROTECTED_PREF_STORE, no_prefs_stored);
|
| + VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, no_prefs_stored);
|
| + }
|
| +
|
| + protected:
|
| + // Sets |key| to |value| in the test store identified by |store_id| before
|
| + // migration begins.
|
| + void PresetStoreValue(MockPrefStoreID store_id,
|
| + const std::string& key,
|
| + const std::string value) {
|
| + base::DictionaryValue* store = NULL;
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + store = unprotected_prefs_.get();
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + store = protected_prefs_.get();
|
| + break;
|
| + }
|
| + DCHECK(store);
|
| +
|
| + store->SetString(key, value);
|
| + }
|
| +
|
| + // Returns true if the store opposite to |store_id| is observed for its next
|
| + // successful write.
|
| + bool WasOnSuccessfulWriteCallbackRegistered(MockPrefStoreID store_id) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + return !protected_store_successful_write_callback_.is_null();
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + return !unprotected_store_successful_write_callback_.is_null();
|
| + }
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| +
|
| + // Verifies that the (key, value) pairs in |expected_prefs_in_store| are found
|
| + // in the store identified by |store_id|.
|
| + void VerifyValuesStored(
|
| + MockPrefStoreID store_id,
|
| + const std::vector<std::pair<std::string, std::string> >&
|
| + expected_prefs_in_store) {
|
| + base::DictionaryValue* store = NULL;
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + store = unprotected_prefs_.get();
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + store = protected_prefs_.get();
|
| + break;
|
| + }
|
| + DCHECK(store);
|
| +
|
| + for (std::vector<std::pair<std::string, std::string> >::const_iterator it =
|
| + expected_prefs_in_store.begin();
|
| + it != expected_prefs_in_store.end(); ++it) {
|
| + std::string val;
|
| + EXPECT_TRUE(store->GetString(it->first, &val));
|
| + EXPECT_EQ(it->second, val);
|
| + }
|
| + }
|
| +
|
| + // Both stores need to hand their prefs over in order for migration to kick
|
| + // in.
|
| + void HandPrefsToMigrator(MockPrefStoreID store_id) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + mock_unprotected_pref_filter_.FilterOnLoad(
|
| + base::Bind(&TrackedPreferencesMigrationTest::GetPrefsBack,
|
| + base::Unretained(this),
|
| + MOCK_UNPROTECTED_PREF_STORE),
|
| + unprotected_prefs_.Pass());
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + mock_protected_pref_filter_.FilterOnLoad(
|
| + base::Bind(&TrackedPreferencesMigrationTest::GetPrefsBack,
|
| + base::Unretained(this),
|
| + MOCK_PROTECTED_PREF_STORE),
|
| + protected_prefs_.Pass());
|
| + break;
|
| + }
|
| + }
|
| +
|
| + bool HasPrefs(MockPrefStoreID store_id) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + return unprotected_prefs_;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + return protected_prefs_;
|
| + }
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| +
|
| + bool StoreModifiedByMigration(MockPrefStoreID store_id) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + return migration_modified_unprotected_store_;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + return migration_modified_protected_store_;
|
| + }
|
| + NOTREACHED();
|
| + return false;
|
| + }
|
| +
|
| + bool MigrationCompleted() {
|
| + return unprotected_store_migration_complete_ &&
|
| + protected_store_migration_complete_;
|
| + }
|
| +
|
| + void SimulateSuccessfulWrite(MockPrefStoreID store_id) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + EXPECT_FALSE(unprotected_store_successful_write_callback_.is_null());
|
| + unprotected_store_successful_write_callback_.Run();
|
| + unprotected_store_successful_write_callback_.Reset();
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + EXPECT_FALSE(protected_store_successful_write_callback_.is_null());
|
| + protected_store_successful_write_callback_.Run();
|
| + protected_store_successful_write_callback_.Reset();
|
| + break;
|
| + }
|
| + }
|
| +
|
| + private:
|
| + void RegisterSuccessfulWriteClosure(
|
| + MockPrefStoreID store_id,
|
| + const base::Closure& successful_write_closure) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + EXPECT_TRUE(unprotected_store_successful_write_callback_.is_null());
|
| + unprotected_store_successful_write_callback_ = successful_write_closure;
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + EXPECT_TRUE(protected_store_successful_write_callback_.is_null());
|
| + protected_store_successful_write_callback_ = successful_write_closure;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // Helper given as an InterceptablePrefFilter::FinalizeFilterOnLoadCallback
|
| + // to the migrator to be invoked when it's done.
|
| + void GetPrefsBack(MockPrefStoreID store_id,
|
| + scoped_ptr<base::DictionaryValue> prefs,
|
| + bool prefs_altered) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + EXPECT_FALSE(unprotected_prefs_);
|
| + unprotected_prefs_ = prefs.Pass();
|
| + migration_modified_unprotected_store_ = prefs_altered;
|
| + unprotected_store_migration_complete_ = true;
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + EXPECT_FALSE(protected_prefs_);
|
| + protected_prefs_ = prefs.Pass();
|
| + migration_modified_protected_store_ = prefs_altered;
|
| + protected_store_migration_complete_ = true;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // Helper given as a cleaning callback to the migrator.
|
| + void RemovePathFromStore(MockPrefStoreID store_id, const std::string& key) {
|
| + switch (store_id) {
|
| + case MOCK_UNPROTECTED_PREF_STORE:
|
| + ASSERT_TRUE(unprotected_prefs_);
|
| + unprotected_prefs_->RemovePath(key, NULL);
|
| + break;
|
| + case MOCK_PROTECTED_PREF_STORE:
|
| + ASSERT_TRUE(protected_prefs_);
|
| + protected_prefs_->RemovePath(key, NULL);
|
| + break;
|
| + }
|
| + }
|
| +
|
| + scoped_ptr<base::DictionaryValue> unprotected_prefs_;
|
| + scoped_ptr<base::DictionaryValue> protected_prefs_;
|
| +
|
| + SimpleInterceptablePrefFilter mock_unprotected_pref_filter_;
|
| + SimpleInterceptablePrefFilter mock_protected_pref_filter_;
|
| +
|
| + base::Closure unprotected_store_successful_write_callback_;
|
| + base::Closure protected_store_successful_write_callback_;
|
| +
|
| + bool migration_modified_unprotected_store_;
|
| + bool migration_modified_protected_store_;
|
| +
|
| + bool unprotected_store_migration_complete_;
|
| + bool protected_store_migration_complete_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(TrackedPreferencesMigrationTest, NoMigrationRequired) {
|
| + PresetStoreValue(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref,
|
| + kUnprotectedPrefValue);
|
| + PresetStoreValue(MOCK_PROTECTED_PREF_STORE, kProtectedPref,
|
| + kProtectedPrefValue);
|
| +
|
| + // Hand unprotected prefs to the migrator which should wait for the protected
|
| + // prefs.
|
| + HandPrefsToMigrator(MOCK_UNPROTECTED_PREF_STORE);
|
| + EXPECT_FALSE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(MigrationCompleted());
|
| +
|
| + // Hand protected prefs to the migrator which should proceed with the
|
| + // migration synchronously.
|
| + HandPrefsToMigrator(MOCK_PROTECTED_PREF_STORE);
|
| + EXPECT_TRUE(MigrationCompleted());
|
| +
|
| + // Prefs should have been handed back over.
|
| + EXPECT_TRUE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(StoreModifiedByMigration(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(StoreModifiedByMigration(MOCK_PROTECTED_PREF_STORE));
|
| +
|
| + std::vector<std::pair<std::string, std::string> > expected_unprotected_values;
|
| + expected_unprotected_values.push_back(
|
| + std::make_pair(kUnprotectedPref, kUnprotectedPrefValue));
|
| + VerifyValuesStored(MOCK_UNPROTECTED_PREF_STORE, expected_unprotected_values);
|
| +
|
| + std::vector<std::pair<std::string, std::string> > expected_protected_values;
|
| + expected_protected_values.push_back(
|
| + std::make_pair(kProtectedPref, kProtectedPrefValue));
|
| + VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values);
|
| +}
|
| +
|
| +TEST_F(TrackedPreferencesMigrationTest, FullMigration) {
|
| + PresetStoreValue(
|
| + MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref, kUnprotectedPrefValue);
|
| + PresetStoreValue(MOCK_UNPROTECTED_PREF_STORE,
|
| + kPreviouslyUnprotectedPref,
|
| + kPreviouslyUnprotectedPrefValue);
|
| + PresetStoreValue(
|
| + MOCK_PROTECTED_PREF_STORE, kProtectedPref, kProtectedPrefValue);
|
| + PresetStoreValue(MOCK_PROTECTED_PREF_STORE,
|
| + kPreviouslyProtectedPref,
|
| + kPreviouslyProtectedPrefValue);
|
| +
|
| + HandPrefsToMigrator(MOCK_UNPROTECTED_PREF_STORE);
|
| + EXPECT_FALSE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(MigrationCompleted());
|
| +
|
| + HandPrefsToMigrator(MOCK_PROTECTED_PREF_STORE);
|
| + EXPECT_TRUE(MigrationCompleted());
|
| +
|
| + EXPECT_TRUE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(StoreModifiedByMigration(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(StoreModifiedByMigration(MOCK_PROTECTED_PREF_STORE));
|
| +
|
| + // Values should have been migrated to their store, but migrated values should
|
| + // still remain in the source store until cleanup tasks are later invoked.
|
| + {
|
| + std::vector<std::pair<std::string, std::string> >
|
| + expected_unprotected_values;
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kUnprotectedPref, kUnprotectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue));
|
| + VerifyValuesStored(MOCK_UNPROTECTED_PREF_STORE,
|
| + expected_unprotected_values);
|
| +
|
| + std::vector<std::pair<std::string, std::string> > expected_protected_values;
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kProtectedPref, kProtectedPrefValue));
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue));
|
| + VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values);
|
| + }
|
| +
|
| + // A successful write of the protected pref store should result in a clean up
|
| + // of the unprotected store.
|
| + SimulateSuccessfulWrite(MOCK_PROTECTED_PREF_STORE);
|
| +
|
| + {
|
| + std::vector<std::pair<std::string, std::string> >
|
| + expected_unprotected_values;
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kUnprotectedPref, kUnprotectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue));
|
| + VerifyValuesStored(MOCK_UNPROTECTED_PREF_STORE,
|
| + expected_unprotected_values);
|
| +
|
| + std::vector<std::pair<std::string, std::string> > expected_protected_values;
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kProtectedPref, kProtectedPrefValue));
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue));
|
| + VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values);
|
| + }
|
| +
|
| + SimulateSuccessfulWrite(MOCK_UNPROTECTED_PREF_STORE);
|
| +
|
| + {
|
| + std::vector<std::pair<std::string, std::string> >
|
| + expected_unprotected_values;
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kUnprotectedPref, kUnprotectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue));
|
| + VerifyValuesStored(MOCK_UNPROTECTED_PREF_STORE,
|
| + expected_unprotected_values);
|
| +
|
| + std::vector<std::pair<std::string, std::string> > expected_protected_values;
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kProtectedPref, kProtectedPrefValue));
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue));
|
| + VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values);
|
| + }
|
| +}
|
| +
|
| +TEST_F(TrackedPreferencesMigrationTest, CleanupOnly) {
|
| + // Already migrated; only cleanup needed.
|
| + PresetStoreValue(
|
| + MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref, kUnprotectedPrefValue);
|
| + PresetStoreValue(MOCK_UNPROTECTED_PREF_STORE,
|
| + kPreviouslyProtectedPref,
|
| + kPreviouslyProtectedPrefValue);
|
| + PresetStoreValue(MOCK_UNPROTECTED_PREF_STORE,
|
| + kPreviouslyUnprotectedPref,
|
| + kPreviouslyUnprotectedPrefValue);
|
| + PresetStoreValue(
|
| + MOCK_PROTECTED_PREF_STORE, kProtectedPref, kProtectedPrefValue);
|
| + PresetStoreValue(MOCK_PROTECTED_PREF_STORE,
|
| + kPreviouslyProtectedPref,
|
| + kPreviouslyProtectedPrefValue);
|
| + PresetStoreValue(MOCK_PROTECTED_PREF_STORE,
|
| + kPreviouslyUnprotectedPref,
|
| + kPreviouslyUnprotectedPrefValue);
|
| +
|
| + HandPrefsToMigrator(MOCK_UNPROTECTED_PREF_STORE);
|
| + EXPECT_FALSE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(MigrationCompleted());
|
| +
|
| + HandPrefsToMigrator(MOCK_PROTECTED_PREF_STORE);
|
| + EXPECT_TRUE(MigrationCompleted());
|
| +
|
| + EXPECT_TRUE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(
|
| + WasOnSuccessfulWriteCallbackRegistered(MOCK_PROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(StoreModifiedByMigration(MOCK_UNPROTECTED_PREF_STORE));
|
| + EXPECT_FALSE(StoreModifiedByMigration(MOCK_PROTECTED_PREF_STORE));
|
| +
|
| + // Cleanup should happen synchronously if the values were already present in
|
| + // their destination stores.
|
| + {
|
| + std::vector<std::pair<std::string, std::string> >
|
| + expected_unprotected_values;
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kUnprotectedPref, kUnprotectedPrefValue));
|
| + expected_unprotected_values.push_back(std::make_pair(
|
| + kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue));
|
| + VerifyValuesStored(MOCK_UNPROTECTED_PREF_STORE,
|
| + expected_unprotected_values);
|
| +
|
| + std::vector<std::pair<std::string, std::string> > expected_protected_values;
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kProtectedPref, kProtectedPrefValue));
|
| + expected_protected_values.push_back(std::make_pair(
|
| + kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue));
|
| + VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values);
|
| + }
|
| +}
|
|
|