OLD | NEW |
| (Empty) |
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/common/chrome_notification_types.h" | |
6 #include "chrome/common/pref_names.h" | |
7 #include "chrome/browser/api/prefs/pref_change_registrar.h" | |
8 #include "chrome/test/base/testing_pref_service.h" | |
9 #include "content/public/browser/notification_details.h" | |
10 #include "content/public/browser/notification_source.h" | |
11 #include "content/public/browser/notification_types.h" | |
12 #include "content/public/test/mock_notification_observer.h" | |
13 #include "testing/gmock/include/gmock/gmock.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 | |
16 using testing::Mock; | |
17 using testing::Eq; | |
18 | |
19 namespace { | |
20 | |
21 // A mock provider that allows us to capture pref observer changes. | |
22 class MockPrefService : public TestingPrefService { | |
23 public: | |
24 MockPrefService() {} | |
25 virtual ~MockPrefService() {} | |
26 | |
27 MOCK_METHOD2(AddPrefObserver, | |
28 void(const char*, content::NotificationObserver*)); | |
29 MOCK_METHOD2(RemovePrefObserver, | |
30 void(const char*, content::NotificationObserver*)); | |
31 }; | |
32 | |
33 } // namespace | |
34 | |
35 class PrefChangeRegistrarTest : public testing::Test { | |
36 public: | |
37 PrefChangeRegistrarTest() {} | |
38 virtual ~PrefChangeRegistrarTest() {} | |
39 | |
40 protected: | |
41 virtual void SetUp(); | |
42 | |
43 content::NotificationObserver* observer() const { return observer_.get(); } | |
44 MockPrefService* service() const { return service_.get(); } | |
45 | |
46 private: | |
47 scoped_ptr<MockPrefService> service_; | |
48 scoped_ptr<content::MockNotificationObserver> observer_; | |
49 }; | |
50 | |
51 void PrefChangeRegistrarTest::SetUp() { | |
52 service_.reset(new MockPrefService()); | |
53 observer_.reset(new content::MockNotificationObserver()); | |
54 } | |
55 | |
56 TEST_F(PrefChangeRegistrarTest, AddAndRemove) { | |
57 PrefChangeRegistrar registrar; | |
58 registrar.Init(service()); | |
59 | |
60 // Test adding. | |
61 EXPECT_CALL(*service(), | |
62 AddPrefObserver(Eq(std::string("test.pref.1")), observer())); | |
63 EXPECT_CALL(*service(), | |
64 AddPrefObserver(Eq(std::string("test.pref.2")), observer())); | |
65 registrar.Add("test.pref.1", observer()); | |
66 registrar.Add("test.pref.2", observer()); | |
67 EXPECT_FALSE(registrar.IsEmpty()); | |
68 | |
69 // Test removing. | |
70 Mock::VerifyAndClearExpectations(service()); | |
71 EXPECT_CALL(*service(), | |
72 RemovePrefObserver(Eq(std::string("test.pref.1")), observer())); | |
73 EXPECT_CALL(*service(), | |
74 RemovePrefObserver(Eq(std::string("test.pref.2")), observer())); | |
75 registrar.Remove("test.pref.1", observer()); | |
76 registrar.Remove("test.pref.2", observer()); | |
77 EXPECT_TRUE(registrar.IsEmpty()); | |
78 | |
79 // Explicitly check the expectations now to make sure that the Removes | |
80 // worked (rather than the registrar destructor doing the work). | |
81 Mock::VerifyAndClearExpectations(service()); | |
82 } | |
83 | |
84 TEST_F(PrefChangeRegistrarTest, AutoRemove) { | |
85 PrefChangeRegistrar registrar; | |
86 registrar.Init(service()); | |
87 | |
88 // Setup of auto-remove. | |
89 EXPECT_CALL(*service(), | |
90 AddPrefObserver(Eq(std::string("test.pref.1")), observer())); | |
91 registrar.Add("test.pref.1", observer()); | |
92 Mock::VerifyAndClearExpectations(service()); | |
93 EXPECT_FALSE(registrar.IsEmpty()); | |
94 | |
95 // Test auto-removing. | |
96 EXPECT_CALL(*service(), | |
97 RemovePrefObserver(Eq(std::string("test.pref.1")), observer())); | |
98 } | |
99 | |
100 TEST_F(PrefChangeRegistrarTest, RemoveAll) { | |
101 PrefChangeRegistrar registrar; | |
102 registrar.Init(service()); | |
103 | |
104 EXPECT_CALL(*service(), | |
105 AddPrefObserver(Eq(std::string("test.pref.1")), observer())); | |
106 EXPECT_CALL(*service(), | |
107 AddPrefObserver(Eq(std::string("test.pref.2")), observer())); | |
108 registrar.Add("test.pref.1", observer()); | |
109 registrar.Add("test.pref.2", observer()); | |
110 Mock::VerifyAndClearExpectations(service()); | |
111 | |
112 EXPECT_CALL(*service(), | |
113 RemovePrefObserver(Eq(std::string("test.pref.1")), observer())); | |
114 EXPECT_CALL(*service(), | |
115 RemovePrefObserver(Eq(std::string("test.pref.2")), observer())); | |
116 registrar.RemoveAll(); | |
117 EXPECT_TRUE(registrar.IsEmpty()); | |
118 | |
119 // Explicitly check the expectations now to make sure that the RemoveAll | |
120 // worked (rather than the registrar destructor doing the work). | |
121 Mock::VerifyAndClearExpectations(service()); | |
122 } | |
123 | |
124 class ObserveSetOfPreferencesTest : public testing::Test { | |
125 public: | |
126 virtual void SetUp() { | |
127 pref_service_.reset(new TestingPrefService); | |
128 pref_service_->RegisterStringPref(prefs::kHomePage, | |
129 "http://google.com", | |
130 PrefService::UNSYNCABLE_PREF); | |
131 pref_service_->RegisterBooleanPref(prefs::kHomePageIsNewTabPage, | |
132 false, | |
133 PrefService::UNSYNCABLE_PREF); | |
134 pref_service_->RegisterStringPref(prefs::kApplicationLocale, | |
135 "", | |
136 PrefService::UNSYNCABLE_PREF); | |
137 } | |
138 | |
139 PrefChangeRegistrar* CreatePrefChangeRegistrar( | |
140 content::NotificationObserver* observer) { | |
141 PrefChangeRegistrar* pref_set = new PrefChangeRegistrar(); | |
142 pref_set->Init(pref_service_.get()); | |
143 pref_set->Add(prefs::kHomePage, observer); | |
144 pref_set->Add(prefs::kHomePageIsNewTabPage, observer); | |
145 return pref_set; | |
146 } | |
147 | |
148 scoped_ptr<TestingPrefService> pref_service_; | |
149 }; | |
150 | |
151 TEST_F(ObserveSetOfPreferencesTest, IsObserved) { | |
152 scoped_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar(NULL)); | |
153 EXPECT_TRUE(pref_set->IsObserved(prefs::kHomePage)); | |
154 EXPECT_TRUE(pref_set->IsObserved(prefs::kHomePageIsNewTabPage)); | |
155 EXPECT_FALSE(pref_set->IsObserved(prefs::kApplicationLocale)); | |
156 } | |
157 | |
158 TEST_F(ObserveSetOfPreferencesTest, IsManaged) { | |
159 scoped_ptr<PrefChangeRegistrar> pref_set(CreatePrefChangeRegistrar(NULL)); | |
160 EXPECT_FALSE(pref_set->IsManaged()); | |
161 pref_service_->SetManagedPref(prefs::kHomePage, | |
162 Value::CreateStringValue("http://crbug.com")); | |
163 EXPECT_TRUE(pref_set->IsManaged()); | |
164 pref_service_->SetManagedPref(prefs::kHomePageIsNewTabPage, | |
165 Value::CreateBooleanValue(true)); | |
166 EXPECT_TRUE(pref_set->IsManaged()); | |
167 pref_service_->RemoveManagedPref(prefs::kHomePage); | |
168 EXPECT_TRUE(pref_set->IsManaged()); | |
169 pref_service_->RemoveManagedPref(prefs::kHomePageIsNewTabPage); | |
170 EXPECT_FALSE(pref_set->IsManaged()); | |
171 } | |
172 | |
173 MATCHER_P(PrefNameDetails, name, "details references named preference") { | |
174 std::string* pstr = | |
175 reinterpret_cast<const content::Details<std::string>&>(arg).ptr(); | |
176 return pstr && *pstr == name; | |
177 } | |
178 | |
179 TEST_F(ObserveSetOfPreferencesTest, Observe) { | |
180 using testing::_; | |
181 using testing::Mock; | |
182 | |
183 content::MockNotificationObserver observer; | |
184 scoped_ptr<PrefChangeRegistrar> pref_set( | |
185 CreatePrefChangeRegistrar(&observer)); | |
186 | |
187 EXPECT_CALL(observer, | |
188 Observe(int(chrome::NOTIFICATION_PREF_CHANGED), | |
189 content::Source<PrefService>(pref_service_.get()), | |
190 PrefNameDetails(prefs::kHomePage))); | |
191 pref_service_->SetUserPref(prefs::kHomePage, | |
192 Value::CreateStringValue("http://crbug.com")); | |
193 Mock::VerifyAndClearExpectations(&observer); | |
194 | |
195 EXPECT_CALL(observer, | |
196 Observe(int(chrome::NOTIFICATION_PREF_CHANGED), | |
197 content::Source<PrefService>(pref_service_.get()), | |
198 PrefNameDetails(prefs::kHomePageIsNewTabPage))); | |
199 pref_service_->SetUserPref(prefs::kHomePageIsNewTabPage, | |
200 Value::CreateBooleanValue(true)); | |
201 Mock::VerifyAndClearExpectations(&observer); | |
202 | |
203 EXPECT_CALL(observer, Observe(_, _, _)).Times(0); | |
204 pref_service_->SetUserPref(prefs::kApplicationLocale, | |
205 Value::CreateStringValue("en_US.utf8")); | |
206 Mock::VerifyAndClearExpectations(&observer); | |
207 } | |
OLD | NEW |