// 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/pref_change_registrar.h" #include "chrome/test/testing_pref_service.h" #include "content/common/notification_details.h" #include "content/common/notification_observer_mock.h" #include "content/common/notification_source.h" #include "content/common/notification_type.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using testing::Mock; using testing::Eq; namespace { // A mock provider that allows us to capture pref observer changes. class MockPrefService : public TestingPrefService { public: MockPrefService() {} virtual ~MockPrefService() {} MOCK_METHOD2(AddPrefObserver, void(const char*, NotificationObserver*)); MOCK_METHOD2(RemovePrefObserver, void(const char*, NotificationObserver*)); }; } // namespace class PrefChangeRegistrarTest : public testing::Test { public: PrefChangeRegistrarTest() {} virtual ~PrefChangeRegistrarTest() {} protected: virtual void SetUp(); NotificationObserver* observer() const { return observer_.get(); } MockPrefService* service() const { return service_.get(); } private: scoped_ptr<MockPrefService> service_; scoped_ptr<NotificationObserverMock> observer_; }; void PrefChangeRegistrarTest::SetUp() { service_.reset(new MockPrefService()); observer_.reset(new NotificationObserverMock()); } TEST_F(PrefChangeRegistrarTest, AddAndRemove) { PrefChangeRegistrar registrar; registrar.Init(service()); // Test adding. EXPECT_CALL(*service(), AddPrefObserver(Eq(std::string("test.pref.1")), observer())); EXPECT_CALL(*service(), AddPrefObserver(Eq(std::string("test.pref.2")), observer())); registrar.Add("test.pref.1", observer()); registrar.Add("test.pref.2", observer()); EXPECT_FALSE(registrar.IsEmpty()); // Test removing. Mock::VerifyAndClearExpectations(service()); EXPECT_CALL(*service(), RemovePrefObserver(Eq(std::string("test.pref.1")), observer())); EXPECT_CALL(*service(), RemovePrefObserver(Eq(std::string("test.pref.2")), observer())); registrar.Remove("test.pref.1", observer()); registrar.Remove("test.pref.2", observer()); EXPECT_TRUE(registrar.IsEmpty()); // Explicitly check the expectations now to make sure that the Removes // worked (rather than the registrar destructor doing the work). Mock::VerifyAndClearExpectations(service()); } TEST_F(PrefChangeRegistrarTest, AutoRemove) { PrefChangeRegistrar registrar; registrar.Init(service()); // Setup of auto-remove. EXPECT_CALL(*service(), AddPrefObserver(Eq(std::string("test.pref.1")), observer())); registrar.Add("test.pref.1", observer()); Mock::VerifyAndClearExpectations(service()); EXPECT_FALSE(registrar.IsEmpty()); // Test auto-removing. EXPECT_CALL(*service(), RemovePrefObserver(Eq(std::string("test.pref.1")), observer())); } TEST_F(PrefChangeRegistrarTest, RemoveAll) { PrefChangeRegistrar registrar; registrar.Init(service()); EXPECT_CALL(*service(), AddPrefObserver(Eq(std::string("test.pref.1")), observer())); EXPECT_CALL(*service(), AddPrefObserver(Eq(std::string("test.pref.2")), observer())); registrar.Add("test.pref.1", observer()); registrar.Add("test.pref.2", observer()); Mock::VerifyAndClearExpectations(service()); EXPECT_CALL(*service(), RemovePrefObserver(Eq(std::string("test.pref.1")), observer())); EXPECT_CALL(*service(), RemovePrefObserver(Eq(std::string("test.pref.2")), observer())); registrar.RemoveAll(); EXPECT_TRUE(registrar.IsEmpty()); // Explicitly check the expectations now to make sure that the RemoveAll // worked (rather than the registrar destructor doing the work). Mock::VerifyAndClearExpectations(service()); }