Index: chrome/browser/prefs/profile_pref_store_manager_unittest.cc |
diff --git a/chrome/browser/prefs/profile_pref_store_manager_unittest.cc b/chrome/browser/prefs/profile_pref_store_manager_unittest.cc |
index 13f054f9e7fd79be471f736b2815dd5041e995eb..c478ac44834340166de6b10ac410695f54da1d5c 100644 |
--- a/chrome/browser/prefs/profile_pref_store_manager_unittest.cc |
+++ b/chrome/browser/prefs/profile_pref_store_manager_unittest.cc |
@@ -24,6 +24,7 @@ |
#include "base/values.h" |
#include "chrome/browser/prefs/mock_validation_delegate.h" |
#include "chrome/browser/prefs/pref_hash_filter.h" |
+#include "chrome/browser/prefs/tracked/pref_service_hash_store_contents.h" |
#include "chrome/common/pref_names.h" |
#include "components/pref_registry/pref_registry_syncable.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -151,6 +152,16 @@ class ProfilePrefStoreManagerTest : public testing::Test { |
return !ProfilePrefStoreManager::GetResetTime(pref_service.get()).is_null(); |
} |
+ void ClearResetRecorded() { |
+ base::PrefServiceFactory pref_service_factory; |
+ pref_service_factory.set_user_prefs(pref_store_); |
+ |
+ scoped_ptr<PrefService> pref_service( |
+ pref_service_factory.Create(profile_pref_registry_)); |
+ |
+ ProfilePrefStoreManager::ClearResetTime(pref_service.get()); |
+ } |
+ |
void InitializePrefs() { |
// According to the implementation of ProfilePrefStoreManager, this is |
// actually a SegregatedPrefStore backed by two underlying pref stores. |
@@ -165,6 +176,7 @@ class ProfilePrefStoreManagerTest : public testing::Test { |
void DestroyPrefStore() { |
if (pref_store_) { |
+ ClearResetRecorded(); |
// Force everything to be written to disk, triggering the PrefHashFilter |
// while our RegistryVerifier is watching. |
pref_store_->CommitPendingWrite(); |
@@ -307,11 +319,78 @@ TEST_F(ProfilePrefStoreManagerTest, ProtectValues) { |
TEST_F(ProfilePrefStoreManagerTest, MigrateFromOneFile) { |
InitializeDeprecatedCombinedProfilePrefStore(); |
+ // The deprecated model stores hashes in local state (on supported |
+ // platforms).. |
+ ASSERT_EQ( |
+ ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
+ local_state_.GetUserPrefValue( |
+ PrefServiceHashStoreContents::kProfilePreferenceHashes) != NULL); |
+ |
LoadExistingPrefs(); |
+ // After a first migration, the hashes were copied to the two user preference |
+ // files but were not cleaned. |
+ ASSERT_EQ( |
+ ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
+ local_state_.GetUserPrefValue( |
+ PrefServiceHashStoreContents::kProfilePreferenceHashes) != NULL); |
+ |
ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); |
EXPECT_FALSE(WasResetRecorded()); |
+ |
+ LoadExistingPrefs(); |
+ |
+ // In a subsequent launch, the local state hash store should be reset. |
+ ASSERT_FALSE(local_state_.GetUserPrefValue( |
+ PrefServiceHashStoreContents::kProfilePreferenceHashes)); |
+ |
+ ExpectStringValueEquals(kTrackedAtomic, kFoobar); |
+ ExpectStringValueEquals(kProtectedAtomic, kHelloWorld); |
+ EXPECT_FALSE(WasResetRecorded()); |
+} |
+ |
+TEST_F(ProfilePrefStoreManagerTest, MigrateWithTampering) { |
+ InitializeDeprecatedCombinedProfilePrefStore(); |
+ |
+ ReplaceStringInPrefs(kFoobar, kBarfoo); |
+ ReplaceStringInPrefs(kHelloWorld, kGoodbyeWorld); |
+ |
+ // The deprecated model stores hashes in local state (on supported |
+ // platforms).. |
+ ASSERT_EQ( |
+ ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
+ local_state_.GetUserPrefValue( |
+ PrefServiceHashStoreContents::kProfilePreferenceHashes) != NULL); |
+ |
+ LoadExistingPrefs(); |
+ |
+ // After a first migration, the hashes were copied to the two user preference |
+ // files but were not cleaned. |
+ ASSERT_EQ( |
+ ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
+ local_state_.GetUserPrefValue( |
+ PrefServiceHashStoreContents::kProfilePreferenceHashes) != NULL); |
+ |
+ // kTrackedAtomic is unprotected and thus will be loaded as it appears on |
+ // disk. |
+ ExpectStringValueEquals(kTrackedAtomic, kBarfoo); |
+ |
+ // If preference tracking is supported, the tampered value of kProtectedAtomic |
+ // will be discarded at load time, leaving this preference undefined. |
+ EXPECT_NE(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
+ pref_store_->GetValue(kProtectedAtomic, NULL)); |
+ EXPECT_EQ(ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking, |
+ WasResetRecorded()); |
+ |
+ LoadExistingPrefs(); |
+ |
+ // In a subsequent launch, the local state hash store would be reset. |
+ ASSERT_FALSE(local_state_.GetUserPrefValue( |
+ PrefServiceHashStoreContents::kProfilePreferenceHashes)); |
+ |
+ ExpectStringValueEquals(kTrackedAtomic, kBarfoo); |
+ EXPECT_FALSE(WasResetRecorded()); |
} |
TEST_F(ProfilePrefStoreManagerTest, InitializePrefsFromMasterPrefs) { |
@@ -375,6 +454,45 @@ TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtected) { |
WasResetRecorded()); |
} |
+TEST_F(ProfilePrefStoreManagerTest, NewPrefWhenFirstProtecting) { |
+ std::vector<PrefHashFilter::TrackedPreferenceMetadata> |
+ original_configuration = configuration_; |
+ for (std::vector<PrefHashFilter::TrackedPreferenceMetadata>::iterator it = |
+ configuration_.begin(); |
+ it != configuration_.end(); |
+ ++it) { |
+ it->enforcement_level = PrefHashFilter::NO_ENFORCEMENT; |
+ } |
+ ReloadConfiguration(); |
+ |
+ InitializePrefs(); |
+ |
+ ExpectValidationObserved(kTrackedAtomic); |
+ ExpectValidationObserved(kProtectedAtomic); |
+ |
+ LoadExistingPrefs(); |
+ ExpectStringValueEquals(kUnprotectedPref, kFoobar); |
+ |
+ // Ensure everything is written out to disk. |
+ DestroyPrefStore(); |
+ |
+ // Now introduce protection, including the never-before tracked "new_pref". |
+ configuration_ = original_configuration; |
+ PrefHashFilter::TrackedPreferenceMetadata new_protected = { |
+ kExtraReportingId, kUnprotectedPref, PrefHashFilter::ENFORCE_ON_LOAD, |
+ PrefHashFilter::TRACKING_STRATEGY_ATOMIC}; |
+ configuration_.push_back(new_protected); |
+ ReloadConfiguration(); |
+ |
+ // And try loading with the new configuration. |
+ LoadExistingPrefs(); |
+ |
+ // Since there was a valid super MAC we were able to extend the existing trust |
+ // to the newly tracked & protected preference. |
+ ExpectStringValueEquals(kUnprotectedPref, kFoobar); |
+ EXPECT_FALSE(WasResetRecorded()); |
+} |
+ |
TEST_F(ProfilePrefStoreManagerTest, UnprotectedToProtectedWithoutTrust) { |
InitializePrefs(); |