OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include "base/bind.h" |
| 6 #include "base/callback.h" |
| 7 #include "base/prefs/public/pref_observer.h" |
5 #include "chrome/browser/prefs/pref_notifier_impl.h" | 8 #include "chrome/browser/prefs/pref_notifier_impl.h" |
6 #include "chrome/browser/prefs/pref_observer_mock.h" | 9 #include "chrome/browser/prefs/pref_observer_mock.h" |
7 #include "chrome/browser/prefs/pref_service.h" | 10 #include "chrome/browser/prefs/pref_service.h" |
8 #include "chrome/browser/prefs/pref_value_store.h" | 11 #include "chrome/browser/prefs/pref_value_store.h" |
9 #include "chrome/common/chrome_notification_types.h" | 12 #include "chrome/common/chrome_notification_types.h" |
10 #include "chrome/test/base/testing_pref_service.h" | 13 #include "chrome/test/base/testing_pref_service.h" |
11 #include "content/public/browser/notification_details.h" | |
12 #include "content/public/browser/notification_registrar.h" | |
13 #include "content/public/browser/notification_source.h" | |
14 #include "content/public/test/mock_notification_observer.h" | |
15 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
17 | 16 |
18 using testing::_; | 17 using testing::_; |
19 using testing::Field; | 18 using testing::Field; |
20 using testing::Invoke; | 19 using testing::Invoke; |
21 using testing::Mock; | 20 using testing::Mock; |
22 using testing::Truly; | 21 using testing::Truly; |
23 | 22 |
24 namespace { | 23 namespace { |
25 | 24 |
26 const char kChangedPref[] = "changed_pref"; | 25 const char kChangedPref[] = "changed_pref"; |
27 const char kUnchangedPref[] = "unchanged_pref"; | 26 const char kUnchangedPref[] = "unchanged_pref"; |
28 | 27 |
29 // Test PrefNotifier that allows tracking of observers and notifications. | 28 class MockPrefInitObserver { |
| 29 public: |
| 30 MOCK_METHOD1(OnInitializationCompleted, void(bool)); |
| 31 }; |
| 32 |
| 33 // This is an unmodified PrefNotifierImpl, except we make |
| 34 // OnPreferenceChanged public for tests. |
| 35 class TestingPrefNotifierImpl : public PrefNotifierImpl { |
| 36 public: |
| 37 TestingPrefNotifierImpl(PrefService* service) : PrefNotifierImpl(service) {} |
| 38 |
| 39 // Make public for tests. |
| 40 using PrefNotifierImpl::OnPreferenceChanged; |
| 41 }; |
| 42 |
| 43 // Mock PrefNotifier that allows tracking of observers and notifications. |
30 class MockPrefNotifier : public PrefNotifierImpl { | 44 class MockPrefNotifier : public PrefNotifierImpl { |
31 public: | 45 public: |
32 explicit MockPrefNotifier(PrefService* pref_service) | 46 explicit MockPrefNotifier(PrefService* pref_service) |
33 : PrefNotifierImpl(pref_service) {} | 47 : PrefNotifierImpl(pref_service) {} |
34 virtual ~MockPrefNotifier() {} | 48 virtual ~MockPrefNotifier() {} |
35 | 49 |
36 MOCK_METHOD1(FireObservers, void(const std::string& path)); | 50 MOCK_METHOD1(FireObservers, void(const std::string& path)); |
37 | 51 |
38 size_t CountObserver(const char* path, content::NotificationObserver* obs) { | 52 size_t CountObserver(const char* path, PrefObserver* obs) { |
39 PrefObserverMap::const_iterator observer_iterator = | 53 PrefObserverMap::const_iterator observer_iterator = |
40 pref_observers()->find(path); | 54 pref_observers()->find(path); |
41 if (observer_iterator == pref_observers()->end()) | 55 if (observer_iterator == pref_observers()->end()) |
42 return false; | 56 return false; |
43 | 57 |
44 NotificationObserverList* observer_list = observer_iterator->second; | 58 PrefObserverList* observer_list = observer_iterator->second; |
45 NotificationObserverList::Iterator it(*observer_list); | 59 PrefObserverList::Iterator it(*observer_list); |
46 content::NotificationObserver* existing_obs; | 60 PrefObserver* existing_obs; |
47 size_t count = 0; | 61 size_t count = 0; |
48 while ((existing_obs = it.GetNext()) != NULL) { | 62 while ((existing_obs = it.GetNext()) != NULL) { |
49 if (existing_obs == obs) | 63 if (existing_obs == obs) |
50 count++; | 64 count++; |
51 } | 65 } |
52 | 66 |
53 return count; | 67 return count; |
54 } | 68 } |
| 69 |
| 70 // Make public for tests below. |
| 71 using PrefNotifierImpl::OnPreferenceChanged; |
| 72 using PrefNotifierImpl::OnInitializationCompleted; |
55 }; | 73 }; |
56 | 74 |
57 // Test fixture class. | 75 // Test fixture class. |
58 class PrefNotifierTest : public testing::Test { | 76 class PrefNotifierTest : public testing::Test { |
59 protected: | 77 protected: |
60 virtual void SetUp() { | 78 virtual void SetUp() { |
61 pref_service_.RegisterBooleanPref(kChangedPref, | 79 pref_service_.RegisterBooleanPref(kChangedPref, |
62 true, | 80 true, |
63 PrefService::UNSYNCABLE_PREF); | 81 PrefService::UNSYNCABLE_PREF); |
64 pref_service_.RegisterBooleanPref(kUnchangedPref, | 82 pref_service_.RegisterBooleanPref(kUnchangedPref, |
65 true, | 83 true, |
66 PrefService::UNSYNCABLE_PREF); | 84 PrefService::UNSYNCABLE_PREF); |
67 } | 85 } |
68 | 86 |
69 TestingPrefService pref_service_; | 87 TestingPrefService pref_service_; |
70 | 88 |
71 PrefObserverMock obs1_; | 89 PrefObserverMock obs1_; |
72 PrefObserverMock obs2_; | 90 PrefObserverMock obs2_; |
73 }; | 91 }; |
74 | 92 |
75 TEST_F(PrefNotifierTest, OnPreferenceChanged) { | 93 TEST_F(PrefNotifierTest, OnPreferenceChanged) { |
76 MockPrefNotifier notifier(&pref_service_); | 94 MockPrefNotifier notifier(&pref_service_); |
77 EXPECT_CALL(notifier, FireObservers(kChangedPref)).Times(1); | 95 EXPECT_CALL(notifier, FireObservers(kChangedPref)).Times(1); |
78 notifier.OnPreferenceChanged(kChangedPref); | 96 notifier.OnPreferenceChanged(kChangedPref); |
79 } | 97 } |
80 | 98 |
81 TEST_F(PrefNotifierTest, OnInitializationCompleted) { | 99 TEST_F(PrefNotifierTest, OnInitializationCompleted) { |
82 MockPrefNotifier notifier(&pref_service_); | 100 MockPrefNotifier notifier(&pref_service_); |
83 content::MockNotificationObserver observer; | 101 MockPrefInitObserver observer; |
84 content::NotificationRegistrar registrar; | 102 notifier.AddInitObserver( |
85 registrar.Add(&observer, chrome::NOTIFICATION_PREF_INITIALIZATION_COMPLETED, | 103 base::Bind(&MockPrefInitObserver::OnInitializationCompleted, |
86 content::Source<PrefService>(&pref_service_)); | 104 base::Unretained(&observer))); |
87 EXPECT_CALL(observer, Observe( | 105 EXPECT_CALL(observer, OnInitializationCompleted(true)); |
88 int(chrome::NOTIFICATION_PREF_INITIALIZATION_COMPLETED), | |
89 content::Source<PrefService>(&pref_service_), | |
90 Property(&content::Details<bool>::ptr, testing::Pointee(true)))); | |
91 notifier.OnInitializationCompleted(true); | 106 notifier.OnInitializationCompleted(true); |
92 } | 107 } |
93 | 108 |
94 TEST_F(PrefNotifierTest, AddAndRemovePrefObservers) { | 109 TEST_F(PrefNotifierTest, AddAndRemovePrefObservers) { |
95 const char pref_name[] = "homepage"; | 110 const char pref_name[] = "homepage"; |
96 const char pref_name2[] = "proxy"; | 111 const char pref_name2[] = "proxy"; |
97 | 112 |
98 MockPrefNotifier notifier(&pref_service_); | 113 MockPrefNotifier notifier(&pref_service_); |
99 notifier.AddPrefObserver(pref_name, &obs1_); | 114 notifier.AddPrefObserver(pref_name, &obs1_); |
100 ASSERT_EQ(1u, notifier.CountObserver(pref_name, &obs1_)); | 115 ASSERT_EQ(1u, notifier.CountObserver(pref_name, &obs1_)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 ASSERT_EQ(0u, notifier.CountObserver(pref_name2, &obs2_)); | 163 ASSERT_EQ(0u, notifier.CountObserver(pref_name2, &obs2_)); |
149 | 164 |
150 notifier.RemovePrefObserver(pref_name2, &obs1_); | 165 notifier.RemovePrefObserver(pref_name2, &obs1_); |
151 ASSERT_EQ(0u, notifier.CountObserver(pref_name, &obs1_)); | 166 ASSERT_EQ(0u, notifier.CountObserver(pref_name, &obs1_)); |
152 ASSERT_EQ(0u, notifier.CountObserver(pref_name2, &obs1_)); | 167 ASSERT_EQ(0u, notifier.CountObserver(pref_name2, &obs1_)); |
153 ASSERT_EQ(0u, notifier.CountObserver(pref_name, &obs2_)); | 168 ASSERT_EQ(0u, notifier.CountObserver(pref_name, &obs2_)); |
154 ASSERT_EQ(0u, notifier.CountObserver(pref_name2, &obs2_)); | 169 ASSERT_EQ(0u, notifier.CountObserver(pref_name2, &obs2_)); |
155 } | 170 } |
156 | 171 |
157 TEST_F(PrefNotifierTest, FireObservers) { | 172 TEST_F(PrefNotifierTest, FireObservers) { |
158 base::FundamentalValue value_true(true); | 173 TestingPrefNotifierImpl notifier(&pref_service_); |
159 PrefNotifierImpl notifier(&pref_service_); | |
160 notifier.AddPrefObserver(kChangedPref, &obs1_); | 174 notifier.AddPrefObserver(kChangedPref, &obs1_); |
161 notifier.AddPrefObserver(kUnchangedPref, &obs1_); | 175 notifier.AddPrefObserver(kUnchangedPref, &obs1_); |
162 | 176 |
163 obs1_.Expect(&pref_service_, kChangedPref, &value_true); | 177 EXPECT_CALL(obs1_, OnPreferenceChanged(&pref_service_, kChangedPref)); |
164 EXPECT_CALL(obs2_, Observe(_, _, _)).Times(0); | 178 EXPECT_CALL(obs2_, OnPreferenceChanged(_, _)).Times(0); |
165 notifier.OnPreferenceChanged(kChangedPref); | 179 notifier.OnPreferenceChanged(kChangedPref); |
166 Mock::VerifyAndClearExpectations(&obs1_); | 180 Mock::VerifyAndClearExpectations(&obs1_); |
167 Mock::VerifyAndClearExpectations(&obs2_); | 181 Mock::VerifyAndClearExpectations(&obs2_); |
168 | 182 |
169 notifier.AddPrefObserver(kChangedPref, &obs2_); | 183 notifier.AddPrefObserver(kChangedPref, &obs2_); |
170 notifier.AddPrefObserver(kUnchangedPref, &obs2_); | 184 notifier.AddPrefObserver(kUnchangedPref, &obs2_); |
171 | 185 |
172 obs1_.Expect(&pref_service_, kChangedPref, &value_true); | 186 EXPECT_CALL(obs1_, OnPreferenceChanged(&pref_service_, kChangedPref)); |
173 obs2_.Expect(&pref_service_, kChangedPref, &value_true); | 187 EXPECT_CALL(obs2_, OnPreferenceChanged(&pref_service_, kChangedPref)); |
174 notifier.OnPreferenceChanged(kChangedPref); | 188 notifier.OnPreferenceChanged(kChangedPref); |
175 Mock::VerifyAndClearExpectations(&obs1_); | 189 Mock::VerifyAndClearExpectations(&obs1_); |
176 Mock::VerifyAndClearExpectations(&obs2_); | 190 Mock::VerifyAndClearExpectations(&obs2_); |
177 | 191 |
178 // Make sure removing an observer from one pref doesn't affect anything else. | 192 // Make sure removing an observer from one pref doesn't affect anything else. |
179 notifier.RemovePrefObserver(kChangedPref, &obs1_); | 193 notifier.RemovePrefObserver(kChangedPref, &obs1_); |
180 | 194 |
181 EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0); | 195 EXPECT_CALL(obs1_, OnPreferenceChanged(_, _)).Times(0); |
182 obs2_.Expect(&pref_service_, kChangedPref, &value_true); | 196 EXPECT_CALL(obs2_, OnPreferenceChanged(&pref_service_, kChangedPref)); |
183 notifier.OnPreferenceChanged(kChangedPref); | 197 notifier.OnPreferenceChanged(kChangedPref); |
184 Mock::VerifyAndClearExpectations(&obs1_); | 198 Mock::VerifyAndClearExpectations(&obs1_); |
185 Mock::VerifyAndClearExpectations(&obs2_); | 199 Mock::VerifyAndClearExpectations(&obs2_); |
186 | 200 |
187 // Make sure removing an observer entirely doesn't affect anything else. | 201 // Make sure removing an observer entirely doesn't affect anything else. |
188 notifier.RemovePrefObserver(kUnchangedPref, &obs1_); | 202 notifier.RemovePrefObserver(kUnchangedPref, &obs1_); |
189 | 203 |
190 EXPECT_CALL(obs1_, Observe(_, _, _)).Times(0); | 204 EXPECT_CALL(obs1_, OnPreferenceChanged(_, _)).Times(0); |
191 obs2_.Expect(&pref_service_, kChangedPref, &value_true); | 205 EXPECT_CALL(obs2_, OnPreferenceChanged(&pref_service_, kChangedPref)); |
192 notifier.OnPreferenceChanged(kChangedPref); | 206 notifier.OnPreferenceChanged(kChangedPref); |
193 Mock::VerifyAndClearExpectations(&obs1_); | 207 Mock::VerifyAndClearExpectations(&obs1_); |
194 Mock::VerifyAndClearExpectations(&obs2_); | 208 Mock::VerifyAndClearExpectations(&obs2_); |
195 | 209 |
196 notifier.RemovePrefObserver(kChangedPref, &obs2_); | 210 notifier.RemovePrefObserver(kChangedPref, &obs2_); |
197 notifier.RemovePrefObserver(kUnchangedPref, &obs2_); | 211 notifier.RemovePrefObserver(kUnchangedPref, &obs2_); |
198 } | 212 } |
199 | 213 |
200 } // namespace | 214 } // namespace |
OLD | NEW |