Index: chrome/browser/prefs/tracked/pref_hash_filter_unittest.cc |
diff --git a/chrome/browser/prefs/tracked/pref_hash_filter_unittest.cc b/chrome/browser/prefs/tracked/pref_hash_filter_unittest.cc |
deleted file mode 100644 |
index 9f5649369c7f8c46bf6c1ba34653444972d5c21f..0000000000000000000000000000000000000000 |
--- a/chrome/browser/prefs/tracked/pref_hash_filter_unittest.cc |
+++ /dev/null |
@@ -1,1053 +0,0 @@ |
-// Copyright 2013 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/pref_hash_filter.h" |
- |
-#include <map> |
-#include <set> |
-#include <string> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/basictypes.h" |
-#include "base/bind.h" |
-#include "base/callback_forward.h" |
-#include "base/compiler_specific.h" |
-#include "base/logging.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/metrics/histogram_base.h" |
-#include "base/metrics/histogram_samples.h" |
-#include "base/metrics/statistics_recorder.h" |
-#include "base/prefs/testing_pref_store.h" |
-#include "base/values.h" |
-#include "chrome/browser/prefs/tracked/hash_store_contents.h" |
-#include "chrome/browser/prefs/tracked/mock_validation_delegate.h" |
-#include "chrome/browser/prefs/tracked/pref_hash_store.h" |
-#include "chrome/browser/prefs/tracked/pref_hash_store_transaction.h" |
-#include "chrome/common/pref_names.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace { |
- |
-const char kAtomicPref[] = "atomic_pref"; |
-const char kAtomicPref2[] = "atomic_pref2"; |
-const char kAtomicPref3[] = "pref3"; |
-const char kAtomicPref4[] = "pref4"; |
-const char kReportOnlyPref[] = "report_only"; |
-const char kReportOnlySplitPref[] = "report_only_split_pref"; |
-const char kSplitPref[] = "split_pref"; |
- |
-const PrefHashFilter::TrackedPreferenceMetadata kTestTrackedPrefs[] = { |
- { |
- 0, kAtomicPref, PrefHashFilter::ENFORCE_ON_LOAD, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- PrefHashFilter::VALUE_PERSONAL |
- }, |
- { |
- 1, kReportOnlyPref, PrefHashFilter::NO_ENFORCEMENT, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- PrefHashFilter::VALUE_IMPERSONAL |
- }, |
- { |
- 2, kSplitPref, PrefHashFilter::ENFORCE_ON_LOAD, |
- PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- PrefHashFilter::VALUE_IMPERSONAL |
- }, |
- { |
- 3, kReportOnlySplitPref, PrefHashFilter::NO_ENFORCEMENT, |
- PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- PrefHashFilter::VALUE_IMPERSONAL |
- }, |
- { |
- 4, kAtomicPref2, PrefHashFilter::ENFORCE_ON_LOAD, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- PrefHashFilter::VALUE_IMPERSONAL |
- }, |
- { |
- 5, kAtomicPref3, PrefHashFilter::ENFORCE_ON_LOAD, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- PrefHashFilter::VALUE_IMPERSONAL |
- }, |
- { |
- 6, kAtomicPref4, PrefHashFilter::ENFORCE_ON_LOAD, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- PrefHashFilter::VALUE_IMPERSONAL |
- }, |
-}; |
- |
-} // namespace |
- |
-// A PrefHashStore that allows simulation of CheckValue results and captures |
-// checked and stored values. |
-class MockPrefHashStore : public PrefHashStore { |
- public: |
- typedef std::pair<const void*, PrefHashFilter::PrefTrackingStrategy> |
- ValuePtrStrategyPair; |
- |
- MockPrefHashStore() |
- : stamp_super_mac_result_(false), |
- is_super_mac_valid_result_(false), |
- transactions_performed_(0), |
- transaction_active_(false) {} |
- |
- ~MockPrefHashStore() override { EXPECT_FALSE(transaction_active_); } |
- |
- // Set the result that will be returned when |path| is passed to |
- // |CheckValue/CheckSplitValue|. |
- void SetCheckResult(const std::string& path, |
- PrefHashStoreTransaction::ValueState result); |
- |
- // Set the invalid_keys that will be returned when |path| is passed to |
- // |CheckSplitValue|. SetCheckResult should already have been called for |
- // |path| with |result == CHANGED| for this to make any sense. |
- void SetInvalidKeysResult( |
- const std::string& path, |
- const std::vector<std::string>& invalid_keys_result); |
- |
- // Sets the value that will be returned from |
- // PrefHashStoreTransaction::StampSuperMAC(). |
- void set_stamp_super_mac_result(bool result) { |
- stamp_super_mac_result_ = result; |
- } |
- |
- // Sets the value that will be returned from |
- // PrefHashStoreTransaction::IsSuperMACValid(). |
- void set_is_super_mac_valid_result(bool result) { |
- is_super_mac_valid_result_ = result; |
- } |
- |
- // Returns the number of transactions that were performed. |
- size_t transactions_performed() { return transactions_performed_; } |
- |
- // Returns the number of paths checked. |
- size_t checked_paths_count() const { |
- return checked_values_.size(); |
- } |
- |
- // Returns the number of paths stored. |
- size_t stored_paths_count() const { |
- return stored_values_.size(); |
- } |
- |
- // Returns the pointer value and strategy that was passed to |
- // |CheckHash/CheckSplitHash| for |path|. The returned pointer could since |
- // have been freed and is thus not safe to dereference. |
- ValuePtrStrategyPair checked_value(const std::string& path) const { |
- std::map<std::string, ValuePtrStrategyPair>::const_iterator value = |
- checked_values_.find(path); |
- if (value != checked_values_.end()) |
- return value->second; |
- return std::make_pair( |
- reinterpret_cast<void*>(0xBAD), |
- static_cast<PrefHashFilter::PrefTrackingStrategy>(-1)); |
- } |
- |
- // Returns the pointer value that was passed to |StoreHash/StoreSplitHash| for |
- // |path|. The returned pointer could since have been freed and is thus not |
- // safe to dereference. |
- ValuePtrStrategyPair stored_value(const std::string& path) const { |
- std::map<std::string, ValuePtrStrategyPair>::const_iterator value = |
- stored_values_.find(path); |
- if (value != stored_values_.end()) |
- return value->second; |
- return std::make_pair( |
- reinterpret_cast<void*>(0xBAD), |
- static_cast<PrefHashFilter::PrefTrackingStrategy>(-1)); |
- } |
- |
- // PrefHashStore implementation. |
- scoped_ptr<PrefHashStoreTransaction> BeginTransaction( |
- scoped_ptr<HashStoreContents> storage) override; |
- |
- private: |
- // A MockPrefHashStoreTransaction is handed to the caller on |
- // MockPrefHashStore::BeginTransaction(). It then stores state in its |
- // underlying MockPrefHashStore about calls it receives from that same caller |
- // which can later be verified in tests. |
- class MockPrefHashStoreTransaction : public PrefHashStoreTransaction { |
- public: |
- explicit MockPrefHashStoreTransaction(MockPrefHashStore* outer) |
- : outer_(outer) {} |
- |
- ~MockPrefHashStoreTransaction() override { |
- outer_->transaction_active_ = false; |
- ++outer_->transactions_performed_; |
- } |
- |
- // PrefHashStoreTransaction implementation. |
- PrefHashStoreTransaction::ValueState CheckValue( |
- const std::string& path, |
- const base::Value* value) const override; |
- void StoreHash(const std::string& path, |
- const base::Value* new_value) override; |
- PrefHashStoreTransaction::ValueState CheckSplitValue( |
- const std::string& path, |
- const base::DictionaryValue* initial_split_value, |
- std::vector<std::string>* invalid_keys) const override; |
- void StoreSplitHash(const std::string& path, |
- const base::DictionaryValue* split_value) override; |
- bool HasHash(const std::string& path) const override; |
- void ImportHash(const std::string& path, const base::Value* hash) override; |
- void ClearHash(const std::string& path) override; |
- bool IsSuperMACValid() const override; |
- bool StampSuperMac() override; |
- |
- private: |
- MockPrefHashStore* outer_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MockPrefHashStoreTransaction); |
- }; |
- |
- // Records a call to this mock's CheckValue/CheckSplitValue methods. |
- PrefHashStoreTransaction::ValueState RecordCheckValue( |
- const std::string& path, |
- const base::Value* value, |
- PrefHashFilter::PrefTrackingStrategy strategy); |
- |
- // Records a call to this mock's StoreHash/StoreSplitHash methods. |
- void RecordStoreHash(const std::string& path, |
- const base::Value* new_value, |
- PrefHashFilter::PrefTrackingStrategy strategy); |
- |
- std::map<std::string, PrefHashStoreTransaction::ValueState> check_results_; |
- std::map<std::string, std::vector<std::string> > invalid_keys_results_; |
- |
- bool stamp_super_mac_result_; |
- bool is_super_mac_valid_result_; |
- |
- std::map<std::string, ValuePtrStrategyPair> checked_values_; |
- std::map<std::string, ValuePtrStrategyPair> stored_values_; |
- |
- // Number of transactions that were performed via this MockPrefHashStore. |
- size_t transactions_performed_; |
- |
- // Whether a transaction is currently active (only one transaction should be |
- // active at a time). |
- bool transaction_active_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MockPrefHashStore); |
-}; |
- |
-void MockPrefHashStore::SetCheckResult( |
- const std::string& path, PrefHashStoreTransaction::ValueState result) { |
- check_results_.insert(std::make_pair(path, result)); |
-} |
- |
-void MockPrefHashStore::SetInvalidKeysResult( |
- const std::string& path, |
- const std::vector<std::string>& invalid_keys_result) { |
- // Ensure |check_results_| has a CHANGED entry for |path|. |
- std::map<std::string, |
- PrefHashStoreTransaction::ValueState>::const_iterator result = |
- check_results_.find(path); |
- ASSERT_TRUE(result != check_results_.end()); |
- ASSERT_EQ(PrefHashStoreTransaction::CHANGED, result->second); |
- |
- invalid_keys_results_.insert(std::make_pair(path, invalid_keys_result)); |
-} |
- |
-scoped_ptr<PrefHashStoreTransaction> MockPrefHashStore::BeginTransaction( |
- scoped_ptr<HashStoreContents> storage) { |
- EXPECT_FALSE(transaction_active_); |
- return scoped_ptr<PrefHashStoreTransaction>( |
- new MockPrefHashStoreTransaction(this)); |
-} |
- |
-PrefHashStoreTransaction::ValueState MockPrefHashStore::RecordCheckValue( |
- const std::string& path, |
- const base::Value* value, |
- PrefHashFilter::PrefTrackingStrategy strategy) { |
- // Record that |path| was checked and validate that it wasn't previously |
- // checked. |
- EXPECT_TRUE(checked_values_.insert( |
- std::make_pair(path, std::make_pair(value, strategy))).second); |
- std::map<std::string, |
- PrefHashStoreTransaction::ValueState>::const_iterator result = |
- check_results_.find(path); |
- if (result != check_results_.end()) |
- return result->second; |
- return PrefHashStoreTransaction::UNCHANGED; |
-} |
- |
-void MockPrefHashStore::RecordStoreHash( |
- const std::string& path, |
- const base::Value* new_value, |
- PrefHashFilter::PrefTrackingStrategy strategy) { |
- EXPECT_TRUE(stored_values_.insert( |
- std::make_pair(path, std::make_pair(new_value, strategy))).second); |
-} |
- |
-PrefHashStoreTransaction::ValueState |
-MockPrefHashStore::MockPrefHashStoreTransaction::CheckValue( |
- const std::string& path, const base::Value* value) const { |
- return outer_->RecordCheckValue(path, value, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC); |
-} |
- |
-void MockPrefHashStore::MockPrefHashStoreTransaction::StoreHash( |
- const std::string& path, |
- const base::Value* new_value) { |
- outer_->RecordStoreHash(path, new_value, |
- PrefHashFilter::TRACKING_STRATEGY_ATOMIC); |
-} |
- |
-PrefHashStoreTransaction::ValueState |
-MockPrefHashStore::MockPrefHashStoreTransaction::CheckSplitValue( |
- const std::string& path, |
- const base::DictionaryValue* initial_split_value, |
- std::vector<std::string>* invalid_keys) const { |
- EXPECT_TRUE(invalid_keys && invalid_keys->empty()); |
- |
- std::map<std::string, std::vector<std::string> >::const_iterator |
- invalid_keys_result = outer_->invalid_keys_results_.find(path); |
- if (invalid_keys_result != outer_->invalid_keys_results_.end()) { |
- invalid_keys->insert(invalid_keys->begin(), |
- invalid_keys_result->second.begin(), |
- invalid_keys_result->second.end()); |
- } |
- |
- return outer_->RecordCheckValue(path, initial_split_value, |
- PrefHashFilter::TRACKING_STRATEGY_SPLIT); |
-} |
- |
-void MockPrefHashStore::MockPrefHashStoreTransaction::StoreSplitHash( |
- const std::string& path, |
- const base::DictionaryValue* new_value) { |
- outer_->RecordStoreHash(path, new_value, |
- PrefHashFilter::TRACKING_STRATEGY_SPLIT); |
-} |
- |
-bool MockPrefHashStore::MockPrefHashStoreTransaction::HasHash( |
- const std::string& path) const { |
- ADD_FAILURE() << "Unexpected call."; |
- return false; |
-} |
- |
-void MockPrefHashStore::MockPrefHashStoreTransaction::ImportHash( |
- const std::string& path, |
- const base::Value* hash) { |
- ADD_FAILURE() << "Unexpected call."; |
-} |
- |
-void MockPrefHashStore::MockPrefHashStoreTransaction::ClearHash( |
- const std::string& path) { |
- // Allow this to be called by PrefHashFilter's deprecated tracked prefs |
- // cleanup tasks. |
-} |
- |
-bool MockPrefHashStore::MockPrefHashStoreTransaction::IsSuperMACValid() const { |
- return outer_->is_super_mac_valid_result_; |
-} |
- |
-bool MockPrefHashStore::MockPrefHashStoreTransaction::StampSuperMac() { |
- return outer_->stamp_super_mac_result_; |
-} |
- |
-std::vector<PrefHashFilter::TrackedPreferenceMetadata> GetConfiguration( |
- PrefHashFilter::EnforcementLevel max_enforcement_level) { |
- std::vector<PrefHashFilter::TrackedPreferenceMetadata> configuration( |
- kTestTrackedPrefs, kTestTrackedPrefs + arraysize(kTestTrackedPrefs)); |
- for (std::vector<PrefHashFilter::TrackedPreferenceMetadata>::iterator it = |
- configuration.begin(); |
- it != configuration.end(); |
- ++it) { |
- if (it->enforcement_level > max_enforcement_level) |
- it->enforcement_level = max_enforcement_level; |
- } |
- return configuration; |
-} |
- |
-class PrefHashFilterTest |
- : public testing::TestWithParam<PrefHashFilter::EnforcementLevel> { |
- public: |
- PrefHashFilterTest() : mock_pref_hash_store_(NULL), |
- pref_store_contents_(new base::DictionaryValue), |
- reset_recorded_(false) {} |
- |
- void SetUp() override { |
- base::StatisticsRecorder::Initialize(); |
- Reset(); |
- } |
- |
- protected: |
- // Reset the PrefHashFilter instance. |
- void Reset() { |
- // Construct a PrefHashFilter and MockPrefHashStore for the test. |
- InitializePrefHashFilter(GetConfiguration(GetParam())); |
- } |
- |
- // Initializes |pref_hash_filter_| with a PrefHashFilter that uses a |
- // MockPrefHashStore. The raw pointer to the MockPrefHashStore (owned by the |
- // PrefHashFilter) is stored in |mock_pref_hash_store_|. |
- void InitializePrefHashFilter(const std::vector< |
- PrefHashFilter::TrackedPreferenceMetadata>& configuration) { |
- scoped_ptr<MockPrefHashStore> temp_mock_pref_hash_store( |
- new MockPrefHashStore); |
- mock_pref_hash_store_ = temp_mock_pref_hash_store.get(); |
- pref_hash_filter_.reset(new PrefHashFilter( |
- temp_mock_pref_hash_store.Pass(), |
- configuration, |
- base::Bind(&PrefHashFilterTest::RecordReset, base::Unretained(this)), |
- &mock_validation_delegate_, |
- arraysize(kTestTrackedPrefs), |
- true)); |
- } |
- |
- // Verifies whether a reset was reported by the PrefHashFiler. Also verifies |
- // that kPreferenceResetTime was set (or not) accordingly. |
- void VerifyRecordedReset(bool reset_expected) { |
- EXPECT_EQ(reset_expected, reset_recorded_); |
- EXPECT_EQ(reset_expected, |
- pref_store_contents_->Get(prefs::kPreferenceResetTime, NULL)); |
- } |
- |
- // Calls FilterOnLoad() on |pref_hash_Filter_|. |pref_store_contents_| is |
- // handed off, but should be given back to us synchronously through |
- // GetPrefsBack() as there is no FilterOnLoadInterceptor installed on |
- // |pref_hash_filter_|. |
- void DoFilterOnLoad(bool expect_prefs_modifications) { |
- pref_hash_filter_->FilterOnLoad( |
- base::Bind(&PrefHashFilterTest::GetPrefsBack, base::Unretained(this), |
- expect_prefs_modifications), |
- pref_store_contents_.Pass()); |
- } |
- |
- MockPrefHashStore* mock_pref_hash_store_; |
- scoped_ptr<base::DictionaryValue> pref_store_contents_; |
- MockValidationDelegate mock_validation_delegate_; |
- scoped_ptr<PrefHashFilter> pref_hash_filter_; |
- |
- private: |
- // Stores |prefs| back in |pref_store_contents| and ensure |
- // |expected_schedule_write| matches the reported |schedule_write|. |
- void GetPrefsBack(bool expected_schedule_write, |
- scoped_ptr<base::DictionaryValue> prefs, |
- bool schedule_write) { |
- pref_store_contents_ = prefs.Pass(); |
- EXPECT_TRUE(pref_store_contents_); |
- EXPECT_EQ(expected_schedule_write, schedule_write); |
- } |
- |
- void RecordReset() { |
- // As-is |reset_recorded_| is only designed to remember a single reset, make |
- // sure none was previously recorded. |
- EXPECT_FALSE(reset_recorded_); |
- reset_recorded_ = true; |
- } |
- |
- bool reset_recorded_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PrefHashFilterTest); |
-}; |
- |
-TEST_P(PrefHashFilterTest, EmptyAndUnchanged) { |
- DoFilterOnLoad(false); |
- // All paths checked. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- // No paths stored, since they all return |UNCHANGED|. |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- // Since there was nothing in |pref_store_contents_| the checked value should |
- // have been NULL for all tracked preferences. |
- for (size_t i = 0; i < arraysize(kTestTrackedPrefs); ++i) { |
- ASSERT_EQ(NULL, mock_pref_hash_store_->checked_value( |
- kTestTrackedPrefs[i].name).first); |
- } |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- VerifyRecordedReset(false); |
- |
- // Delegate saw all paths, and all unchanged. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
-} |
- |
-TEST_P(PrefHashFilterTest, StampSuperMACAltersStore) { |
- mock_pref_hash_store_->set_stamp_super_mac_result(true); |
- DoFilterOnLoad(true); |
- // No paths stored, since they all return |UNCHANGED|. The StampSuperMAC |
- // result is the only reason the prefs were considered altered. |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
-} |
- |
-TEST_P(PrefHashFilterTest, FilterTrackedPrefUpdate) { |
- base::DictionaryValue root_dict; |
- // Ownership of |string_value| is transfered to |root_dict|. |
- base::Value* string_value = new base::StringValue("string value"); |
- root_dict.Set(kAtomicPref, string_value); |
- |
- // No path should be stored on FilterUpdate. |
- pref_hash_filter_->FilterUpdate(kAtomicPref); |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // One path should be stored on FilterSerializeData. |
- pref_hash_filter_->FilterSerializeData(&root_dict); |
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count()); |
- MockPrefHashStore::ValuePtrStrategyPair stored_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- ASSERT_EQ(string_value, stored_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, stored_value.second); |
- |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- VerifyRecordedReset(false); |
-} |
- |
-TEST_P(PrefHashFilterTest, ReportSuperMacValidity) { |
- // Do this once just to force the histogram to be defined. |
- DoFilterOnLoad(false); |
- |
- base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram( |
- "Settings.HashesDictionaryTrusted"); |
- ASSERT_TRUE(histogram); |
- |
- base::HistogramBase::Count initial_untrusted = |
- histogram->SnapshotSamples()->GetCount(0); |
- base::HistogramBase::Count initial_trusted = |
- histogram->SnapshotSamples()->GetCount(1); |
- |
- Reset(); |
- |
- // Run with an invalid super MAC. |
- mock_pref_hash_store_->set_is_super_mac_valid_result(false); |
- |
- DoFilterOnLoad(false); |
- |
- // Verify that the invalidity was reported. |
- ASSERT_EQ(initial_untrusted + 1, histogram->SnapshotSamples()->GetCount(0)); |
- ASSERT_EQ(initial_trusted, histogram->SnapshotSamples()->GetCount(1)); |
- |
- Reset(); |
- |
- // Run with a valid super MAC. |
- mock_pref_hash_store_->set_is_super_mac_valid_result(true); |
- |
- DoFilterOnLoad(false); |
- |
- // Verify that the validity was reported. |
- ASSERT_EQ(initial_untrusted + 1, histogram->SnapshotSamples()->GetCount(0)); |
- ASSERT_EQ(initial_trusted + 1, histogram->SnapshotSamples()->GetCount(1)); |
-} |
- |
-TEST_P(PrefHashFilterTest, FilterSplitPrefUpdate) { |
- base::DictionaryValue root_dict; |
- // Ownership of |dict_value| is transfered to |root_dict|. |
- base::DictionaryValue* dict_value = new base::DictionaryValue; |
- dict_value->SetString("a", "foo"); |
- dict_value->SetInteger("b", 1234); |
- root_dict.Set(kSplitPref, dict_value); |
- |
- // No path should be stored on FilterUpdate. |
- pref_hash_filter_->FilterUpdate(kSplitPref); |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // One path should be stored on FilterSerializeData. |
- pref_hash_filter_->FilterSerializeData(&root_dict); |
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count()); |
- MockPrefHashStore::ValuePtrStrategyPair stored_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(dict_value, stored_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, stored_value.second); |
- |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- VerifyRecordedReset(false); |
-} |
- |
-TEST_P(PrefHashFilterTest, FilterUntrackedPrefUpdate) { |
- base::DictionaryValue root_dict; |
- root_dict.Set("untracked", new base::StringValue("some value")); |
- pref_hash_filter_->FilterUpdate("untracked"); |
- |
- // No paths should be stored on FilterUpdate. |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // Nor on FilterSerializeData. |
- pref_hash_filter_->FilterSerializeData(&root_dict); |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // No transaction should even be started on FilterSerializeData() if there are |
- // no updates to perform. |
- ASSERT_EQ(0u, mock_pref_hash_store_->transactions_performed()); |
-} |
- |
-TEST_P(PrefHashFilterTest, MultiplePrefsFilterSerializeData) { |
- base::DictionaryValue root_dict; |
- // Ownership of the following values is transfered to |root_dict|. |
- base::Value* int_value1 = new base::FundamentalValue(1); |
- base::Value* int_value2 = new base::FundamentalValue(2); |
- base::Value* int_value3 = new base::FundamentalValue(3); |
- base::Value* int_value4 = new base::FundamentalValue(4); |
- base::DictionaryValue* dict_value = new base::DictionaryValue; |
- dict_value->Set("a", new base::FundamentalValue(true)); |
- root_dict.Set(kAtomicPref, int_value1); |
- root_dict.Set(kAtomicPref2, int_value2); |
- root_dict.Set(kAtomicPref3, int_value3); |
- root_dict.Set("untracked", int_value4); |
- root_dict.Set(kSplitPref, dict_value); |
- |
- // Only update kAtomicPref, kAtomicPref3, and kSplitPref. |
- pref_hash_filter_->FilterUpdate(kAtomicPref); |
- pref_hash_filter_->FilterUpdate(kAtomicPref3); |
- pref_hash_filter_->FilterUpdate(kSplitPref); |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // Update kAtomicPref3 again, nothing should be stored still. |
- base::Value* int_value5 = new base::FundamentalValue(5); |
- root_dict.Set(kAtomicPref3, int_value5); |
- ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // On FilterSerializeData, only kAtomicPref, kAtomicPref3, and kSplitPref |
- // should get a new hash. |
- pref_hash_filter_->FilterSerializeData(&root_dict); |
- ASSERT_EQ(3u, mock_pref_hash_store_->stored_paths_count()); |
- MockPrefHashStore::ValuePtrStrategyPair stored_value_atomic1 = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- ASSERT_EQ(int_value1, stored_value_atomic1.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_value_atomic1.second); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_value_atomic3 = |
- mock_pref_hash_store_->stored_value(kAtomicPref3); |
- ASSERT_EQ(int_value5, stored_value_atomic3.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_value_atomic3.second); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_value_split = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(dict_value, stored_value_split.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, stored_value_split.second); |
-} |
- |
-TEST_P(PrefHashFilterTest, UnknownNullValue) { |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_FALSE(pref_store_contents_->Get(kSplitPref, NULL)); |
- // NULL values are always trusted by the PrefHashStore. |
- mock_pref_hash_store_->SetCheckResult( |
- kAtomicPref, PrefHashStoreTransaction::TRUSTED_NULL_VALUE); |
- mock_pref_hash_store_->SetCheckResult( |
- kSplitPref, PrefHashStoreTransaction::TRUSTED_NULL_VALUE); |
- DoFilterOnLoad(false); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- ASSERT_EQ(NULL, stored_atomic_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_atomic_value.second); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(NULL, stored_split_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- stored_split_value.second); |
- |
- // Delegate saw all prefs, two of which had the expected value_state. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::TRUSTED_NULL_VALUE)); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
- |
- const MockValidationDelegate::ValidationEvent* validated_split_pref = |
- mock_validation_delegate_.GetEventForPath(kSplitPref); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- validated_split_pref->strategy); |
- ASSERT_FALSE(validated_split_pref->is_personal); |
- const MockValidationDelegate::ValidationEvent* validated_atomic_pref = |
- mock_validation_delegate_.GetEventForPath(kAtomicPref); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- validated_atomic_pref->strategy); |
- ASSERT_TRUE(validated_atomic_pref->is_personal); |
-} |
- |
-TEST_P(PrefHashFilterTest, InitialValueUnknown) { |
- // Ownership of these values is transfered to |pref_store_contents_|. |
- base::StringValue* string_value = new base::StringValue("string value"); |
- pref_store_contents_->Set(kAtomicPref, string_value); |
- |
- base::DictionaryValue* dict_value = new base::DictionaryValue; |
- dict_value->SetString("a", "foo"); |
- dict_value->SetInteger("b", 1234); |
- pref_store_contents_->Set(kSplitPref, dict_value); |
- |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, NULL)); |
- |
- mock_pref_hash_store_->SetCheckResult( |
- kAtomicPref, PrefHashStoreTransaction::UNTRUSTED_UNKNOWN_VALUE); |
- mock_pref_hash_store_->SetCheckResult( |
- kSplitPref, PrefHashStoreTransaction::UNTRUSTED_UNKNOWN_VALUE); |
- // If we are enforcing, expect this to report changes. |
- DoFilterOnLoad(GetParam() >= PrefHashFilter::ENFORCE_ON_LOAD); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- // Delegate saw all prefs, two of which had the expected value_state. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNTRUSTED_UNKNOWN_VALUE)); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_atomic_value.second); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- stored_split_value.second); |
- if (GetParam() == PrefHashFilter::ENFORCE_ON_LOAD) { |
- // Ensure the prefs were cleared and the hashes for NULL were restored if |
- // the current enforcement level denies seeding. |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_EQ(NULL, stored_atomic_value.first); |
- |
- ASSERT_FALSE(pref_store_contents_->Get(kSplitPref, NULL)); |
- ASSERT_EQ(NULL, stored_split_value.first); |
- |
- VerifyRecordedReset(true); |
- } else { |
- // Otherwise the values should have remained intact and the hashes should |
- // have been updated to match them. |
- const base::Value* atomic_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, &atomic_value_in_store)); |
- ASSERT_EQ(string_value, atomic_value_in_store); |
- ASSERT_EQ(string_value, stored_atomic_value.first); |
- |
- const base::Value* split_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
- ASSERT_EQ(dict_value, split_value_in_store); |
- ASSERT_EQ(dict_value, stored_split_value.first); |
- |
- VerifyRecordedReset(false); |
- } |
-} |
- |
-TEST_P(PrefHashFilterTest, InitialValueTrustedUnknown) { |
- // Ownership of this value is transfered to |pref_store_contents_|. |
- base::Value* string_value = new base::StringValue("test"); |
- pref_store_contents_->Set(kAtomicPref, string_value); |
- |
- base::DictionaryValue* dict_value = new base::DictionaryValue; |
- dict_value->SetString("a", "foo"); |
- dict_value->SetInteger("b", 1234); |
- pref_store_contents_->Set(kSplitPref, dict_value); |
- |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, NULL)); |
- |
- mock_pref_hash_store_->SetCheckResult( |
- kAtomicPref, PrefHashStoreTransaction::TRUSTED_UNKNOWN_VALUE); |
- mock_pref_hash_store_->SetCheckResult( |
- kSplitPref, PrefHashStoreTransaction::TRUSTED_UNKNOWN_VALUE); |
- DoFilterOnLoad(false); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- // Delegate saw all prefs, two of which had the expected value_state. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::TRUSTED_UNKNOWN_VALUE)); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
- |
- // Seeding is always allowed for trusted unknown values. |
- const base::Value* atomic_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, &atomic_value_in_store)); |
- ASSERT_EQ(string_value, atomic_value_in_store); |
- MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- ASSERT_EQ(string_value, stored_atomic_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_atomic_value.second); |
- |
- const base::Value* split_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
- ASSERT_EQ(dict_value, split_value_in_store); |
- MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(dict_value, stored_split_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- stored_split_value.second); |
-} |
- |
-TEST_P(PrefHashFilterTest, InitialValueChanged) { |
- // Ownership of this value is transfered to |pref_store_contents_|. |
- base::Value* int_value = new base::FundamentalValue(1234); |
- pref_store_contents_->Set(kAtomicPref, int_value); |
- |
- base::DictionaryValue* dict_value = new base::DictionaryValue; |
- dict_value->SetString("a", "foo"); |
- dict_value->SetInteger("b", 1234); |
- dict_value->SetInteger("c", 56); |
- dict_value->SetBoolean("d", false); |
- pref_store_contents_->Set(kSplitPref, dict_value); |
- |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, NULL)); |
- |
- mock_pref_hash_store_->SetCheckResult(kAtomicPref, |
- PrefHashStoreTransaction::CHANGED); |
- mock_pref_hash_store_->SetCheckResult(kSplitPref, |
- PrefHashStoreTransaction::CHANGED); |
- |
- std::vector<std::string> mock_invalid_keys; |
- mock_invalid_keys.push_back("a"); |
- mock_invalid_keys.push_back("c"); |
- mock_pref_hash_store_->SetInvalidKeysResult(kSplitPref, mock_invalid_keys); |
- |
- DoFilterOnLoad(GetParam() >= PrefHashFilter::ENFORCE_ON_LOAD); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_atomic_value.second); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- stored_split_value.second); |
- if (GetParam() == PrefHashFilter::ENFORCE_ON_LOAD) { |
- // Ensure the atomic pref was cleared and the hash for NULL was restored if |
- // the current enforcement level prevents changes. |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_EQ(NULL, stored_atomic_value.first); |
- |
- // The split pref on the other hand should only have been stripped of its |
- // invalid keys. |
- const base::Value* split_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
- ASSERT_EQ(2U, dict_value->size()); |
- ASSERT_FALSE(dict_value->HasKey("a")); |
- ASSERT_TRUE(dict_value->HasKey("b")); |
- ASSERT_FALSE(dict_value->HasKey("c")); |
- ASSERT_TRUE(dict_value->HasKey("d")); |
- ASSERT_EQ(dict_value, stored_split_value.first); |
- |
- VerifyRecordedReset(true); |
- } else { |
- // Otherwise the value should have remained intact and the hash should have |
- // been updated to match it. |
- const base::Value* atomic_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, &atomic_value_in_store)); |
- ASSERT_EQ(int_value, atomic_value_in_store); |
- ASSERT_EQ(int_value, stored_atomic_value.first); |
- |
- const base::Value* split_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
- ASSERT_EQ(dict_value, split_value_in_store); |
- ASSERT_EQ(4U, dict_value->size()); |
- ASSERT_TRUE(dict_value->HasKey("a")); |
- ASSERT_TRUE(dict_value->HasKey("b")); |
- ASSERT_TRUE(dict_value->HasKey("c")); |
- ASSERT_TRUE(dict_value->HasKey("d")); |
- ASSERT_EQ(dict_value, stored_split_value.first); |
- |
- VerifyRecordedReset(false); |
- } |
-} |
- |
-TEST_P(PrefHashFilterTest, EmptyCleared) { |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_FALSE(pref_store_contents_->Get(kSplitPref, NULL)); |
- mock_pref_hash_store_->SetCheckResult(kAtomicPref, |
- PrefHashStoreTransaction::CLEARED); |
- mock_pref_hash_store_->SetCheckResult(kSplitPref, |
- PrefHashStoreTransaction::CLEARED); |
- DoFilterOnLoad(false); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- // Delegate saw all prefs, two of which had the expected value_state. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::CLEARED)); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
- |
- // Regardless of the enforcement level, the only thing that should be done is |
- // to restore the hash for NULL. The value itself should still be NULL. |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- ASSERT_EQ(NULL, stored_atomic_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_atomic_value.second); |
- |
- ASSERT_FALSE(pref_store_contents_->Get(kSplitPref, NULL)); |
- MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(NULL, stored_split_value.first); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- stored_split_value.second); |
-} |
- |
-TEST_P(PrefHashFilterTest, InitialValueUnchangedLegacyId) { |
- // Ownership of these values is transfered to |pref_store_contents_|. |
- base::StringValue* string_value = new base::StringValue("string value"); |
- pref_store_contents_->Set(kAtomicPref, string_value); |
- |
- base::DictionaryValue* dict_value = new base::DictionaryValue; |
- dict_value->SetString("a", "foo"); |
- dict_value->SetInteger("b", 1234); |
- pref_store_contents_->Set(kSplitPref, dict_value); |
- |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, NULL)); |
- |
- mock_pref_hash_store_->SetCheckResult( |
- kAtomicPref, PrefHashStoreTransaction::SECURE_LEGACY); |
- mock_pref_hash_store_->SetCheckResult( |
- kSplitPref, PrefHashStoreTransaction::SECURE_LEGACY); |
- DoFilterOnLoad(false); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- // Delegate saw all prefs, two of which had the expected value_state. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::SECURE_LEGACY)); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs) - 2u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
- |
- // Ensure that both the atomic and split hashes were restored. |
- ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count()); |
- |
- // In all cases, the values should have remained intact and the hashes should |
- // have been updated to match them. |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value = |
- mock_pref_hash_store_->stored_value(kAtomicPref); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC, |
- stored_atomic_value.second); |
- const base::Value* atomic_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, &atomic_value_in_store)); |
- ASSERT_EQ(string_value, atomic_value_in_store); |
- ASSERT_EQ(string_value, stored_atomic_value.first); |
- |
- MockPrefHashStore::ValuePtrStrategyPair stored_split_value = |
- mock_pref_hash_store_->stored_value(kSplitPref); |
- ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_SPLIT, |
- stored_split_value.second); |
- const base::Value* split_value_in_store; |
- ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store)); |
- ASSERT_EQ(dict_value, split_value_in_store); |
- ASSERT_EQ(dict_value, stored_split_value.first); |
- |
- VerifyRecordedReset(false); |
-} |
- |
-TEST_P(PrefHashFilterTest, DontResetReportOnly) { |
- // Ownership of these values is transfered to |pref_store_contents_|. |
- base::Value* int_value1 = new base::FundamentalValue(1); |
- base::Value* int_value2 = new base::FundamentalValue(2); |
- base::Value* report_only_val = new base::FundamentalValue(3); |
- base::DictionaryValue* report_only_split_val = new base::DictionaryValue; |
- report_only_split_val->SetInteger("a", 1234); |
- pref_store_contents_->Set(kAtomicPref, int_value1); |
- pref_store_contents_->Set(kAtomicPref2, int_value2); |
- pref_store_contents_->Set(kReportOnlyPref, report_only_val); |
- pref_store_contents_->Set(kReportOnlySplitPref, report_only_split_val); |
- |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref2, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kReportOnlyPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kReportOnlySplitPref, NULL)); |
- |
- mock_pref_hash_store_->SetCheckResult(kAtomicPref, |
- PrefHashStoreTransaction::CHANGED); |
- mock_pref_hash_store_->SetCheckResult(kAtomicPref2, |
- PrefHashStoreTransaction::CHANGED); |
- mock_pref_hash_store_->SetCheckResult(kReportOnlyPref, |
- PrefHashStoreTransaction::CHANGED); |
- mock_pref_hash_store_->SetCheckResult(kReportOnlySplitPref, |
- PrefHashStoreTransaction::CHANGED); |
- |
- DoFilterOnLoad(GetParam() >= PrefHashFilter::ENFORCE_ON_LOAD); |
- // All prefs should be checked and a new hash should be stored for each tested |
- // pref. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_pref_hash_store_->checked_paths_count()); |
- ASSERT_EQ(4u, mock_pref_hash_store_->stored_paths_count()); |
- ASSERT_EQ(1u, mock_pref_hash_store_->transactions_performed()); |
- |
- // Delegate saw all prefs, four of which had the expected value_state. |
- ASSERT_EQ(arraysize(kTestTrackedPrefs), |
- mock_validation_delegate_.recorded_validations_count()); |
- ASSERT_EQ(4u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::CHANGED)); |
- ASSERT_EQ(arraysize(kTestTrackedPrefs) - 4u, |
- mock_validation_delegate_.CountValidationsOfState( |
- PrefHashStoreTransaction::UNCHANGED)); |
- |
- // No matter what the enforcement level is, the report only pref should never |
- // be reset. |
- ASSERT_TRUE(pref_store_contents_->Get(kReportOnlyPref, NULL)); |
- ASSERT_TRUE(pref_store_contents_->Get(kReportOnlySplitPref, NULL)); |
- ASSERT_EQ(report_only_val, |
- mock_pref_hash_store_->stored_value(kReportOnlyPref).first); |
- ASSERT_EQ(report_only_split_val, |
- mock_pref_hash_store_->stored_value(kReportOnlySplitPref).first); |
- |
- // All other prefs should have been reset if the enforcement level allows it. |
- if (GetParam() == PrefHashFilter::ENFORCE_ON_LOAD) { |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref, NULL)); |
- ASSERT_FALSE(pref_store_contents_->Get(kAtomicPref2, NULL)); |
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kAtomicPref).first); |
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kAtomicPref2).first); |
- |
- VerifyRecordedReset(true); |
- } else { |
- const base::Value* value_in_store; |
- const base::Value* value_in_store2; |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref, &value_in_store)); |
- ASSERT_TRUE(pref_store_contents_->Get(kAtomicPref2, &value_in_store2)); |
- ASSERT_EQ(int_value1, value_in_store); |
- ASSERT_EQ(int_value1, |
- mock_pref_hash_store_->stored_value(kAtomicPref).first); |
- ASSERT_EQ(int_value2, value_in_store2); |
- ASSERT_EQ(int_value2, |
- mock_pref_hash_store_->stored_value(kAtomicPref2).first); |
- |
- VerifyRecordedReset(false); |
- } |
-} |
- |
-INSTANTIATE_TEST_CASE_P( |
- PrefHashFilterTestInstance, PrefHashFilterTest, |
- testing::Values(PrefHashFilter::NO_ENFORCEMENT, |
- PrefHashFilter::ENFORCE_ON_LOAD)); |