• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/prefs/pref_change_registrar.h"
6 #include "chrome/test/testing_pref_service.h"
7 #include "content/common/notification_details.h"
8 #include "content/common/notification_observer_mock.h"
9 #include "content/common/notification_source.h"
10 #include "content/common/notification_type.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 
14 using testing::Mock;
15 using testing::Eq;
16 
17 namespace {
18 
19 // A mock provider that allows us to capture pref observer changes.
20 class MockPrefService : public TestingPrefService {
21  public:
MockPrefService()22   MockPrefService() {}
~MockPrefService()23   virtual ~MockPrefService() {}
24 
25   MOCK_METHOD2(AddPrefObserver, void(const char*, NotificationObserver*));
26   MOCK_METHOD2(RemovePrefObserver, void(const char*, NotificationObserver*));
27 };
28 
29 }  // namespace
30 
31 class PrefChangeRegistrarTest : public testing::Test {
32  public:
PrefChangeRegistrarTest()33   PrefChangeRegistrarTest() {}
~PrefChangeRegistrarTest()34   virtual ~PrefChangeRegistrarTest() {}
35 
36  protected:
37   virtual void SetUp();
38 
observer() const39   NotificationObserver* observer() const { return observer_.get(); }
service() const40   MockPrefService* service() const { return service_.get(); }
41 
42  private:
43   scoped_ptr<MockPrefService> service_;
44   scoped_ptr<NotificationObserverMock> observer_;
45 };
46 
SetUp()47 void PrefChangeRegistrarTest::SetUp() {
48   service_.reset(new MockPrefService());
49   observer_.reset(new NotificationObserverMock());
50 }
51 
TEST_F(PrefChangeRegistrarTest,AddAndRemove)52 TEST_F(PrefChangeRegistrarTest, AddAndRemove) {
53   PrefChangeRegistrar registrar;
54   registrar.Init(service());
55 
56   // Test adding.
57   EXPECT_CALL(*service(),
58               AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
59   EXPECT_CALL(*service(),
60               AddPrefObserver(Eq(std::string("test.pref.2")), observer()));
61   registrar.Add("test.pref.1", observer());
62   registrar.Add("test.pref.2", observer());
63   EXPECT_FALSE(registrar.IsEmpty());
64 
65   // Test removing.
66   Mock::VerifyAndClearExpectations(service());
67   EXPECT_CALL(*service(),
68               RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
69   EXPECT_CALL(*service(),
70               RemovePrefObserver(Eq(std::string("test.pref.2")), observer()));
71   registrar.Remove("test.pref.1", observer());
72   registrar.Remove("test.pref.2", observer());
73   EXPECT_TRUE(registrar.IsEmpty());
74 
75   // Explicitly check the expectations now to make sure that the Removes
76   // worked (rather than the registrar destructor doing the work).
77   Mock::VerifyAndClearExpectations(service());
78 }
79 
TEST_F(PrefChangeRegistrarTest,AutoRemove)80 TEST_F(PrefChangeRegistrarTest, AutoRemove) {
81   PrefChangeRegistrar registrar;
82   registrar.Init(service());
83 
84   // Setup of auto-remove.
85   EXPECT_CALL(*service(),
86               AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
87   registrar.Add("test.pref.1", observer());
88   Mock::VerifyAndClearExpectations(service());
89   EXPECT_FALSE(registrar.IsEmpty());
90 
91   // Test auto-removing.
92   EXPECT_CALL(*service(),
93               RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
94 }
95 
TEST_F(PrefChangeRegistrarTest,RemoveAll)96 TEST_F(PrefChangeRegistrarTest, RemoveAll) {
97   PrefChangeRegistrar registrar;
98   registrar.Init(service());
99 
100   EXPECT_CALL(*service(),
101               AddPrefObserver(Eq(std::string("test.pref.1")), observer()));
102   EXPECT_CALL(*service(),
103               AddPrefObserver(Eq(std::string("test.pref.2")), observer()));
104   registrar.Add("test.pref.1", observer());
105   registrar.Add("test.pref.2", observer());
106   Mock::VerifyAndClearExpectations(service());
107 
108   EXPECT_CALL(*service(),
109               RemovePrefObserver(Eq(std::string("test.pref.1")), observer()));
110   EXPECT_CALL(*service(),
111               RemovePrefObserver(Eq(std::string("test.pref.2")), observer()));
112   registrar.RemoveAll();
113   EXPECT_TRUE(registrar.IsEmpty());
114 
115   // Explicitly check the expectations now to make sure that the RemoveAll
116   // worked (rather than the registrar destructor doing the work).
117   Mock::VerifyAndClearExpectations(service());
118 }
119