blob: 49ac7295a2ab754245242f3b9fd22856c87850f1 [file] [log] [blame]
[email protected]4dad9ad82009-11-25 20:47:521// Copyright (c) 2009 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]ecde2742010-04-02 17:36:185#include <string>
6
[email protected]3184cba42009-05-15 01:25:297#include "app/test/data/resource.h"
[email protected]ecde2742010-04-02 17:36:188#include "base/scoped_ptr.h"
9#include "base/values.h"
[email protected]277404c22010-04-22 13:09:4510#include "chrome/browser/dummy_pref_store.h"
[email protected]052313b2010-02-19 09:43:0811#include "chrome/browser/pref_service.h"
[email protected]d8b08c92010-06-07 13:13:2812#include "chrome/browser/pref_value_store.h"
initial.commit09911bf2008-07-26 23:55:2913#include "chrome/common/chrome_paths.h"
[email protected]ecde2742010-04-02 17:36:1814#include "chrome/common/notification_observer_mock.h"
initial.commit09911bf2008-07-26 23:55:2915#include "chrome/common/notification_service.h"
[email protected]bfd04a62009-02-01 18:16:5616#include "chrome/common/notification_type.h"
initial.commit09911bf2008-07-26 23:55:2917#include "chrome/common/pref_names.h"
[email protected]ecde2742010-04-02 17:36:1818#include "testing/gmock/include/gmock/gmock.h"
initial.commit09911bf2008-07-26 23:55:2919#include "testing/gtest/include/gtest/gtest.h"
20
[email protected]ecde2742010-04-02 17:36:1821using testing::_;
22using testing::Mock;
23using testing::Pointee;
24using testing::Property;
25
initial.commit09911bf2008-07-26 23:55:2926class TestPrefObserver : public NotificationObserver {
27 public:
28 TestPrefObserver(const PrefService* prefs, const std::wstring& pref_name,
29 const std::wstring& new_pref_value)
30 : observer_fired_(false),
31 prefs_(prefs),
32 pref_name_(pref_name),
33 new_pref_value_(new_pref_value) {
34 }
35 virtual ~TestPrefObserver() {}
36
37 virtual void Observe(NotificationType type,
38 const NotificationSource& source,
39 const NotificationDetails& details) {
[email protected]bfd04a62009-02-01 18:16:5640 EXPECT_EQ(type.value, NotificationType::PREF_CHANGED);
initial.commit09911bf2008-07-26 23:55:2941 PrefService* prefs_in = Source<PrefService>(source).ptr();
42 EXPECT_EQ(prefs_in, prefs_);
43 std::wstring* pref_name_in = Details<std::wstring>(details).ptr();
44 EXPECT_EQ(*pref_name_in, pref_name_);
45 EXPECT_EQ(new_pref_value_, prefs_in->GetString(L"homepage"));
46 observer_fired_ = true;
47 }
48
49 bool observer_fired() { return observer_fired_; }
50
51 void Reset(const std::wstring& new_pref_value) {
52 observer_fired_ = false;
53 new_pref_value_ = new_pref_value;
54 }
55
56 private:
57 bool observer_fired_;
58 const PrefService* prefs_;
59 const std::wstring pref_name_;
60 std::wstring new_pref_value_;
61};
62
[email protected]7aa0a962010-04-21 17:24:4263// TODO(port): port this test to POSIX.
64#if defined(OS_WIN)
[email protected]277404c22010-04-22 13:09:4565TEST(PrefServiceTest, LocalizedPrefs) {
[email protected]d8b08c92010-06-07 13:13:2866 PrefService prefs(new PrefValueStore(NULL, new DummyPrefStore(), NULL));
[email protected]7aa0a962010-04-21 17:24:4267 const wchar_t kBoolean[] = L"boolean";
68 const wchar_t kInteger[] = L"integer";
69 const wchar_t kString[] = L"string";
70 prefs.RegisterLocalizedBooleanPref(kBoolean, IDS_LOCALE_BOOL);
71 prefs.RegisterLocalizedIntegerPref(kInteger, IDS_LOCALE_INT);
72 prefs.RegisterLocalizedStringPref(kString, IDS_LOCALE_STRING);
73
74 // The locale default should take preference over the user default.
75 EXPECT_FALSE(prefs.GetBoolean(kBoolean));
76 EXPECT_EQ(1, prefs.GetInteger(kInteger));
77 EXPECT_EQ(L"hello", prefs.GetString(kString));
78
79 prefs.SetBoolean(kBoolean, true);
80 EXPECT_TRUE(prefs.GetBoolean(kBoolean));
81 prefs.SetInteger(kInteger, 5);
82 EXPECT_EQ(5, prefs.GetInteger(kInteger));
83 prefs.SetString(kString, L"foo");
84 EXPECT_EQ(L"foo", prefs.GetString(kString));
85}
86#endif
87
[email protected]277404c22010-04-22 13:09:4588TEST(PrefServiceTest, NoObserverFire) {
[email protected]d8b08c92010-06-07 13:13:2889 PrefService prefs(new PrefValueStore(NULL, new DummyPrefStore(), NULL));
[email protected]7aa0a962010-04-21 17:24:4290
91 const wchar_t pref_name[] = L"homepage";
92 prefs.RegisterStringPref(pref_name, L"");
93
94 const std::wstring new_pref_value(L"http://www.google.com/");
95 TestPrefObserver obs(&prefs, pref_name, new_pref_value);
96 prefs.AddPrefObserver(pref_name, &obs);
97 // This should fire the checks in TestPrefObserver::Observe.
98 prefs.SetString(pref_name, new_pref_value);
99
100 // Make sure the observer was actually fired.
101 EXPECT_TRUE(obs.observer_fired());
102
103 // Setting the pref to the same value should not set the pref value a second
104 // time.
105 obs.Reset(new_pref_value);
106 prefs.SetString(pref_name, new_pref_value);
107 EXPECT_FALSE(obs.observer_fired());
108
109 // Clearing the pref should cause the pref to fire.
110 obs.Reset(L"");
111 prefs.ClearPref(pref_name);
112 EXPECT_TRUE(obs.observer_fired());
113
114 // Clearing the pref again should not cause the pref to fire.
115 obs.Reset(L"");
116 prefs.ClearPref(pref_name);
117 EXPECT_FALSE(obs.observer_fired());
118
119 // Ok, clean up.
120 prefs.RemovePrefObserver(pref_name, &obs);
121}
122
[email protected]277404c22010-04-22 13:09:45123TEST(PrefServiceTest, HasPrefPath) {
[email protected]d8b08c92010-06-07 13:13:28124 PrefService prefs(new PrefValueStore(NULL, new DummyPrefStore(), NULL));
[email protected]7aa0a962010-04-21 17:24:42125
126 const wchar_t path[] = L"fake.path";
127
128 // Shouldn't initially have a path.
129 EXPECT_FALSE(prefs.HasPrefPath(path));
130
131 // Register the path. This doesn't set a value, so the path still shouldn't
132 // exist.
133 prefs.RegisterStringPref(path, std::wstring());
134 EXPECT_FALSE(prefs.HasPrefPath(path));
135
136 // Set a value and make sure we have a path.
137 prefs.SetString(path, L"blah");
138 EXPECT_TRUE(prefs.HasPrefPath(path));
139}
140
[email protected]277404c22010-04-22 13:09:45141TEST(PrefServiceTest, Observers) {
142 const wchar_t pref_name[] = L"homepage";
143
144 DictionaryValue* dict = new DictionaryValue();
145 dict->SetString(pref_name, std::wstring(L"http://www.cnn.com"));
146 DummyPrefStore* pref_store = new DummyPrefStore();
[email protected]d8b08c92010-06-07 13:13:28147 pref_store->set_prefs(dict);
148 PrefService prefs(new PrefValueStore(NULL, pref_store, NULL));
[email protected]277404c22010-04-22 13:09:45149 prefs.RegisterStringPref(pref_name, L"");
150
151 const std::wstring new_pref_value(L"http://www.google.com/");
152 TestPrefObserver obs(&prefs, pref_name, new_pref_value);
153 prefs.AddPrefObserver(pref_name, &obs);
154 // This should fire the checks in TestPrefObserver::Observe.
155 prefs.SetString(pref_name, new_pref_value);
156
157 // Make sure the tests were actually run.
158 EXPECT_TRUE(obs.observer_fired());
159
160 // Now try adding a second pref observer.
161 const std::wstring new_pref_value2(L"http://www.youtube.com/");
162 obs.Reset(new_pref_value2);
163 TestPrefObserver obs2(&prefs, pref_name, new_pref_value2);
164 prefs.AddPrefObserver(pref_name, &obs2);
165 // This should fire the checks in obs and obs2.
166 prefs.SetString(pref_name, new_pref_value2);
167 EXPECT_TRUE(obs.observer_fired());
168 EXPECT_TRUE(obs2.observer_fired());
169
170 // Make sure obs2 still works after removing obs.
171 prefs.RemovePrefObserver(pref_name, &obs);
172 obs.Reset(L"");
173 obs2.Reset(new_pref_value);
174 // This should only fire the observer in obs2.
175 prefs.SetString(pref_name, new_pref_value);
176 EXPECT_FALSE(obs.observer_fired());
177 EXPECT_TRUE(obs2.observer_fired());
178
179 // Ok, clean up.
180 prefs.RemovePrefObserver(pref_name, &obs2);
181}
182
[email protected]ecde2742010-04-02 17:36:18183class PrefServiceSetValueTest : public testing::Test {
184 protected:
185 static const wchar_t name_[];
186 static const wchar_t value_[];
187
188 PrefServiceSetValueTest()
[email protected]d8b08c92010-06-07 13:13:28189 : prefs_(new PrefValueStore(NULL, new DummyPrefStore(), NULL)),
[email protected]ecde2742010-04-02 17:36:18190 name_string_(name_),
191 null_value_(Value::CreateNullValue()) {}
192
193 void SetExpectNoNotification() {
194 EXPECT_CALL(observer_, Observe(_, _, _)).Times(0);
195 }
196
197 void SetExpectPrefChanged() {
198 EXPECT_CALL(observer_,
199 Observe(NotificationType(NotificationType::PREF_CHANGED), _,
200 Property(&Details<std::wstring>::ptr,
201 Pointee(name_string_))));
202 }
203
204 PrefService prefs_;
205 std::wstring name_string_;
206 scoped_ptr<Value> null_value_;
207 NotificationObserverMock observer_;
208};
209const wchar_t PrefServiceSetValueTest::name_[] = L"name";
210const wchar_t PrefServiceSetValueTest::value_[] = L"value";
211
212TEST_F(PrefServiceSetValueTest, SetStringValue) {
213 const wchar_t default_string[] = L"default";
214 scoped_ptr<Value> default_value(Value::CreateStringValue(default_string));
215 prefs_.RegisterStringPref(name_, default_string);
216 prefs_.AddPrefObserver(name_, &observer_);
217 SetExpectNoNotification();
218 prefs_.Set(name_, *default_value);
219 Mock::VerifyAndClearExpectations(&observer_);
220
221 scoped_ptr<Value> new_value(Value::CreateStringValue(value_));
222 SetExpectPrefChanged();
223 prefs_.Set(name_, *new_value);
224 EXPECT_EQ(value_, prefs_.GetString(name_));
225
226 prefs_.RemovePrefObserver(name_, &observer_);
227}
228
229TEST_F(PrefServiceSetValueTest, SetDictionaryValue) {
230 prefs_.RegisterDictionaryPref(name_);
231 prefs_.AddPrefObserver(name_, &observer_);
232
233 SetExpectNoNotification();
234 prefs_.Set(name_, *null_value_);
235 Mock::VerifyAndClearExpectations(&observer_);
236
237 DictionaryValue new_value;
238 new_value.SetString(name_, value_);
239 SetExpectPrefChanged();
240 prefs_.Set(name_, new_value);
241 Mock::VerifyAndClearExpectations(&observer_);
242 DictionaryValue* dict = prefs_.GetMutableDictionary(name_);
243 EXPECT_EQ(1U, dict->size());
244 std::wstring out_value;
245 dict->GetString(name_, &out_value);
246 EXPECT_EQ(value_, out_value);
247
248 SetExpectNoNotification();
249 prefs_.Set(name_, new_value);
250 Mock::VerifyAndClearExpectations(&observer_);
251
252 SetExpectPrefChanged();
253 prefs_.Set(name_, *null_value_);
254 Mock::VerifyAndClearExpectations(&observer_);
255 dict = prefs_.GetMutableDictionary(name_);
256 EXPECT_EQ(0U, dict->size());
257
258 prefs_.RemovePrefObserver(name_, &observer_);
259}
260
261TEST_F(PrefServiceSetValueTest, SetListValue) {
262 prefs_.RegisterListPref(name_);
263 prefs_.AddPrefObserver(name_, &observer_);
264
265 SetExpectNoNotification();
266 prefs_.Set(name_, *null_value_);
267 Mock::VerifyAndClearExpectations(&observer_);
268
269 ListValue new_value;
270 new_value.Append(Value::CreateStringValue(value_));
271 SetExpectPrefChanged();
272 prefs_.Set(name_, new_value);
273 Mock::VerifyAndClearExpectations(&observer_);
274 ListValue* list = prefs_.GetMutableList(name_);
275 ASSERT_EQ(1U, list->GetSize());
276 std::wstring out_value;
277 list->GetString(0, &out_value);
278 EXPECT_EQ(value_, out_value);
279
280 SetExpectNoNotification();
281 prefs_.Set(name_, new_value);
282 Mock::VerifyAndClearExpectations(&observer_);
283
284 SetExpectPrefChanged();
285 prefs_.Set(name_, *null_value_);
286 Mock::VerifyAndClearExpectations(&observer_);
287 list = prefs_.GetMutableList(name_);
288 EXPECT_EQ(0U, list->GetSize());
289
290 prefs_.RemovePrefObserver(name_, &observer_);
291}