Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: chrome/browser/prefs/pref_hash_filter_unittest.cc

Issue 114223002: Multi-strategy based tracking. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use base::ScopedPtrHashMap Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prefs/pref_hash_filter_unittest.cc
diff --git a/chrome/browser/prefs/pref_hash_filter_unittest.cc b/chrome/browser/prefs/pref_hash_filter_unittest.cc
index 9248322a98a2f8d41d854fb7a7cf267313858d24..94fe7bf1c2fff1bf6cf32ec689cc69b2435d00f9 100644
--- a/chrome/browser/prefs/pref_hash_filter_unittest.cc
+++ b/chrome/browser/prefs/pref_hash_filter_unittest.cc
@@ -15,18 +15,23 @@
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "chrome/browser/prefs/pref_hash_store.h"
+#include "chrome/browser/prefs/tracked_preference.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
-const char kTestPref[] = "pref";
-const char kTestPref2[] = "pref2";
+const char kAtomicPref[] = "atomic_pref";
+const char kAtomicPref2[] = "atomic_pref2";
const char kReportOnlyPref[] = "report_only";
-
-const PrefHashFilter::TrackedPreference kTestTrackedPrefs[] = {
- { 0, kTestPref, true },
- { 1, kReportOnlyPref, false },
- { 2, kTestPref2, true },
+const char kReportOnlySplitPref[] = "report_only_split_pref";
+const char kSplitPref[] = "split_pref";
+
+const PrefHashFilter::TrackedPreferenceMetadata kTestTrackedPrefs[] = {
+ { 0, kAtomicPref, true, PrefHashFilter::TRACKING_STRATEGY_ATOMIC },
+ { 1, kReportOnlyPref, false, PrefHashFilter::TRACKING_STRATEGY_ATOMIC },
+ { 2, kSplitPref, true, PrefHashFilter::TRACKING_STRATEGY_SPLIT },
+ { 3, kReportOnlySplitPref, false, PrefHashFilter::TRACKING_STRATEGY_SPLIT },
+ { 4, kAtomicPref2, true, PrefHashFilter::TRACKING_STRATEGY_ATOMIC },
};
} // namespace
@@ -35,13 +40,23 @@ const PrefHashFilter::TrackedPreference kTestTrackedPrefs[] = {
// checked and stored values.
class MockPrefHashStore : public PrefHashStore {
public:
+ typedef std::pair<const void*, PrefHashFilter::PrefTrackingStrategy>
+ ValuePtrStrategyPair;
MockPrefHashStore() {}
- // Set the result that will be returned when |path| is passed to |CheckValue|.
+ // Set the result that will be returned when |path| is passed to
+ // |Check(Split)?Value|.
void SetCheckResult(const std::string& path,
PrefHashStore::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);
+
// Returns the number of paths checked.
size_t checked_paths_count() const {
return checked_values_.size();
@@ -52,26 +67,30 @@ class MockPrefHashStore : public PrefHashStore {
return stored_values_.size();
}
- // Returns the pointer value that was passed to |CheckValue| for |path|. The
- // returned pointer could since have been freed and is thus not safe to
- // dereference.
- const void* checked_value(const std::string& path) const {
- std::map<std::string, const base::Value*>::iterator value =
+ // Returns the pointer value and strategy that was passed to
+ // |Check(Split)?Hash| for |path|. The returned pointer could since have been
Bernhard Bauer 2014/01/17 17:00:05 Nit: CheckHash/CheckSplitHash reads a bit easier t
gab 2014/01/17 19:56:49 Done.
+ // freed and is thus not safe to dereference.
+ ValuePtrStrategyPair checked_value(const std::string& path) const {
+ std::map<std::string, ValuePtrStrategyPair>::iterator value =
checked_values_.find(path);
if (value != checked_values_.end())
return value->second;
- return reinterpret_cast<void*>(0xBAD);
+ return std::make_pair(
+ reinterpret_cast<void*>(0xBAD),
+ static_cast<PrefHashFilter::PrefTrackingStrategy>(-1));
}
- // Returns the pointer value that was passed to |StoreHash| for |path|. The
- // returned pointer could since have been freed and is thus not safe to
- // dereference.
- const void* stored_value(const std::string& path) const {
- std::map<std::string, const base::Value*>::const_iterator value =
+ // Returns the pointer value that was passed to |Store(Split)?Hash| 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 reinterpret_cast<void*>(0xBAD);
+ return std::make_pair(
+ reinterpret_cast<void*>(0xBAD),
+ static_cast<PrefHashFilter::PrefTrackingStrategy>(-1));
}
// PrefHashStore implementation.
@@ -79,11 +98,30 @@ class MockPrefHashStore : public PrefHashStore {
const std::string& path, const base::Value* value) const OVERRIDE;
virtual void StoreHash(const std::string& path,
const base::Value* new_value) OVERRIDE;
+ virtual PrefHashStore::ValueState CheckSplitValue(
+ const std::string& path,
+ const base::DictionaryValue* initial_split_value,
+ std::vector<std::string>* invalid_keys) const OVERRIDE;
+ virtual void StoreSplitHash(
+ const std::string& path,
+ const base::DictionaryValue* split_value) OVERRIDE;
private:
+ // Records a call to this mock's CheckValue/CheckSplitValue methods.
+ PrefHashStore::ValueState RecordCheckValue(
+ const std::string& path,
+ const base::Value* value,
+ PrefHashFilter::PrefTrackingStrategy strategy) const;
+
+ // 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, PrefHashStore::ValueState> check_results_;
- mutable std::map<std::string, const base::Value*> checked_values_;
- std::map<std::string, const base::Value*> stored_values_;
+ std::map<std::string, std::vector<std::string> > invalid_keys_results_;
+ mutable std::map<std::string, ValuePtrStrategyPair> checked_values_;
+ std::map<std::string, ValuePtrStrategyPair> stored_values_;
DISALLOW_COPY_AND_ASSIGN(MockPrefHashStore);
};
@@ -93,10 +131,60 @@ void MockPrefHashStore::SetCheckResult(
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, PrefHashStore::ValueState>::const_iterator result =
+ check_results_.find(path);
+ ASSERT_TRUE(result != check_results_.end());
+ ASSERT_EQ(PrefHashStore::CHANGED, result->second);
+
+ invalid_keys_results_.insert(std::make_pair(path, invalid_keys_result));
+}
+
PrefHashStore::ValueState MockPrefHashStore::CheckValue(
const std::string& path, const base::Value* value) const {
- checked_values_.insert(std::make_pair(path, value));
+ return RecordCheckValue(path, value,
+ PrefHashFilter::TRACKING_STRATEGY_ATOMIC);
+}
+
+void MockPrefHashStore::StoreHash(const std::string& path,
+ const base::Value* new_value) {
+ RecordStoreHash(path, new_value, PrefHashFilter::TRACKING_STRATEGY_ATOMIC);
+}
+PrefHashStore::ValueState MockPrefHashStore::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 = invalid_keys_results_.find(path);
+ if (invalid_keys_result != invalid_keys_results_.end()) {
+ invalid_keys->insert(invalid_keys->begin(),
+ invalid_keys_result->second.begin(),
+ invalid_keys_result->second.end());
+ }
+
+ return RecordCheckValue(path, initial_split_value,
+ PrefHashFilter::TRACKING_STRATEGY_SPLIT);
+}
+
+void MockPrefHashStore::StoreSplitHash(const std::string& path,
+ const base::DictionaryValue* new_value) {
+ RecordStoreHash(path, new_value, PrefHashFilter::TRACKING_STRATEGY_SPLIT);
+}
+
+PrefHashStore::ValueState MockPrefHashStore::RecordCheckValue(
+ const std::string& path,
+ const base::Value* value,
+ PrefHashFilter::PrefTrackingStrategy strategy) const {
+ // 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, PrefHashStore::ValueState>::const_iterator result =
check_results_.find(path);
if (result != check_results_.end())
@@ -104,16 +192,19 @@ PrefHashStore::ValueState MockPrefHashStore::CheckValue(
return PrefHashStore::UNCHANGED;
}
-void MockPrefHashStore::StoreHash(const std::string& path,
- const base::Value* new_value) {
- stored_values_.insert(std::make_pair(path, new_value));
+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);
}
// Creates a PrefHashFilter that uses a MockPrefHashStore. The
// MockPrefHashStore (owned by the PrefHashFilter) is returned in
// |mock_pref_hash_store|.
scoped_ptr<PrefHashFilter> CreatePrefHashFilter(
- PrefHashFilter::EnforcementLevel enforcement_level,
+ TrackedPreferenceHelper::EnforcementLevel enforcement_level,
MockPrefHashStore** mock_pref_hash_store) {
scoped_ptr<MockPrefHashStore> temp_mock_pref_hash_store(
new MockPrefHashStore);
@@ -127,7 +218,7 @@ scoped_ptr<PrefHashFilter> CreatePrefHashFilter(
}
class PrefHashFilterTest
- : public testing::TestWithParam<PrefHashFilter::EnforcementLevel> {
+ : public testing::TestWithParam<TrackedPreferenceHelper::EnforcementLevel> {
public:
PrefHashFilterTest() : mock_pref_hash_store_(NULL) {}
@@ -155,17 +246,33 @@ TEST_P(PrefHashFilterTest, EmptyAndUnchanged) {
// 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));
+ ASSERT_EQ(NULL, mock_pref_hash_store_->checked_value(
+ kTestTrackedPrefs[i].name).first);
}
}
-TEST_P(PrefHashFilterTest, FilterTrackedPrefUpdate) {
+TEST_P(PrefHashFilterTest, FilterAtomicPrefUpdate) {
base::StringValue string_value("string value");
- pref_hash_filter_->FilterUpdate(kTestPref, &string_value);
+ pref_hash_filter_->FilterUpdate(kAtomicPref, &string_value);
// One path should be stored.
ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
- ASSERT_EQ(&string_value, mock_pref_hash_store_->stored_value(kTestPref));
+ 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);
+}
+
+TEST_P(PrefHashFilterTest, FilterSplitPrefUpdate) {
+ base::DictionaryValue dict_value;
+ dict_value.SetString("a", "foo");
+ dict_value.SetInteger("b", 1234);
+ pref_hash_filter_->FilterUpdate(kSplitPref, &dict_value);
+ // One path should be stored.
+ 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);
}
TEST_P(PrefHashFilterTest, FilterUntrackedPrefUpdate) {
@@ -176,137 +283,257 @@ TEST_P(PrefHashFilterTest, FilterUntrackedPrefUpdate) {
}
TEST_P(PrefHashFilterTest, EmptyAndUnknown) {
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
+ 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(kTestPref,
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref,
+ PrefHashStore::TRUSTED_UNKNOWN_VALUE);
+ mock_pref_hash_store_->SetCheckResult(kSplitPref,
PrefHashStore::TRUSTED_UNKNOWN_VALUE);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
-
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref));
+ ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count());
+
+ 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);
}
TEST_P(PrefHashFilterTest, InitialValueUnknown) {
- // Ownership of this value is transfered to |pref_store_contents_|.
- base::Value* string_value = base::Value::CreateStringValue("test");
- pref_store_contents_.Set(kTestPref, string_value);
+ // 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);
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, NULL));
+ base::DictionaryValue* dict_value = new base::DictionaryValue;
+ dict_value->SetString("a", "foo");
+ dict_value->SetInteger("b", 1234);
+ pref_store_contents_.Set(kSplitPref, dict_value);
- mock_pref_hash_store_->SetCheckResult(kTestPref,
+ ASSERT_TRUE(pref_store_contents_.Get(kAtomicPref, NULL));
+ ASSERT_TRUE(pref_store_contents_.Get(kSplitPref, NULL));
+
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref,
+ PrefHashStore::UNTRUSTED_UNKNOWN_VALUE);
+ mock_pref_hash_store_->SetCheckResult(kSplitPref,
PrefHashStore::UNTRUSTED_UNKNOWN_VALUE);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
-
- if (GetParam() >= PrefHashFilter::ENFORCE_NO_SEEDING) {
- // Ensure the pref was cleared and the hash for NULL was restored if the
- // current enforcement level denies seeding.
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref));
+ ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count());
+
+ 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() >= TrackedPreferenceHelper::ENFORCE_NO_SEEDING) {
+ // 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);
} else {
- // Otherwise the value should have remained intact and the hash should have
- // been updated to match it.
- const base::Value* value_in_store;
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, &value_in_store));
- ASSERT_EQ(string_value, value_in_store);
- ASSERT_EQ(string_value, mock_pref_hash_store_->stored_value(kTestPref));
+ // 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);
}
}
TEST_P(PrefHashFilterTest, InitialValueTrustedUnknown) {
// Ownership of this value is transfered to |pref_store_contents_|.
base::Value* string_value = base::Value::CreateStringValue("test");
- pref_store_contents_.Set(kTestPref, 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(kTestPref, NULL));
+ ASSERT_TRUE(pref_store_contents_.Get(kAtomicPref, NULL));
+ ASSERT_TRUE(pref_store_contents_.Get(kSplitPref, NULL));
- mock_pref_hash_store_->SetCheckResult(kTestPref,
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref,
+ PrefHashStore::TRUSTED_UNKNOWN_VALUE);
+ mock_pref_hash_store_->SetCheckResult(kSplitPref,
PrefHashStore::TRUSTED_UNKNOWN_VALUE);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
+ ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count());
// Seeding is always allowed for trusted unknown values.
- const base::Value* value_in_store;
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, &value_in_store));
- ASSERT_EQ(string_value, value_in_store);
- ASSERT_EQ(string_value, mock_pref_hash_store_->stored_value(kTestPref));
+ 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 = base::Value::CreateIntegerValue(1234);
- pref_store_contents_.Set(kTestPref, int_value);
+ 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, PrefHashStore::CHANGED);
+ mock_pref_hash_store_->SetCheckResult(kSplitPref, PrefHashStore::CHANGED);
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, NULL));
+ 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);
- mock_pref_hash_store_->SetCheckResult(kTestPref, PrefHashStore::CHANGED);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
-
- if (GetParam() >= PrefHashFilter::ENFORCE) {
- // Ensure the pref was cleared and the hash for NULL was restored if the
- // current enforcement level prevents changes.
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref));
+ ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count());
+
+ 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() >= TrackedPreferenceHelper::ENFORCE) {
+ // 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);
} else {
// Otherwise the value should have remained intact and the hash should have
// been updated to match it.
- const base::Value* value_in_store;
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, &value_in_store));
- ASSERT_EQ(int_value, value_in_store);
- ASSERT_EQ(int_value, mock_pref_hash_store_->stored_value(kTestPref));
+ 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);
}
}
TEST_P(PrefHashFilterTest, EmptyCleared) {
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
- mock_pref_hash_store_->SetCheckResult(kTestPref, PrefHashStore::CLEARED);
+ ASSERT_FALSE(pref_store_contents_.Get(kAtomicPref, NULL));
+ ASSERT_FALSE(pref_store_contents_.Get(kSplitPref, NULL));
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref, PrefHashStore::CLEARED);
+ mock_pref_hash_store_->SetCheckResult(kSplitPref, PrefHashStore::CLEARED);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
- ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
+ ASSERT_EQ(2u, mock_pref_hash_store_->stored_paths_count());
// 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(kTestPref, NULL));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref));
+ 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, EmptyMigrated) {
+TEST_P(PrefHashFilterTest, InitialValueMigrated) {
+ // Only test atomic prefs, split prefs were introduce after the migration.
+
// Ownership of this value is transfered to |pref_store_contents_|.
base::ListValue* list_value = new base::ListValue;
list_value->Append(base::Value::CreateStringValue("test"));
- pref_store_contents_.Set(kTestPref, list_value);
+ pref_store_contents_.Set(kAtomicPref, list_value);
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, NULL));
+ ASSERT_TRUE(pref_store_contents_.Get(kAtomicPref, NULL));
- mock_pref_hash_store_->SetCheckResult(kTestPref, PrefHashStore::MIGRATED);
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref, PrefHashStore::MIGRATED);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths_count());
- if (GetParam() >= PrefHashFilter::ENFORCE_NO_SEEDING_NO_MIGRATION) {
+ MockPrefHashStore::ValuePtrStrategyPair stored_atomic_value =
+ mock_pref_hash_store_->stored_value(kAtomicPref);
+ ASSERT_EQ(PrefHashFilter::TRACKING_STRATEGY_ATOMIC,
+ stored_atomic_value.second);
+ if (GetParam() >= TrackedPreferenceHelper::ENFORCE_NO_SEEDING_NO_MIGRATION) {
// Ensure the pref was cleared and the hash for NULL was restored if the
// current enforcement level prevents migration.
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref));
+ ASSERT_FALSE(pref_store_contents_.Get(kAtomicPref, NULL));
+ ASSERT_EQ(NULL, stored_atomic_value.first);
} else {
// Otherwise the value should have remained intact and the hash should have
// been updated to match it.
- const base::Value* value_in_store;
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, &value_in_store));
- ASSERT_EQ(list_value, value_in_store);
- ASSERT_EQ(list_value, mock_pref_hash_store_->stored_value(kTestPref));
+ const base::Value* atomic_value_in_store;
+ ASSERT_TRUE(pref_store_contents_.Get(kAtomicPref, &atomic_value_in_store));
+ ASSERT_EQ(list_value, atomic_value_in_store);
+ ASSERT_EQ(list_value, stored_atomic_value.first);
}
}
@@ -315,51 +542,61 @@ TEST_P(PrefHashFilterTest, DontResetReportOnly) {
base::Value* int_value1 = base::Value::CreateIntegerValue(1);
base::Value* int_value2 = base::Value::CreateIntegerValue(2);
base::Value* report_only_val = base::Value::CreateIntegerValue(3);
- pref_store_contents_.Set(kTestPref, int_value1);
- pref_store_contents_.Set(kTestPref2, int_value2);
+ 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(kTestPref, NULL));
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref2, NULL));
+ 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(kTestPref, PrefHashStore::CHANGED);
- mock_pref_hash_store_->SetCheckResult(kTestPref2, PrefHashStore::CHANGED);
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref, PrefHashStore::CHANGED);
+ mock_pref_hash_store_->SetCheckResult(kAtomicPref2, PrefHashStore::CHANGED);
mock_pref_hash_store_->SetCheckResult(kReportOnlyPref,
PrefHashStore::CHANGED);
+ mock_pref_hash_store_->SetCheckResult(kReportOnlySplitPref,
+ PrefHashStore::CHANGED);
pref_hash_filter_->FilterOnLoad(&pref_store_contents_);
// All prefs should be checked and a new hash should be stored for each.
ASSERT_EQ(arraysize(kTestTrackedPrefs),
mock_pref_hash_store_->checked_paths_count());
- ASSERT_EQ(arraysize(kTestTrackedPrefs),
- mock_pref_hash_store_->stored_paths_count());
+ ASSERT_EQ(4u, mock_pref_hash_store_->stored_paths_count());
// 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));
+ 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) {
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref, NULL));
- ASSERT_FALSE(pref_store_contents_.Get(kTestPref2, NULL));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref));
- ASSERT_EQ(NULL, mock_pref_hash_store_->stored_value(kTestPref2));
+ if (GetParam() >= TrackedPreferenceHelper::ENFORCE) {
+ 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);
} else {
const base::Value* value_in_store;
const base::Value* value_in_store2;
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref, &value_in_store));
- ASSERT_TRUE(pref_store_contents_.Get(kTestPref2, &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(kTestPref));
+ 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(kTestPref2));
+ ASSERT_EQ(int_value2,
+ mock_pref_hash_store_->stored_value(kAtomicPref2).first);
}
}
// This is a hack to allow testing::Range to iterate over enum values in
-// PrefHashFilter::EnforcementLevel. This is required as
+// TrackedPreferenceHelper::EnforcementLevel. This is required as
// testing::internals::RangeGenerator used by testing::Range needs to be able
// to do |i = i + step| where i is an EnforcementLevel and |step| is 1 by
// default; |enum + 1| results in an |int| type, not an |enum|, and there is no
@@ -368,15 +605,16 @@ TEST_P(PrefHashFilterTest, DontResetReportOnly) {
// explicit cast in the overloaded operator+ below and makes |i = i + step| a
// valid statement.
class EnforcementLevelIncrement {};
-PrefHashFilter::EnforcementLevel operator+(
- PrefHashFilter::EnforcementLevel current_level,
+TrackedPreferenceHelper::EnforcementLevel operator+(
+ TrackedPreferenceHelper::EnforcementLevel current_level,
const EnforcementLevelIncrement& /* increment */) {
- return static_cast<PrefHashFilter::EnforcementLevel>(current_level + 1);
+ return static_cast<TrackedPreferenceHelper::EnforcementLevel>(
+ current_level + 1);
}
INSTANTIATE_TEST_CASE_P(
PrefEnforcementLevels, PrefHashFilterTest,
- testing::Range(PrefHashFilter::NO_ENFORCEMENT,
- static_cast<PrefHashFilter::EnforcementLevel>(
- PrefHashFilter::ENFORCE_ALL + 1),
+ testing::Range(TrackedPreferenceHelper::NO_ENFORCEMENT,
+ static_cast<TrackedPreferenceHelper::EnforcementLevel>(
+ TrackedPreferenceHelper::ENFORCE_ALL + 1),
EnforcementLevelIncrement()));

Powered by Google App Engine
This is Rietveld 408576698