| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/user_prefs/tracked/pref_hash_filter.h" | 5 #include "components/user_prefs/tracked/pref_hash_filter.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); | 795 ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
| 796 | 796 |
| 797 // No transaction should even be started on FilterSerializeData() if there are | 797 // No transaction should even be started on FilterSerializeData() if there are |
| 798 // no updates to perform. | 798 // no updates to perform. |
| 799 ASSERT_EQ(0u, mock_pref_hash_store_->transactions_performed()); | 799 ASSERT_EQ(0u, mock_pref_hash_store_->transactions_performed()); |
| 800 } | 800 } |
| 801 | 801 |
| 802 TEST_P(PrefHashFilterTest, MultiplePrefsFilterSerializeData) { | 802 TEST_P(PrefHashFilterTest, MultiplePrefsFilterSerializeData) { |
| 803 base::DictionaryValue root_dict; | 803 base::DictionaryValue root_dict; |
| 804 // Ownership of the following values is transfered to |root_dict|. | 804 // Ownership of the following values is transfered to |root_dict|. |
| 805 base::Value* int_value1 = new base::FundamentalValue(1); | 805 base::Value* int_value1 = new base::Value(1); |
| 806 base::Value* int_value2 = new base::FundamentalValue(2); | 806 base::Value* int_value2 = new base::Value(2); |
| 807 base::Value* int_value3 = new base::FundamentalValue(3); | 807 base::Value* int_value3 = new base::Value(3); |
| 808 base::Value* int_value4 = new base::FundamentalValue(4); | 808 base::Value* int_value4 = new base::Value(4); |
| 809 base::DictionaryValue* dict_value = new base::DictionaryValue; | 809 base::DictionaryValue* dict_value = new base::DictionaryValue; |
| 810 dict_value->Set("a", new base::FundamentalValue(true)); | 810 dict_value->Set("a", new base::Value(true)); |
| 811 root_dict.Set(kAtomicPref, int_value1); | 811 root_dict.Set(kAtomicPref, int_value1); |
| 812 root_dict.Set(kAtomicPref2, int_value2); | 812 root_dict.Set(kAtomicPref2, int_value2); |
| 813 root_dict.Set(kAtomicPref3, int_value3); | 813 root_dict.Set(kAtomicPref3, int_value3); |
| 814 root_dict.Set("untracked", int_value4); | 814 root_dict.Set("untracked", int_value4); |
| 815 root_dict.Set(kSplitPref, dict_value); | 815 root_dict.Set(kSplitPref, dict_value); |
| 816 | 816 |
| 817 // Only update kAtomicPref, kAtomicPref3, and kSplitPref. | 817 // Only update kAtomicPref, kAtomicPref3, and kSplitPref. |
| 818 pref_hash_filter_->FilterUpdate(kAtomicPref); | 818 pref_hash_filter_->FilterUpdate(kAtomicPref); |
| 819 pref_hash_filter_->FilterUpdate(kAtomicPref3); | 819 pref_hash_filter_->FilterUpdate(kAtomicPref3); |
| 820 pref_hash_filter_->FilterUpdate(kSplitPref); | 820 pref_hash_filter_->FilterUpdate(kSplitPref); |
| 821 ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); | 821 ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
| 822 | 822 |
| 823 // Update kAtomicPref3 again, nothing should be stored still. | 823 // Update kAtomicPref3 again, nothing should be stored still. |
| 824 base::Value* int_value5 = new base::FundamentalValue(5); | 824 base::Value* int_value5 = new base::Value(5); |
| 825 root_dict.Set(kAtomicPref3, int_value5); | 825 root_dict.Set(kAtomicPref3, int_value5); |
| 826 ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); | 826 ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
| 827 | 827 |
| 828 // On FilterSerializeData, only kAtomicPref, kAtomicPref3, and kSplitPref | 828 // On FilterSerializeData, only kAtomicPref, kAtomicPref3, and kSplitPref |
| 829 // should get a new hash. | 829 // should get a new hash. |
| 830 pref_hash_filter_->FilterSerializeData(&root_dict); | 830 pref_hash_filter_->FilterSerializeData(&root_dict); |
| 831 ASSERT_EQ(3u, mock_pref_hash_store_->stored_paths_count()); | 831 ASSERT_EQ(3u, mock_pref_hash_store_->stored_paths_count()); |
| 832 MockPrefHashStore::ValuePtrStrategyPair stored_value_atomic1 = | 832 MockPrefHashStore::ValuePtrStrategyPair stored_value_atomic1 = |
| 833 mock_pref_hash_store_->stored_value(kAtomicPref); | 833 mock_pref_hash_store_->stored_value(kAtomicPref); |
| 834 ASSERT_EQ(int_value1, stored_value_atomic1.first); | 834 ASSERT_EQ(int_value1, stored_value_atomic1.first); |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); | 1007 ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
| 1008 ASSERT_EQ(dict_value, split_value_in_store); | 1008 ASSERT_EQ(dict_value, split_value_in_store); |
| 1009 MockPrefHashStore::ValuePtrStrategyPair stored_split_value = | 1009 MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
| 1010 mock_pref_hash_store_->stored_value(kSplitPref); | 1010 mock_pref_hash_store_->stored_value(kSplitPref); |
| 1011 ASSERT_EQ(dict_value, stored_split_value.first); | 1011 ASSERT_EQ(dict_value, stored_split_value.first); |
| 1012 ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, stored_split_value.second); | 1012 ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, stored_split_value.second); |
| 1013 } | 1013 } |
| 1014 | 1014 |
| 1015 TEST_P(PrefHashFilterTest, InitialValueChanged) { | 1015 TEST_P(PrefHashFilterTest, InitialValueChanged) { |
| 1016 // Ownership of this value is transfered to |pref_store_contents_|. | 1016 // Ownership of this value is transfered to |pref_store_contents_|. |
| 1017 base::Value* int_value = new base::FundamentalValue(1234); | 1017 base::Value* int_value = new base::Value(1234); |
| 1018 pref_store_contents_->Set(kAtomicPref, int_value); | 1018 pref_store_contents_->Set(kAtomicPref, int_value); |
| 1019 | 1019 |
| 1020 base::DictionaryValue* dict_value = new base::DictionaryValue; | 1020 base::DictionaryValue* dict_value = new base::DictionaryValue; |
| 1021 dict_value->SetString("a", "foo"); | 1021 dict_value->SetString("a", "foo"); |
| 1022 dict_value->SetInteger("b", 1234); | 1022 dict_value->SetInteger("b", 1234); |
| 1023 dict_value->SetInteger("c", 56); | 1023 dict_value->SetInteger("c", 56); |
| 1024 dict_value->SetBoolean("d", false); | 1024 dict_value->SetBoolean("d", false); |
| 1025 pref_store_contents_->Set(kSplitPref, dict_value); | 1025 pref_store_contents_->Set(kSplitPref, dict_value); |
| 1026 | 1026 |
| 1027 ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); | 1027 ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 const base::Value* split_value_in_store; | 1180 const base::Value* split_value_in_store; |
| 1181 ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); | 1181 ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
| 1182 ASSERT_EQ(dict_value, split_value_in_store); | 1182 ASSERT_EQ(dict_value, split_value_in_store); |
| 1183 ASSERT_EQ(dict_value, stored_split_value.first); | 1183 ASSERT_EQ(dict_value, stored_split_value.first); |
| 1184 | 1184 |
| 1185 VerifyRecordedReset(false); | 1185 VerifyRecordedReset(false); |
| 1186 } | 1186 } |
| 1187 | 1187 |
| 1188 TEST_P(PrefHashFilterTest, DontResetReportOnly) { | 1188 TEST_P(PrefHashFilterTest, DontResetReportOnly) { |
| 1189 // Ownership of these values is transfered to |pref_store_contents_|. | 1189 // Ownership of these values is transfered to |pref_store_contents_|. |
| 1190 base::Value* int_value1 = new base::FundamentalValue(1); | 1190 base::Value* int_value1 = new base::Value(1); |
| 1191 base::Value* int_value2 = new base::FundamentalValue(2); | 1191 base::Value* int_value2 = new base::Value(2); |
| 1192 base::Value* report_only_val = new base::FundamentalValue(3); | 1192 base::Value* report_only_val = new base::Value(3); |
| 1193 base::DictionaryValue* report_only_split_val = new base::DictionaryValue; | 1193 base::DictionaryValue* report_only_split_val = new base::DictionaryValue; |
| 1194 report_only_split_val->SetInteger("a", 1234); | 1194 report_only_split_val->SetInteger("a", 1234); |
| 1195 pref_store_contents_->Set(kAtomicPref, int_value1); | 1195 pref_store_contents_->Set(kAtomicPref, int_value1); |
| 1196 pref_store_contents_->Set(kAtomicPref2, int_value2); | 1196 pref_store_contents_->Set(kAtomicPref2, int_value2); |
| 1197 pref_store_contents_->Set(kReportOnlyPref, report_only_val); | 1197 pref_store_contents_->Set(kReportOnlyPref, report_only_val); |
| 1198 pref_store_contents_->Set(kReportOnlySplitPref, report_only_split_val); | 1198 pref_store_contents_->Set(kReportOnlySplitPref, report_only_split_val); |
| 1199 | 1199 |
| 1200 ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); | 1200 ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
| 1201 ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref2, NULL)); | 1201 ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref2, NULL)); |
| 1202 ASSERT_TRUE(pref_store_contents_->Get(kReportOnlyPref, NULL)); | 1202 ASSERT_TRUE(pref_store_contents_->Get(kReportOnlyPref, NULL)); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 ASSERT_EQ(int_value2, | 1257 ASSERT_EQ(int_value2, |
| 1258 mock_pref_hash_store_->stored_value(kAtomicPref2).first); | 1258 mock_pref_hash_store_->stored_value(kAtomicPref2).first); |
| 1259 | 1259 |
| 1260 VerifyRecordedReset(false); | 1260 VerifyRecordedReset(false); |
| 1261 } | 1261 } |
| 1262 } | 1262 } |
| 1263 | 1263 |
| 1264 TEST_P(PrefHashFilterTest, CallFilterSerializeDataCallbacks) { | 1264 TEST_P(PrefHashFilterTest, CallFilterSerializeDataCallbacks) { |
| 1265 base::DictionaryValue root_dict; | 1265 base::DictionaryValue root_dict; |
| 1266 // Ownership of the following values is transfered to |root_dict|. | 1266 // Ownership of the following values is transfered to |root_dict|. |
| 1267 base::Value* int_value1 = new base::FundamentalValue(1); | 1267 base::Value* int_value1 = new base::Value(1); |
| 1268 base::Value* int_value2 = new base::FundamentalValue(2); | 1268 base::Value* int_value2 = new base::Value(2); |
| 1269 base::DictionaryValue* dict_value = new base::DictionaryValue; | 1269 base::DictionaryValue* dict_value = new base::DictionaryValue; |
| 1270 dict_value->Set("a", new base::FundamentalValue(true)); | 1270 dict_value->Set("a", new base::Value(true)); |
| 1271 root_dict.Set(kAtomicPref, int_value1); | 1271 root_dict.Set(kAtomicPref, int_value1); |
| 1272 root_dict.Set(kAtomicPref2, int_value2); | 1272 root_dict.Set(kAtomicPref2, int_value2); |
| 1273 root_dict.Set(kSplitPref, dict_value); | 1273 root_dict.Set(kSplitPref, dict_value); |
| 1274 | 1274 |
| 1275 // Skip updating kAtomicPref2. | 1275 // Skip updating kAtomicPref2. |
| 1276 pref_hash_filter_->FilterUpdate(kAtomicPref); | 1276 pref_hash_filter_->FilterUpdate(kAtomicPref); |
| 1277 pref_hash_filter_->FilterUpdate(kSplitPref); | 1277 pref_hash_filter_->FilterUpdate(kSplitPref); |
| 1278 | 1278 |
| 1279 PrefHashFilter::OnWriteCallbackPair callbacks = | 1279 PrefHashFilter::OnWriteCallbackPair callbacks = |
| 1280 pref_hash_filter_->FilterSerializeData(&root_dict); | 1280 pref_hash_filter_->FilterSerializeData(&root_dict); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1306 | 1306 |
| 1307 // The callbacks should write directly to the contents without going through | 1307 // The callbacks should write directly to the contents without going through |
| 1308 // a pref hash store. | 1308 // a pref hash store. |
| 1309 ASSERT_EQ(0u, | 1309 ASSERT_EQ(0u, |
| 1310 mock_external_validation_pref_hash_store_->stored_paths_count()); | 1310 mock_external_validation_pref_hash_store_->stored_paths_count()); |
| 1311 } | 1311 } |
| 1312 | 1312 |
| 1313 TEST_P(PrefHashFilterTest, CallFilterSerializeDataCallbacksWithFailure) { | 1313 TEST_P(PrefHashFilterTest, CallFilterSerializeDataCallbacksWithFailure) { |
| 1314 base::DictionaryValue root_dict; | 1314 base::DictionaryValue root_dict; |
| 1315 // Ownership of the following values is transfered to |root_dict|. | 1315 // Ownership of the following values is transfered to |root_dict|. |
| 1316 base::Value* int_value1 = new base::FundamentalValue(1); | 1316 base::Value* int_value1 = new base::Value(1); |
| 1317 root_dict.Set(kAtomicPref, int_value1); | 1317 root_dict.Set(kAtomicPref, int_value1); |
| 1318 | 1318 |
| 1319 // Only update kAtomicPref. | 1319 // Only update kAtomicPref. |
| 1320 pref_hash_filter_->FilterUpdate(kAtomicPref); | 1320 pref_hash_filter_->FilterUpdate(kAtomicPref); |
| 1321 | 1321 |
| 1322 PrefHashFilter::OnWriteCallbackPair callbacks = | 1322 PrefHashFilter::OnWriteCallbackPair callbacks = |
| 1323 pref_hash_filter_->FilterSerializeData(&root_dict); | 1323 pref_hash_filter_->FilterSerializeData(&root_dict); |
| 1324 | 1324 |
| 1325 ASSERT_FALSE(callbacks.first.is_null()); | 1325 ASSERT_FALSE(callbacks.first.is_null()); |
| 1326 | 1326 |
| 1327 callbacks.first.Run(); | 1327 callbacks.first.Run(); |
| 1328 | 1328 |
| 1329 // The pref should have been cleared from the external validation store. | 1329 // The pref should have been cleared from the external validation store. |
| 1330 ASSERT_EQ( | 1330 ASSERT_EQ( |
| 1331 1u, mock_external_validation_hash_store_contents_->cleared_paths_count()); | 1331 1u, mock_external_validation_hash_store_contents_->cleared_paths_count()); |
| 1332 | 1332 |
| 1333 callbacks.second.Run(false); | 1333 callbacks.second.Run(false); |
| 1334 | 1334 |
| 1335 // Expect no writes to the external validation hash store contents. | 1335 // Expect no writes to the external validation hash store contents. |
| 1336 ASSERT_EQ(0u, | 1336 ASSERT_EQ(0u, |
| 1337 mock_external_validation_pref_hash_store_->stored_paths_count()); | 1337 mock_external_validation_pref_hash_store_->stored_paths_count()); |
| 1338 ASSERT_EQ( | 1338 ASSERT_EQ( |
| 1339 0u, mock_external_validation_hash_store_contents_->stored_hashes_count()); | 1339 0u, mock_external_validation_hash_store_contents_->stored_hashes_count()); |
| 1340 } | 1340 } |
| 1341 | 1341 |
| 1342 TEST_P(PrefHashFilterTest, ExternalValidationValueChanged) { | 1342 TEST_P(PrefHashFilterTest, ExternalValidationValueChanged) { |
| 1343 // Ownership of this value is transfered to |pref_store_contents_|. | 1343 // Ownership of this value is transfered to |pref_store_contents_|. |
| 1344 base::Value* int_value = new base::FundamentalValue(1234); | 1344 base::Value* int_value = new base::Value(1234); |
| 1345 pref_store_contents_->Set(kAtomicPref, int_value); | 1345 pref_store_contents_->Set(kAtomicPref, int_value); |
| 1346 | 1346 |
| 1347 base::DictionaryValue* dict_value = new base::DictionaryValue; | 1347 base::DictionaryValue* dict_value = new base::DictionaryValue; |
| 1348 dict_value->SetString("a", "foo"); | 1348 dict_value->SetString("a", "foo"); |
| 1349 dict_value->SetInteger("b", 1234); | 1349 dict_value->SetInteger("b", 1234); |
| 1350 dict_value->SetInteger("c", 56); | 1350 dict_value->SetInteger("c", 56); |
| 1351 dict_value->SetBoolean("d", false); | 1351 dict_value->SetBoolean("d", false); |
| 1352 pref_store_contents_->Set(kSplitPref, dict_value); | 1352 pref_store_contents_->Set(kSplitPref, dict_value); |
| 1353 | 1353 |
| 1354 mock_external_validation_pref_hash_store_->SetCheckResult( | 1354 mock_external_validation_pref_hash_store_->SetCheckResult( |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1384 PrefHashStoreTransaction::CHANGED)); | 1384 PrefHashStoreTransaction::CHANGED)); |
| 1385 ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, | 1385 ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, |
| 1386 mock_validation_delegate_.CountExternalValidationsOfState( | 1386 mock_validation_delegate_.CountExternalValidationsOfState( |
| 1387 PrefHashStoreTransaction::UNCHANGED)); | 1387 PrefHashStoreTransaction::UNCHANGED)); |
| 1388 } | 1388 } |
| 1389 | 1389 |
| 1390 INSTANTIATE_TEST_CASE_P(PrefHashFilterTestInstance, | 1390 INSTANTIATE_TEST_CASE_P(PrefHashFilterTestInstance, |
| 1391 PrefHashFilterTest, | 1391 PrefHashFilterTest, |
| 1392 testing::Values(PrefHashFilter::NO_ENFORCEMENT, | 1392 testing::Values(PrefHashFilter::NO_ENFORCEMENT, |
| 1393 PrefHashFilter::ENFORCE_ON_LOAD)); | 1393 PrefHashFilter::ENFORCE_ON_LOAD)); |
| OLD | NEW |