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

Unified Diff: services/preferences/public/cpp/tests/pref_observer_store_unittest.cc

Issue 2092453002: Mojom interface for Preferences (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use new wrapper types Created 4 years, 5 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: services/preferences/public/cpp/tests/pref_observer_store_unittest.cc
diff --git a/services/preferences/public/cpp/tests/pref_observer_store_unittest.cc b/services/preferences/public/cpp/tests/pref_observer_store_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a6aa55769b8f4a84c77d489583b4063ac3592f10
--- /dev/null
+++ b/services/preferences/public/cpp/tests/pref_observer_store_unittest.cc
@@ -0,0 +1,222 @@
+// Copyright 2016 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 "services/preferences/public/cpp/pref_observer_store.h"
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
+#include "base/values.h"
+#include "components/prefs/pref_store_observer_mock.h"
+#include "services/preferences/public/interfaces/preferences.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+// Test implmentation of prefs::mojom::PreferenceManager which simply tracks
+// calls. Allows for testing to be done in process, without mojo IPC.
+class TestPreferenceManager : public prefs::mojom::PreferenceManager {
+ public:
+ TestPreferenceManager()
+ : add_observer_called_(false), set_preferences_called_(false) {}
+ ~TestPreferenceManager() override {}
+
+ bool add_observer_called() { return add_observer_called_; }
+ const std::set<std::string>& last_preference_set() {
+ return last_preference_set_;
+ }
+ bool set_preferences_called() { return set_preferences_called_; }
+
+ // prefs::mojom::TestPreferenceManager:
+ void AddObserver(const std::vector<std::string>& preferences,
+ prefs::mojom::PreferenceObserverPtr client) override;
+ void SetPreferences(
+ std::unordered_map<std::string, prefs::mojom::PreferencePtr> preferences)
+ override;
+
+ private:
+ bool add_observer_called_;
+ std::set<std::string> last_preference_set_;
+ bool set_preferences_called_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestPreferenceManager);
+};
+
+void TestPreferenceManager::AddObserver(
+ const std::vector<std::string>& preferences,
+ prefs::mojom::PreferenceObserverPtr client) {
+ add_observer_called_ = true;
+ last_preference_set_.clear();
+ last_preference_set_.insert(preferences.begin(), preferences.end());
+}
+
+void TestPreferenceManager::SetPreferences(
+ std::unordered_map<std::string, prefs::mojom::PreferencePtr> preferences) {
+ set_preferences_called_ = true;
+}
+
+} // namespace
+
+class PrefObserverStoreTest : public testing::Test {
+ public:
+ PrefObserverStoreTest() {}
+ ~PrefObserverStoreTest() override {}
+
+ TestPreferenceManager* manager() { return &manager_; }
+ PrefStoreObserverMock* observer() { return &observer_; }
+ PrefObserverStore* store() { return store_.get(); }
+
+ bool Initialized() { return store_->initialized_; }
+ void OnPreferencesChanged(
+ std::unordered_map<std::string, prefs::mojom::PreferencePtr>
+ preferences) {
+ store_->OnPreferencesChanged(std::move(preferences));
+ }
+
+ // testing::Test:
+ void SetUp() override;
+ void TearDown() override;
+
+ private:
+ scoped_refptr<PrefObserverStore> store_;
+ TestPreferenceManager manager_;
+ PrefStoreObserverMock observer_;
+ // Required by mojo binding code within PrefObserverStore.
+ base::MessageLoop message_loop_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrefObserverStoreTest);
+};
+
+void PrefObserverStoreTest::SetUp() {
+ store_ = new PrefObserverStore(nullptr);
+ store_->AddObserver(&observer_);
+ store_->prefs_manager_ = &manager_;
+}
+
+void PrefObserverStoreTest::TearDown() {
+ store_->RemoveObserver(&observer_);
+}
+
+// Tests that observers are notified upon the completion of initialization, and
+// that values become available.
+TEST_F(PrefObserverStoreTest, Initialization) {
+ std::set<std::string> keys;
+ const std::string key("hey");
+ keys.insert(key);
+ store()->Init(keys);
+
+ EXPECT_FALSE(Initialized());
+ EXPECT_FALSE(observer()->initialized);
+
+ const int kValue = 42;
+ prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
+ pref->type = prefs::mojom::Preference::PreferenceType::INT;
+ pref->integer_value_ = kValue;
+ std::unordered_map<std::string, prefs::mojom::PreferencePtr> pref_map;
+ pref_map.emplace(std::make_pair(key, std::move(pref)));
+
+ // PreferenceManager notifies of PreferencesChanged, completing
+ // initialization.
+ OnPreferencesChanged(std::move(pref_map));
+ EXPECT_TRUE(Initialized());
+ EXPECT_TRUE(observer()->initialized);
+ EXPECT_TRUE(observer()->initialization_success);
+ observer()->VerifyAndResetChangedKey(key);
+
+ const base::Value* value = nullptr;
+ int actual_value;
+ EXPECT_TRUE(store()->GetValue(key, &value));
+ EXPECT_NE(nullptr, value);
+ EXPECT_TRUE(value->GetAsInteger(&actual_value));
+ EXPECT_EQ(kValue, actual_value);
+ EXPECT_FALSE(manager()->set_preferences_called());
+}
+
+// Tests that values set silently are also set on the preference manager, but
+// that no observers are notified.
+TEST_F(PrefObserverStoreTest, SetValueSilently) {
+ std::set<std::string> keys;
+ const std::string key("hey");
+ keys.insert(key);
+ store()->Init(keys);
+
+ const int kValue = 42;
+ store()->SetValueSilently(
+ key, base::WrapUnique(new base::FundamentalValue(kValue)), 0);
+ EXPECT_TRUE(manager()->set_preferences_called());
+ EXPECT_TRUE(observer()->changed_keys.empty());
+}
+
+// Test that reporting values changed notifies observers, but not the preference
+// manager.
+TEST_F(PrefObserverStoreTest, ReportValueChanged) {
+ std::set<std::string> keys;
+ const std::string key("hey");
+ keys.insert(key);
+ store()->Init(keys);
+
+ store()->ReportValueChanged(key, 0);
+ EXPECT_FALSE(manager()->set_preferences_called());
+ observer()->VerifyAndResetChangedKey(key);
+}
+
+// Test that when initialized with multiple keys, that observers receive a
+// notification for each key.
+TEST_F(PrefObserverStoreTest, MultipleKeyInitialization) {
+ std::set<std::string> keys;
+ const std::string key1("hey");
+ const std::string key2("listen");
+ keys.insert(key1);
+ keys.insert(key2);
+ store()->Init(keys);
+
+ EXPECT_FALSE(Initialized());
+ EXPECT_FALSE(observer()->initialized);
+
+ const int kValue = 42;
+ prefs::mojom::PreferencePtr pref1 = prefs::mojom::Preference::New();
+ pref1->type = prefs::mojom::Preference::PreferenceType::INT;
+ pref1->integer_value_ = kValue;
+
+ const std::string kStringValue("look");
+ prefs::mojom::PreferencePtr pref2 = prefs::mojom::Preference::New();
+ pref2->type = prefs::mojom::Preference::PreferenceType::STRING;
+ pref2->string_value_ = kStringValue;
+
+ std::unordered_map<std::string, prefs::mojom::PreferencePtr> pref_map;
+ pref_map.emplace(std::make_pair(key1, std::move(pref1)));
+ pref_map.emplace(std::make_pair(key2, std::move(pref2)));
+
+ // The observer should be notified of all keys set.
+ OnPreferencesChanged(std::move(pref_map));
+ EXPECT_TRUE(Initialized());
+ EXPECT_TRUE(observer()->initialized);
+ EXPECT_EQ(2u, observer()->changed_keys.size());
+ EXPECT_NE(observer()->changed_keys.end(),
+ std::find(observer()->changed_keys.begin(),
+ observer()->changed_keys.end(), key1));
+ EXPECT_NE(observer()->changed_keys.end(),
+ std::find(observer()->changed_keys.begin(),
+ observer()->changed_keys.end(), key2));
+}
+
+// Tests that if OnPreferencesChanged is received with invalid keys, that they
+// are ignored.
+TEST_F(PrefObserverStoreTest, InvalidInitialization) {
+ std::set<std::string> keys;
+ const std::string key("hey");
+ keys.insert(key);
+ store()->Init(keys);
+
+ const std::string kInvalidKey("look");
+ const int kValue = 42;
+ prefs::mojom::PreferencePtr pref = prefs::mojom::Preference::New();
+ pref->type = prefs::mojom::Preference::PreferenceType::INT;
+ pref->integer_value_ = kValue;
+ std::unordered_map<std::string, prefs::mojom::PreferencePtr> pref_map;
+ pref_map.emplace(std::make_pair(kInvalidKey, std::move(pref)));
+
+ OnPreferencesChanged(std::move(pref_map));
+ EXPECT_TRUE(observer()->changed_keys.empty());
+}

Powered by Google App Engine
This is Rietveld 408576698