Index: chrome/browser/prefs/pref_hash_store_impl_unittest.cc |
diff --git a/chrome/browser/prefs/pref_hash_store_impl_unittest.cc b/chrome/browser/prefs/pref_hash_store_impl_unittest.cc |
index c6e3aee5366ba8fb412b269798973d92acd644ce..823269157756d7dabdca46d6446d873678e7a314 100644 |
--- a/chrome/browser/prefs/pref_hash_store_impl_unittest.cc |
+++ b/chrome/browser/prefs/pref_hash_store_impl_unittest.cc |
@@ -25,16 +25,20 @@ TEST(PrefHashStoreImplTest, TestCase) { |
PrefHashStoreImpl pref_hash_store( |
"store_id", std::string(32,0), "device_id", &local_state); |
- ASSERT_EQ(PrefHashStore::UNKNOWN_VALUE, |
+ // Only NULL should be trusted in the absence of a hash. |
+ EXPECT_EQ(PrefHashStore::UNTRUSTED_UNKNOWN_VALUE, |
pref_hash_store.CheckValue("path1", &string_1)); |
+ EXPECT_EQ(PrefHashStore::TRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store.CheckValue("path1", NULL)); |
+ |
pref_hash_store.StoreHash("path1", &string_1); |
- ASSERT_EQ(PrefHashStore::UNCHANGED, |
+ EXPECT_EQ(PrefHashStore::UNCHANGED, |
pref_hash_store.CheckValue("path1", &string_1)); |
- ASSERT_EQ(PrefHashStore::CLEARED, pref_hash_store.CheckValue("path1", NULL)); |
+ EXPECT_EQ(PrefHashStore::CLEARED, pref_hash_store.CheckValue("path1", NULL)); |
pref_hash_store.StoreHash("path1", NULL); |
- ASSERT_EQ(PrefHashStore::UNCHANGED, |
+ EXPECT_EQ(PrefHashStore::UNCHANGED, |
pref_hash_store.CheckValue("path1", NULL)); |
- ASSERT_EQ(PrefHashStore::CHANGED, |
+ EXPECT_EQ(PrefHashStore::CHANGED, |
pref_hash_store.CheckValue("path1", &string_2)); |
base::DictionaryValue dict; |
@@ -43,17 +47,51 @@ TEST(PrefHashStoreImplTest, TestCase) { |
dict.Set("b", new base::StringValue("bar")); |
dict.Set("c", new base::StringValue("baz")); |
- // Manually shove in a legacy hash. |
- DictionaryPrefUpdate update(&local_state, prefs::kProfilePreferenceHashes); |
- base::DictionaryValue* child_dictionary = NULL; |
- ASSERT_TRUE(update->GetDictionary("store_id", &child_dictionary)); |
- child_dictionary->SetString( |
- "path1", |
- "C503FB7C65EEFD5C07185F616A0AA67923C069909933F362022B1F187E73E9A2"); |
- |
- ASSERT_EQ(PrefHashStore::MIGRATED, |
+ { |
+ // Manually shove in a legacy hash. |
+ DictionaryPrefUpdate update(&local_state, prefs::kProfilePreferenceHashes); |
+ base::DictionaryValue* child_dictionary = NULL; |
+ ASSERT_TRUE(update->GetDictionary("store_id", &child_dictionary)); |
+ child_dictionary->SetString( |
+ "path1", |
+ "C503FB7C65EEFD5C07185F616A0AA67923C069909933F362022B1F187E73E9A2"); |
+ } |
+ EXPECT_EQ(PrefHashStore::MIGRATED, |
pref_hash_store.CheckValue("path1", &dict)); |
pref_hash_store.StoreHash("path1", &dict); |
- ASSERT_EQ(PrefHashStore::UNCHANGED, |
+ EXPECT_EQ(PrefHashStore::UNCHANGED, |
pref_hash_store.CheckValue("path1", &dict)); |
+ |
+ // |pref_hash_store2| should trust its initial hashes dictionary and thus |
+ // trust new unknown values. |
+ PrefHashStoreImpl pref_hash_store2( |
+ "store_id", std::string(32, 0), "device_id", &local_state); |
+ EXPECT_EQ(PrefHashStore::TRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store2.CheckValue("new_path", &string_1)); |
+ EXPECT_EQ(PrefHashStore::TRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store2.CheckValue("new_path", &string_2)); |
+ EXPECT_EQ(PrefHashStore::TRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store2.CheckValue("new_path", NULL)); |
+ |
+ { |
+ // Manually corrupt the hash of hashes for "store_id". |
+ DictionaryPrefUpdate update(&local_state, prefs::kProfilePreferenceHashes); |
+ base::DictionaryValue* hash_of_hashes_dict = NULL; |
+ ASSERT_TRUE(update->GetDictionaryWithoutPathExpansion( |
+ internals::kHashOfHashesPref, &hash_of_hashes_dict)); |
+ hash_of_hashes_dict->SetString("store_id", std::string(64, 'A')); |
+ // This shouldn't have increased the number of existing hash of hashes. |
+ ASSERT_EQ(1U, hash_of_hashes_dict->size()); |
+ } |
+ |
+ // |pref_hash_store3| should no longer trust its initial hashes dictionary and |
+ // thus shouldn't trust non-NULL unknown values. |
+ PrefHashStoreImpl pref_hash_store3( |
+ "store_id", std::string(32, 0), "device_id", &local_state); |
+ EXPECT_EQ(PrefHashStore::UNTRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store3.CheckValue("new_path", &string_1)); |
+ EXPECT_EQ(PrefHashStore::UNTRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store3.CheckValue("new_path", &string_2)); |
+ EXPECT_EQ(PrefHashStore::TRUSTED_UNKNOWN_VALUE, |
+ pref_hash_store3.CheckValue("new_path", NULL)); |
} |