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

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

Issue 5441002: Clean up pref change notification handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix extension prefs breakage Created 10 years 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
« no previous file with comments | « chrome/browser/prefs/pref_notifier_impl_unittest.cc ('k') | chrome/browser/prefs/pref_observer_mock.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/prefs/pref_notifier_unittest.cc
diff --git a/chrome/browser/prefs/pref_notifier_unittest.cc b/chrome/browser/prefs/pref_notifier_unittest.cc
deleted file mode 100644
index 2fe455532133e3140a27f3f27f15f47f4f9fd52c..0000000000000000000000000000000000000000
--- a/chrome/browser/prefs/pref_notifier_unittest.cc
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright (c) 2010 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/in_memory_pref_store.h"
-#include "chrome/browser/prefs/pref_notifier.h"
-#include "chrome/browser/prefs/pref_service.h"
-#include "chrome/browser/prefs/pref_value_store.h"
-#include "chrome/common/notification_observer.h"
-#include "chrome/common/notification_type.h"
-#include "chrome/common/notification_service.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-
-namespace {
-
-const char kChangedPref[] = "changed_pref";
-const char kUnchangedPref[] = "unchanged_pref";
-
-bool DetailsAreChangedPref(const Details<std::string>& details) {
- std::string* string_in = Details<std::string>(details).ptr();
- return strcmp(string_in->c_str(), kChangedPref) == 0;
-}
-
-// Test PrefNotifier that allows tracking of observers and notifications.
-class MockPrefNotifier : public PrefNotifier {
- public:
- MockPrefNotifier(PrefService* prefs, PrefValueStore* value_store)
- : PrefNotifier(prefs, value_store) {}
-
- virtual ~MockPrefNotifier() {}
-
- MOCK_METHOD1(FireObservers, void(const char* path));
-
- void RealFireObservers(const char* path) {
- PrefNotifier::FireObservers(path);
- }
-
- size_t CountObserver(const char* path, NotificationObserver* obs) {
- PrefObserverMap::const_iterator observer_iterator =
- pref_observers()->find(path);
- if (observer_iterator == pref_observers()->end())
- return false;
-
- NotificationObserverList* observer_list = observer_iterator->second;
- NotificationObserverList::Iterator it(*observer_list);
- NotificationObserver* existing_obs;
- size_t count = 0;
- while ((existing_obs = it.GetNext()) != NULL) {
- if (existing_obs == obs)
- count++;
- }
-
- return count;
- }
-};
-
-// Mock PrefValueStore that has no unnecessary PrefStores and injects a simpler
-// PrefHasChanged().
-class MockPrefValueStore : public PrefValueStore {
- public:
- MockPrefValueStore()
- : PrefValueStore(NULL, NULL, NULL, NULL, NULL, NULL,
- new InMemoryPrefStore(), NULL) {}
-
- virtual ~MockPrefValueStore() {}
-
- // This mock version returns true if the pref path starts with "changed".
- virtual bool PrefHasChanged(const char* path,
- PrefNotifier::PrefStoreType new_store) {
- std::string path_str(path);
- if (path_str.compare(0, 7, "changed") == 0)
- return true;
- return false;
- }
-};
-
-// Mock PrefService that allows the PrefNotifier to be injected.
-class MockPrefService : public PrefService {
- public:
- explicit MockPrefService(PrefValueStore* pref_value_store)
- : PrefService(pref_value_store) {}
-
- void SetPrefNotifier(PrefNotifier* notifier) {
- pref_notifier_.reset(notifier);
- }
-};
-
-// Mock PrefObserver that verifies notifications.
-class MockPrefObserver : public NotificationObserver {
- public:
- virtual ~MockPrefObserver() {}
-
- MOCK_METHOD3(Observe, void(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details));
-};
-
-// Test fixture class.
-class PrefNotifierTest : public testing::Test {
- protected:
- virtual void SetUp() {
- value_store_ = new MockPrefValueStore;
- pref_service_.reset(new MockPrefService(value_store_));
- notifier_ = new MockPrefNotifier(pref_service_.get(), value_store_);
- pref_service_->SetPrefNotifier(notifier_);
-
- pref_service_->RegisterBooleanPref(kChangedPref, true);
- pref_service_->RegisterBooleanPref(kUnchangedPref, true);
- }
-
- // The PrefService takes ownership of the PrefValueStore and PrefNotifier.
- PrefValueStore* value_store_;
- MockPrefNotifier* notifier_;
- scoped_ptr<MockPrefService> pref_service_;
-
- MockPrefObserver obs1_;
- MockPrefObserver obs2_;
-};
-
-TEST_F(PrefNotifierTest, OnPreferenceSet) {
- EXPECT_CALL(*notifier_, FireObservers(kChangedPref))
- .Times(PrefNotifier::PREF_STORE_TYPE_MAX + 1);
- EXPECT_CALL(*notifier_, FireObservers(kUnchangedPref)).Times(0);
-
- for (size_t i = 0; i <= PrefNotifier::PREF_STORE_TYPE_MAX; ++i) {
- notifier_->OnPreferenceSet(kChangedPref,
- static_cast<PrefNotifier::PrefStoreType>(i));
- notifier_->OnPreferenceSet(kUnchangedPref,
- static_cast<PrefNotifier::PrefStoreType>(i));
- }
-}
-
-TEST_F(PrefNotifierTest, OnUserPreferenceSet) {
- EXPECT_CALL(*notifier_, FireObservers(kChangedPref));
- EXPECT_CALL(*notifier_, FireObservers(kUnchangedPref)).Times(0);
- notifier_->OnUserPreferenceSet(kChangedPref);
- notifier_->OnUserPreferenceSet(kUnchangedPref);
-}
-
-TEST_F(PrefNotifierTest, AddAndRemovePrefObservers) {
- const char pref_name[] = "homepage";
- const char pref_name2[] = "proxy";
-
- notifier_->AddPrefObserver(pref_name, &obs1_);
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-
- // Re-adding the same observer for the same pref doesn't change anything.
- // Skip this in debug mode, since it hits a DCHECK and death tests aren't
- // thread-safe.
-#if defined(NDEBUG)
- notifier_->AddPrefObserver(pref_name, &obs1_);
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-#endif // NDEBUG
-
- // Ensure that we can add the same observer to a different pref.
- notifier_->AddPrefObserver(pref_name2, &obs1_);
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-
- // Ensure that we can add another observer to the same pref.
- notifier_->AddPrefObserver(pref_name, &obs2_);
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-
- // Ensure that we can remove all observers, and that removing a non-existent
- // observer is harmless.
- notifier_->RemovePrefObserver(pref_name, &obs1_);
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-
- notifier_->RemovePrefObserver(pref_name, &obs2_);
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-
- notifier_->RemovePrefObserver(pref_name, &obs1_);
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(1u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-
- notifier_->RemovePrefObserver(pref_name2, &obs1_);
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs1_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name, &obs2_));
- ASSERT_EQ(0u, notifier_->CountObserver(pref_name2, &obs2_));
-}
-
-TEST_F(PrefNotifierTest, FireObservers) {
- using testing::_;
- using testing::Field;
- using testing::Invoke;
- using testing::Mock;
- using testing::Truly;
-
- // Tell googlemock to pass calls to the mock's "back door" too.
- ON_CALL(*notifier_, FireObservers(_))
- .WillByDefault(Invoke(notifier_, &MockPrefNotifier::RealFireObservers));
- EXPECT_CALL(*notifier_, FireObservers(kChangedPref)).Times(4);
- EXPECT_CALL(*notifier_, FireObservers(kUnchangedPref)).Times(0);
-
- notifier_->AddPrefObserver(kChangedPref, &obs1_);
- notifier_->AddPrefObserver(kUnchangedPref, &obs1_);
-
- EXPECT_CALL(obs1_, Observe(
- Field(&NotificationType::value, NotificationType::PREF_CHANGED),
- Source<PrefService>(pref_service_.get()),
- Truly(DetailsAreChangedPref)));
- EXPECT_CALL(obs2_, Observe(_, _, _)).Times(0);
- notifier_->OnUserPreferenceSet(kChangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0);
- EXPECT_CALL(obs2_, Observe(_, _, _)).Times(0);
- notifier_->OnUserPreferenceSet(kUnchangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- notifier_->AddPrefObserver(kChangedPref, &obs2_);
- notifier_->AddPrefObserver(kUnchangedPref, &obs2_);
-
- EXPECT_CALL(obs1_, Observe(
- Field(&NotificationType::value, NotificationType::PREF_CHANGED),
- Source<PrefService>(pref_service_.get()),
- Truly(DetailsAreChangedPref)));
- EXPECT_CALL(obs2_, Observe(
- Field(&NotificationType::value, NotificationType::PREF_CHANGED),
- Source<PrefService>(pref_service_.get()),
- Truly(DetailsAreChangedPref)));
- notifier_->OnUserPreferenceSet(kChangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0);
- EXPECT_CALL(obs2_, Observe(_, _, _)).Times(0);
- notifier_->OnUserPreferenceSet(kUnchangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- // Make sure removing an observer from one pref doesn't affect anything else.
- notifier_->RemovePrefObserver(kChangedPref, &obs1_);
-
- EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0);
- EXPECT_CALL(obs2_, Observe(
- Field(&NotificationType::value, NotificationType::PREF_CHANGED),
- Source<PrefService>(pref_service_.get()),
- Truly(DetailsAreChangedPref)));
- notifier_->OnUserPreferenceSet(kChangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0);
- EXPECT_CALL(obs2_, Observe(_, _, _)).Times(0);
- notifier_->OnUserPreferenceSet(kUnchangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- // Make sure removing an observer entirely doesn't affect anything else.
- notifier_->RemovePrefObserver(kUnchangedPref, &obs1_);
-
- EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0);
- EXPECT_CALL(obs2_, Observe(
- Field(&NotificationType::value, NotificationType::PREF_CHANGED),
- Source<PrefService>(pref_service_.get()),
- Truly(DetailsAreChangedPref)));
- notifier_->OnUserPreferenceSet(kChangedPref);
- Mock::VerifyAndClearExpectations(&obs1_);
- Mock::VerifyAndClearExpectations(&obs2_);
-
- EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0);
- EXPECT_CALL(obs2_, Observe(_, _, _)).Times(0);
- notifier_->OnUserPreferenceSet(kUnchangedPref);
-
- notifier_->RemovePrefObserver(kChangedPref, &obs2_);
- notifier_->RemovePrefObserver(kUnchangedPref, &obs2_);
-}
-
-} // namespace
« no previous file with comments | « chrome/browser/prefs/pref_notifier_impl_unittest.cc ('k') | chrome/browser/prefs/pref_observer_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698