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 |
index 1c93a39fc0920e8cdfb6c93dc9538add9f755c5c..acbad50290a8c7dd47470f33559b46f54b06c9fc 100644 |
--- a/chrome/browser/prefs/tracked/tracked_preferences_migration_unittest.cc |
+++ b/chrome/browser/prefs/tracked/tracked_preferences_migration_unittest.cc |
@@ -11,8 +11,16 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/prefs/testing_pref_service.h" |
#include "base/values.h" |
#include "chrome/browser/prefs/interceptable_pref_filter.h" |
+#include "chrome/browser/prefs/pref_hash_store.h" |
+#include "chrome/browser/prefs/pref_hash_store_impl.h" |
+#include "chrome/browser/prefs/pref_hash_store_transaction.h" |
+#include "chrome/browser/prefs/profile_pref_store_manager.h" |
+#include "chrome/browser/prefs/tracked/dictionary_hash_store_contents.h" |
+#include "chrome/browser/prefs/tracked/hash_store_contents.h" |
+#include "chrome/browser/prefs/tracked/pref_service_hash_store_contents.h" |
#include "chrome/browser/prefs/tracked/tracked_preferences_migration.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -41,7 +49,7 @@ class SimpleInterceptablePrefFilter : public InterceptablePrefFilter { |
ADD_FAILURE(); |
} |
virtual void FilterSerializeData( |
- const base::DictionaryValue* pref_store_contents) OVERRIDE { |
+ base::DictionaryValue* pref_store_contents) OVERRIDE { |
ADD_FAILURE(); |
} |
@@ -55,14 +63,13 @@ class SimpleInterceptablePrefFilter : public InterceptablePrefFilter { |
} |
}; |
-// A test fixture designed to like this: |
+// A test fixture designed to be used 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). |
+// Call Reset() to perform a second migration. |
class TrackedPreferencesMigrationTest : public testing::Test { |
public: |
enum MockPrefStoreID { |
@@ -79,6 +86,11 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
protected_store_migration_complete_(false) {} |
virtual void SetUp() OVERRIDE { |
+ ProfilePrefStoreManager::RegisterPrefs(local_state_.registry()); |
+ Reset(); |
+ } |
+ |
+ void Reset() { |
std::set<std::string> unprotected_pref_names; |
std::set<std::string> protected_pref_names; |
unprotected_pref_names.insert(kUnprotectedPref); |
@@ -86,19 +98,38 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
protected_pref_names.insert(kProtectedPref); |
protected_pref_names.insert(kPreviouslyUnprotectedPref); |
+ migration_modified_unprotected_store_ = false; |
+ migration_modified_protected_store_ = false; |
+ unprotected_store_migration_complete_ = false; |
+ protected_store_migration_complete_ = false; |
+ |
+ unprotected_store_successful_write_callback_.Reset(); |
+ protected_store_successful_write_callback_.Reset(); |
+ |
SetupTrackedPreferencesMigration( |
unprotected_pref_names, |
protected_pref_names, |
base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore, |
- base::Unretained(this), MOCK_UNPROTECTED_PREF_STORE), |
+ base::Unretained(this), |
+ MOCK_UNPROTECTED_PREF_STORE), |
base::Bind(&TrackedPreferencesMigrationTest::RemovePathFromStore, |
- base::Unretained(this), MOCK_PROTECTED_PREF_STORE), |
+ base::Unretained(this), |
+ MOCK_PROTECTED_PREF_STORE), |
base::Bind( |
&TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure, |
- base::Unretained(this), MOCK_UNPROTECTED_PREF_STORE), |
+ base::Unretained(this), |
+ MOCK_UNPROTECTED_PREF_STORE), |
base::Bind( |
&TrackedPreferencesMigrationTest::RegisterSuccessfulWriteClosure, |
- base::Unretained(this), MOCK_PROTECTED_PREF_STORE), |
+ base::Unretained(this), |
+ MOCK_PROTECTED_PREF_STORE), |
+ scoped_ptr<PrefHashStore>( |
+ new PrefHashStoreImpl(kSeed, kDeviceId, false)), |
+ scoped_ptr<PrefHashStore>( |
+ new PrefHashStoreImpl(kSeed, kDeviceId, true)), |
+ scoped_ptr<HashStoreContents>( |
+ new PrefServiceHashStoreContents("hash-store-id", &local_state_)), |
+ |
&mock_unprotected_pref_filter_, |
&mock_protected_pref_filter_); |
@@ -109,10 +140,6 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
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: |
@@ -122,17 +149,25 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
const std::string& key, |
const std::string value) { |
base::DictionaryValue* store = NULL; |
+ scoped_ptr<PrefHashStore> pref_hash_store; |
switch (store_id) { |
case MOCK_UNPROTECTED_PREF_STORE: |
store = unprotected_prefs_.get(); |
+ pref_hash_store.reset(new PrefHashStoreImpl(kSeed, kDeviceId, false)); |
break; |
case MOCK_PROTECTED_PREF_STORE: |
store = protected_prefs_.get(); |
+ pref_hash_store.reset(new PrefHashStoreImpl(kSeed, kDeviceId, true)); |
break; |
} |
DCHECK(store); |
store->SetString(key, value); |
+ base::StringValue string_value(value); |
+ pref_hash_store->BeginTransaction( |
+ scoped_ptr<HashStoreContents>( |
+ new DictionaryHashStoreContents(store)))->StoreHash( |
+ key, &string_value); |
} |
// Returns true if the store opposite to |store_id| is observed for its next |
@@ -174,6 +209,24 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
} |
} |
+ // Determines whether |expected_pref_in_hash_store| has a hash in the hash |
+ // store identified by |store_id|. |
+ bool ContainsHash(MockPrefStoreID store_id, |
+ std::string expected_pref_in_hash_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); |
+ return DictionaryHashStoreContents(store).GetContents()->GetString( |
+ expected_pref_in_hash_store, static_cast<std::string*>(NULL)); |
+ } |
+ |
// Both stores need to hand their prefs over in order for migration to kick |
// in. |
void HandPrefsToMigrator(MockPrefStoreID store_id) { |
@@ -288,6 +341,9 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
} |
} |
+ static const char kSeed[]; |
+ static const char kDeviceId[]; |
+ |
scoped_ptr<base::DictionaryValue> unprotected_prefs_; |
scoped_ptr<base::DictionaryValue> protected_prefs_; |
@@ -302,8 +358,16 @@ class TrackedPreferencesMigrationTest : public testing::Test { |
bool unprotected_store_migration_complete_; |
bool protected_store_migration_complete_; |
+ |
+ TestingPrefServiceSimple local_state_; |
}; |
+// static |
+const char TrackedPreferencesMigrationTest::kSeed[] = "seed"; |
+ |
+// static |
+const char TrackedPreferencesMigrationTest::kDeviceId[] = "device-id"; |
+ |
} // namespace |
TEST_F(TrackedPreferencesMigrationTest, NoMigrationRequired) { |
@@ -312,6 +376,12 @@ TEST_F(TrackedPreferencesMigrationTest, NoMigrationRequired) { |
PresetStoreValue(MOCK_PROTECTED_PREF_STORE, kProtectedPref, |
kProtectedPrefValue); |
+ EXPECT_TRUE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kProtectedPref)); |
+ |
+ EXPECT_TRUE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kUnprotectedPref)); |
+ |
// Hand unprotected prefs to the migrator which should wait for the protected |
// prefs. |
HandPrefsToMigrator(MOCK_UNPROTECTED_PREF_STORE); |
@@ -343,6 +413,12 @@ TEST_F(TrackedPreferencesMigrationTest, NoMigrationRequired) { |
expected_protected_values.push_back( |
std::make_pair(kProtectedPref, kProtectedPrefValue)); |
VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values); |
+ |
+ EXPECT_TRUE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kProtectedPref)); |
+ |
+ EXPECT_TRUE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kUnprotectedPref)); |
} |
TEST_F(TrackedPreferencesMigrationTest, FullMigration) { |
@@ -357,6 +433,20 @@ TEST_F(TrackedPreferencesMigrationTest, FullMigration) { |
kPreviouslyProtectedPref, |
kPreviouslyProtectedPrefValue); |
+ EXPECT_TRUE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_FALSE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
+ |
+ EXPECT_FALSE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_FALSE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_TRUE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
+ |
HandPrefsToMigrator(MOCK_UNPROTECTED_PREF_STORE); |
EXPECT_FALSE(HasPrefs(MOCK_UNPROTECTED_PREF_STORE)); |
EXPECT_TRUE(HasPrefs(MOCK_PROTECTED_PREF_STORE)); |
@@ -396,6 +486,20 @@ TEST_F(TrackedPreferencesMigrationTest, FullMigration) { |
expected_unprotected_values.push_back(std::make_pair( |
kPreviouslyProtectedPref, kPreviouslyProtectedPrefValue)); |
VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values); |
+ |
+ EXPECT_TRUE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
+ |
+ EXPECT_FALSE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_TRUE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
} |
// A successful write of the protected pref store should result in a clean up |
@@ -441,6 +545,42 @@ TEST_F(TrackedPreferencesMigrationTest, FullMigration) { |
kPreviouslyUnprotectedPref, kPreviouslyUnprotectedPrefValue)); |
VerifyValuesStored(MOCK_PROTECTED_PREF_STORE, expected_protected_values); |
} |
+ |
+ // Hashes are not cleaned up yet. |
+ EXPECT_TRUE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
+ |
+ EXPECT_FALSE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_TRUE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
+ |
+ Reset(); |
+ |
+ HandPrefsToMigrator(MOCK_UNPROTECTED_PREF_STORE); |
+ HandPrefsToMigrator(MOCK_PROTECTED_PREF_STORE); |
+ EXPECT_TRUE(MigrationCompleted()); |
+ |
+ // Hashes are cleaned up. |
+ EXPECT_TRUE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_FALSE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_FALSE(ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_UNPROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
+ |
+ EXPECT_FALSE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kUnprotectedPref)); |
+ EXPECT_TRUE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyUnprotectedPref)); |
+ EXPECT_TRUE(ContainsHash(MOCK_PROTECTED_PREF_STORE, kProtectedPref)); |
+ EXPECT_FALSE( |
+ ContainsHash(MOCK_PROTECTED_PREF_STORE, kPreviouslyProtectedPref)); |
} |
TEST_F(TrackedPreferencesMigrationTest, CleanupOnly) { |