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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d26fe705e56b6dbcd4a4cdbf7cb64f726fe24fce |
--- /dev/null |
+++ b/chrome/browser/prefs/pref_hash_filter_unittest.cc |
@@ -0,0 +1,226 @@ |
+// 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/pref_hash_filter.h" |
+ |
+#include <map> |
+#include <set> |
+#include <string> |
+#include <utility> |
+ |
+#include "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/values.h" |
+#include "chrome/browser/prefs/pref_hash_store.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+// A PrefHashStore that allows simulation of CheckValue results and captures |
+// checked and stored values. |
+class MockPrefHashStore : public PrefHashStore { |
+ public: |
+ static const char kNullPlaceholder[]; |
+ |
+ MockPrefHashStore() {} |
+ |
+ // Set the result that will be returned when |path| is passed to |CheckValue|. |
+ void SetCheckResult(const std::string& path, |
+ PrefHashStore::ValueState result); |
+ |
+ // Returns paths that have been passed to |CheckValue|. |
+ const std::set<std::string>& checked_paths() const { |
+ return checked_paths_; |
+ } |
+ |
+ // Returns paths that have been passed to |StoreHash|. |
+ const std::set<std::string>& stored_paths() const { |
+ return stored_paths_; |
+ } |
+ |
+ // Returns the value that was passed to |CheckValue| for |path|, rendered to a |
+ // string. If the checked value was NULL, the string is kNullPlaceholder. |
+ std::string checked_value(const std::string& path) const { |
+ std::map<std::string, std::string>::iterator value = |
+ checked_values_.find(path); |
+ if (value != checked_values_.end()) |
+ return value->second; |
+ return std::string("No checked value."); |
+ } |
+ |
+ // Returns the value that was passed to |StoreHash| for |path|, rendered to a |
+ // string. If the stored value was NULL, the string is kNullPlaceholder. |
+ std::string stored_value(const std::string& path) const { |
+ std::map<std::string, std::string>::const_iterator value = |
+ stored_values_.find(path); |
+ if (value != stored_values_.end()) |
+ return value->second; |
+ return std::string("No stored value."); |
+ } |
+ |
+ // PrefHashStore implementation. |
+ virtual PrefHashStore::ValueState CheckValue( |
+ const std::string& path, const base::Value* value) const OVERRIDE; |
+ virtual void StoreHash(const std::string& path, |
+ const base::Value* new_value) OVERRIDE; |
+ |
+ private: |
+ std::map<std::string, PrefHashStore::ValueState> check_results_; |
+ mutable std::set<std::string> checked_paths_; |
+ std::set<std::string> stored_paths_; |
+ mutable std::map<std::string, std::string> checked_values_; |
+ std::map<std::string, std::string> stored_values_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockPrefHashStore); |
+}; |
+ |
+const char MockPrefHashStore::kNullPlaceholder[] = "NULL"; |
+ |
+void MockPrefHashStore::SetCheckResult( |
+ const std::string& path, PrefHashStore::ValueState result) { |
+ check_results_.insert(std::make_pair(path, result)); |
+} |
+ |
+PrefHashStore::ValueState MockPrefHashStore::CheckValue( |
+ const std::string& path, const base::Value* value) const { |
+ EXPECT_TRUE(checked_paths_.insert(path).second); |
+ std::string as_string = kNullPlaceholder; |
+ if (value) |
+ EXPECT_TRUE(value->GetAsString(&as_string)); |
+ |
+ checked_values_.insert(std::make_pair(path, as_string)); |
+ std::map<std::string, PrefHashStore::ValueState>::const_iterator result = |
+ check_results_.find(path); |
+ if (result != check_results_.end()) |
+ return result->second; |
+ return PrefHashStore::UNCHANGED; |
+} |
+ |
+void MockPrefHashStore::StoreHash(const std::string& path, |
+ const base::Value* new_value) { |
+ std::string as_string = kNullPlaceholder; |
+ if (new_value) |
+ EXPECT_TRUE(new_value->GetAsString(&as_string)); |
+ stored_paths_.insert(path); |
+ stored_values_.insert(std::make_pair(path, as_string)); |
+} |
+ |
+// Creates a PrefHashFilter that uses a MockPrefHashStore. The |
+// MockPrefHashStore (owned by the PrefHashFilter) is returned in |
+// |mock_pref_hash_store|. |
+scoped_ptr<PrefHashFilter> CreatePrefHashFilter( |
+ MockPrefHashStore** mock_pref_hash_store) { |
+ scoped_ptr<MockPrefHashStore> temp_mock_pref_hash_store( |
+ new MockPrefHashStore); |
+ if (mock_pref_hash_store) |
+ *mock_pref_hash_store = temp_mock_pref_hash_store.get(); |
+ return scoped_ptr<PrefHashFilter>( |
+ new PrefHashFilter(temp_mock_pref_hash_store.PassAs<PrefHashStore>())); |
+} |
+ |
+class PrefHashFilterTest : public testing::Test { |
+ public: |
+ PrefHashFilterTest() : mock_pref_hash_store_(NULL) {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ // Capture the name of one tracked pref. |
+ MockPrefHashStore* temp_hash_store = NULL; |
+ scoped_ptr<PrefHashFilter> temp_filter = |
+ CreatePrefHashFilter(&temp_hash_store); |
+ temp_filter->FilterOnLoad(&pref_store_contents_); |
+ ASSERT_FALSE(temp_hash_store->checked_paths().empty()); |
+ tracked_path_ = *temp_hash_store->checked_paths().begin(); |
+ |
+ // Construct a PrefHashFilter and MockPrefHashStore for the test. |
+ pref_hash_filter_ = CreatePrefHashFilter(&mock_pref_hash_store_); |
+ } |
+ |
+ protected: |
+ std::string tracked_path_; |
+ MockPrefHashStore* mock_pref_hash_store_; |
+ base::DictionaryValue pref_store_contents_; |
+ scoped_ptr<PrefHashFilter> pref_hash_filter_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PrefHashFilterTest); |
+}; |
+ |
+TEST_F(PrefHashFilterTest, EmptyAndUnchanged) { |
+ pref_hash_filter_->FilterOnLoad(&pref_store_contents_); |
+ // More than 0 paths checked. |
+ ASSERT_LT(0u, mock_pref_hash_store_->checked_paths().size()); |
+ // No paths stored, since they all return |UNCHANGED|. |
+ ASSERT_EQ(0u, mock_pref_hash_store_->stored_paths().size()); |
+ // Since there was nothing in |pref_store_contents_| the checked value should |
+ // have been NULL. |
+ ASSERT_EQ(MockPrefHashStore::kNullPlaceholder, |
+ mock_pref_hash_store_->checked_value(tracked_path_)); |
+} |
+ |
+TEST_F(PrefHashFilterTest, FilterUpdate) { |
+ base::StringValue string_value("string value"); |
+ pref_hash_filter_->FilterUpdate(tracked_path_, &string_value); |
+ // One path should be stored. |
+ ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths().size()); |
+ ASSERT_EQ(tracked_path_, *mock_pref_hash_store_->stored_paths().begin()); |
+ ASSERT_EQ("string value", mock_pref_hash_store_->stored_value(tracked_path_)); |
+} |
+ |
+TEST_F(PrefHashFilterTest, EmptyAndUnknown){ |
+ mock_pref_hash_store_->SetCheckResult(tracked_path_, |
+ PrefHashStore::UNKNOWN_VALUE); |
+ pref_hash_filter_->FilterOnLoad(&pref_store_contents_); |
+ ASSERT_LT(0u, mock_pref_hash_store_->checked_paths().size()); |
+ ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths().size()); |
+ ASSERT_EQ(tracked_path_, *mock_pref_hash_store_->stored_paths().begin()); |
+ ASSERT_EQ(MockPrefHashStore::kNullPlaceholder, |
+ mock_pref_hash_store_->stored_value(tracked_path_)); |
+} |
+ |
+TEST_F(PrefHashFilterTest, InitialValueUnknown) { |
+ pref_store_contents_.Set(tracked_path_, |
+ new base::StringValue("string value")); |
+ |
+ mock_pref_hash_store_->SetCheckResult(tracked_path_, |
+ PrefHashStore::UNKNOWN_VALUE); |
+ pref_hash_filter_->FilterOnLoad(&pref_store_contents_); |
+ ASSERT_LT(0u, mock_pref_hash_store_->checked_paths().size()); |
+ ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths().size()); |
+ ASSERT_EQ(tracked_path_, *mock_pref_hash_store_->stored_paths().begin()); |
+ ASSERT_EQ("string value", mock_pref_hash_store_->stored_value(tracked_path_)); |
+} |
+ |
+TEST_F(PrefHashFilterTest, InitialValueChanged) { |
+ pref_store_contents_.Set(tracked_path_, |
+ new base::StringValue("string value")); |
+ |
+ mock_pref_hash_store_->SetCheckResult(tracked_path_, |
+ PrefHashStore::CHANGED); |
+ pref_hash_filter_->FilterOnLoad(&pref_store_contents_); |
+ ASSERT_LT(0u, mock_pref_hash_store_->checked_paths().size()); |
+ ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths().size()); |
+ ASSERT_EQ(tracked_path_, *mock_pref_hash_store_->stored_paths().begin()); |
+ ASSERT_EQ("string value", mock_pref_hash_store_->stored_value(tracked_path_)); |
+} |
+ |
+TEST_F(PrefHashFilterTest, EmptyCleared) { |
+ mock_pref_hash_store_->SetCheckResult(tracked_path_, |
+ PrefHashStore::CLEARED); |
+ pref_hash_filter_->FilterOnLoad(&pref_store_contents_); |
+ ASSERT_LT(0u, mock_pref_hash_store_->checked_paths().size()); |
+ ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths().size()); |
+ ASSERT_EQ(tracked_path_, *mock_pref_hash_store_->stored_paths().begin()); |
+ ASSERT_EQ(MockPrefHashStore::kNullPlaceholder, |
+ mock_pref_hash_store_->stored_value(tracked_path_)); |
+} |
+ |
+TEST_F(PrefHashFilterTest, EmptyMigrated) { |
+ mock_pref_hash_store_->SetCheckResult(tracked_path_, |
+ PrefHashStore::MIGRATED); |
+ pref_hash_filter_->FilterOnLoad(&pref_store_contents_); |
+ ASSERT_LT(0u, mock_pref_hash_store_->checked_paths().size()); |
+ ASSERT_EQ(1u, mock_pref_hash_store_->stored_paths().size()); |
+ ASSERT_EQ(tracked_path_, *mock_pref_hash_store_->stored_paths().begin()); |
+ ASSERT_EQ(MockPrefHashStore::kNullPlaceholder, |
+ mock_pref_hash_store_->stored_value(tracked_path_)); |
+} |