blob: ae14598d6e569adc5bb5f2644619674388dd53a6 [file] [log] [blame]
[email protected]d8b08c92010-06-07 13:13:281// 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
[email protected]d8b08c92010-06-07 13:13:285#include "base/scoped_ptr.h"
[email protected]61f972b2010-08-04 15:31:386#include "base/utf_string_conversions.h"
[email protected]d8b08c92010-06-07 13:13:287#include "base/values.h"
[email protected]61f972b2010-08-04 15:31:388#include "chrome/browser/configuration_policy_pref_store.h"
[email protected]d8b08c92010-06-07 13:13:289#include "chrome/browser/dummy_pref_store.h"
10#include "chrome/browser/pref_value_store.h"
[email protected]d8b08c92010-06-07 13:13:2811#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14using testing::_;
15using testing::Mock;
16
17// Names of the preferences used in this test program.
18namespace prefs {
[email protected]db198b22010-07-12 16:48:4919 const wchar_t kCurrentThemeID[] = L"extensions.theme.id";
[email protected]d8b08c92010-06-07 13:13:2820 const wchar_t kDeleteCache[] = L"browser.clear_data.cache";
[email protected]d8b08c92010-06-07 13:13:2821 const wchar_t kHomepage[] = L"homepage";
[email protected]db198b22010-07-12 16:48:4922 const wchar_t kMaxTabs[] = L"tabs.max_tabs";
[email protected]d8b08c92010-06-07 13:13:2823 const wchar_t kMissingPref[] = L"this.pref.does_not_exist";
24 const wchar_t kRecommendedPref[] = L"this.pref.recommended_value_only";
25 const wchar_t kSampleDict[] = L"sample.dict";
26 const wchar_t kSampleList[] = L"sample.list";
[email protected]8664dfb2010-07-16 11:48:2127
28 // This must match the actual pref name so the command-line store knows about
29 // it.
30 const wchar_t kApplicationLocale[] = L"intl.app_locale";
[email protected]d8b08c92010-06-07 13:13:2831}
32
[email protected]db198b22010-07-12 16:48:4933// Potentailly expected values of all preferences used in this test program.
[email protected]9677c902010-07-13 06:56:3234// The "user" namespace is defined globally in an ARM system header, so we need
35// something different here.
36namespace user_pref {
[email protected]d8b08c92010-06-07 13:13:2837 const int kMaxTabsValue = 31;
38 const bool kDeleteCacheValue = true;
[email protected]db198b22010-07-12 16:48:4939 const std::wstring kCurrentThemeIDValue = L"abcdefg";
[email protected]d8b08c92010-06-07 13:13:2840 const std::wstring kHomepageValue = L"http://www.google.com";
[email protected]8664dfb2010-07-16 11:48:2141 const std::wstring kApplicationLocaleValue = L"is-WRONG";
[email protected]d8b08c92010-06-07 13:13:2842}
43
[email protected]9677c902010-07-13 06:56:3244namespace enforced_pref {
[email protected]d8b08c92010-06-07 13:13:2845 const std::wstring kHomepageValue = L"http://www.topeka.com";
46}
47
[email protected]9677c902010-07-13 06:56:3248namespace extension_pref {
[email protected]db198b22010-07-12 16:48:4949 const std::wstring kCurrentThemeIDValue = L"set by extension";
50 const std::wstring kHomepageValue = L"http://www.chromium.org";
51}
52
[email protected]8664dfb2010-07-16 11:48:2153namespace command_line_pref {
54 const std::wstring kApplicationLocaleValue = L"hi-MOM";
55 const std::wstring kCurrentThemeIDValue = L"zyxwvut";
56 const std::wstring kHomepageValue = L"http://www.ferretcentral.org";
57}
58
[email protected]9677c902010-07-13 06:56:3259namespace recommended_pref {
[email protected]d8b08c92010-06-07 13:13:2860 const int kMaxTabsValue = 10;
61 const bool kRecommendedPrefValue = true;
62}
63
64class PrefValueStoreTest : public testing::Test {
65 protected:
[email protected]d8b08c92010-06-07 13:13:2866 virtual void SetUp() {
67 // Create dummy user preferences.
68 enforced_prefs_= CreateEnforcedPrefs();
[email protected]db198b22010-07-12 16:48:4969 extension_prefs_ = CreateExtensionPrefs();
[email protected]8664dfb2010-07-16 11:48:2170 command_line_prefs_ = CreateCommandLinePrefs();
[email protected]d8b08c92010-06-07 13:13:2871 user_prefs_ = CreateUserPrefs();
72 recommended_prefs_ = CreateRecommendedPrefs();
73
74 // Create |DummyPrefStore|s.
75 enforced_pref_store_ = new DummyPrefStore();
76 enforced_pref_store_->set_prefs(enforced_prefs_);
[email protected]db198b22010-07-12 16:48:4977 extension_pref_store_ = new DummyPrefStore();
78 extension_pref_store_->set_prefs(extension_prefs_);
[email protected]8664dfb2010-07-16 11:48:2179 command_line_pref_store_ = new DummyPrefStore();
80 command_line_pref_store_->set_prefs(command_line_prefs_);
[email protected]d8b08c92010-06-07 13:13:2881 user_pref_store_ = new DummyPrefStore();
82 user_pref_store_->set_read_only(false);
83 user_pref_store_->set_prefs(user_prefs_);
84 recommended_pref_store_ = new DummyPrefStore();
85 recommended_pref_store_->set_prefs(recommended_prefs_);
86
87 // Create a new pref-value-store.
[email protected]61f972b2010-08-04 15:31:3888 pref_value_store_ = new PrefValueStore(enforced_pref_store_,
89 extension_pref_store_,
90 command_line_pref_store_,
91 user_pref_store_,
92 recommended_pref_store_);
93
94 ui_thread_.reset(new ChromeThread(ChromeThread::UI, &loop_));
95 file_thread_.reset(new ChromeThread(ChromeThread::FILE, &loop_));
[email protected]d8b08c92010-06-07 13:13:2896 }
97
98 // Creates a new dictionary and stores some sample user preferences
99 // in it.
100 DictionaryValue* CreateUserPrefs() {
101 DictionaryValue* user_prefs = new DictionaryValue();
[email protected]9677c902010-07-13 06:56:32102 user_prefs->SetBoolean(prefs::kDeleteCache, user_pref::kDeleteCacheValue);
103 user_prefs->SetInteger(prefs::kMaxTabs, user_pref::kMaxTabsValue);
104 user_prefs->SetString(prefs::kCurrentThemeID,
105 user_pref::kCurrentThemeIDValue);
[email protected]8664dfb2010-07-16 11:48:21106 user_prefs->SetString(prefs::kApplicationLocale,
107 user_pref::kApplicationLocaleValue);
[email protected]9677c902010-07-13 06:56:32108 user_prefs->SetString(prefs::kHomepage, user_pref::kHomepageValue);
[email protected]d8b08c92010-06-07 13:13:28109 return user_prefs;
110 }
111
112 DictionaryValue* CreateEnforcedPrefs() {
113 DictionaryValue* enforced_prefs = new DictionaryValue();
[email protected]9677c902010-07-13 06:56:32114 enforced_prefs->SetString(prefs::kHomepage, enforced_pref::kHomepageValue);
[email protected]61f972b2010-08-04 15:31:38115 expected_differing_paths_.push_back(WideToUTF8(prefs::kHomepage));
[email protected]d8b08c92010-06-07 13:13:28116 return enforced_prefs;
117 }
118
[email protected]db198b22010-07-12 16:48:49119 DictionaryValue* CreateExtensionPrefs() {
120 DictionaryValue* extension_prefs = new DictionaryValue();
121 extension_prefs->SetString(prefs::kCurrentThemeID,
[email protected]9677c902010-07-13 06:56:32122 extension_pref::kCurrentThemeIDValue);
123 extension_prefs->SetString(prefs::kHomepage,
124 extension_pref::kHomepageValue);
[email protected]db198b22010-07-12 16:48:49125 return extension_prefs;
126 }
127
[email protected]8664dfb2010-07-16 11:48:21128 DictionaryValue* CreateCommandLinePrefs() {
129 DictionaryValue* command_line_prefs = new DictionaryValue();
130 command_line_prefs->SetString(prefs::kCurrentThemeID,
131 command_line_pref::kCurrentThemeIDValue);
132 command_line_prefs->SetString(prefs::kApplicationLocale,
133 command_line_pref::kApplicationLocaleValue);
134 command_line_prefs->SetString(prefs::kHomepage,
135 command_line_pref::kHomepageValue);
136 return command_line_prefs;
137 }
138
[email protected]d8b08c92010-06-07 13:13:28139 DictionaryValue* CreateRecommendedPrefs() {
140 DictionaryValue* recommended_prefs = new DictionaryValue();
[email protected]9677c902010-07-13 06:56:32141 recommended_prefs->SetInteger(prefs::kMaxTabs,
142 recommended_pref::kMaxTabsValue);
[email protected]d8b08c92010-06-07 13:13:28143 recommended_prefs->SetBoolean(
144 prefs::kRecommendedPref,
[email protected]9677c902010-07-13 06:56:32145 recommended_pref::kRecommendedPrefValue);
[email protected]61f972b2010-08-04 15:31:38146
147 // Expected differing paths must be added in lexicographic order
148 // to work properly
149 expected_differing_paths_.push_back("tabs");
150 expected_differing_paths_.push_back(WideToUTF8(prefs::kMaxTabs));
151 expected_differing_paths_.push_back("this");
152 expected_differing_paths_.push_back("this.pref");
153 expected_differing_paths_.push_back(WideToUTF8(prefs::kRecommendedPref));
[email protected]d8b08c92010-06-07 13:13:28154 return recommended_prefs; }
155
156 DictionaryValue* CreateSampleDictValue() {
157 DictionaryValue* sample_dict = new DictionaryValue();
158 sample_dict->SetBoolean(L"issample", true);
159 sample_dict->SetInteger(L"value", 4);
160 sample_dict->SetString(L"descr", L"Sample Test Dictionary");
161 return sample_dict;
162 }
163
164 ListValue* CreateSampleListValue() {
165 ListValue* sample_list = new ListValue();
166 sample_list->Set(0, Value::CreateIntegerValue(0));
167 sample_list->Set(1, Value::CreateIntegerValue(1));
168 sample_list->Set(2, Value::CreateIntegerValue(2));
169 sample_list->Set(3, Value::CreateIntegerValue(3));
170 return sample_list;
171 }
172
[email protected]61f972b2010-08-04 15:31:38173 virtual void TearDown() {
174 loop_.RunAllPending();
175 }
[email protected]d8b08c92010-06-07 13:13:28176
[email protected]61f972b2010-08-04 15:31:38177 MessageLoop loop_;
178
179 scoped_refptr<PrefValueStore> pref_value_store_;
180
181 // |PrefStore|s are owned by the |PrefValueStore|.
182 DummyPrefStore* enforced_pref_store_;
183 DummyPrefStore* extension_pref_store_;
184 DummyPrefStore* command_line_pref_store_;
185 DummyPrefStore* recommended_pref_store_;
186 DummyPrefStore* user_pref_store_;
187
188 // A vector of the preferences paths in the managed and recommended
189 // PrefStores that are set at the beginning of a test. Can be modified
190 // by the test to track changes that it makes to the preferences
191 // stored in the managed and recommended PrefStores.
192 std::vector<std::string> expected_differing_paths_;
193
194 // Preferences are owned by the individual |DummyPrefStores|.
195 DictionaryValue* enforced_prefs_;
196 DictionaryValue* extension_prefs_;
197 DictionaryValue* command_line_prefs_;
198 DictionaryValue* user_prefs_;
199 DictionaryValue* recommended_prefs_;
200
201 private:
202 scoped_ptr<ChromeThread> ui_thread_;
203 scoped_ptr<ChromeThread> file_thread_;
204};
[email protected]d8b08c92010-06-07 13:13:28205
206TEST_F(PrefValueStoreTest, IsReadOnly) {
207 enforced_pref_store_->set_read_only(true);
[email protected]db198b22010-07-12 16:48:49208 extension_pref_store_->set_read_only(true);
[email protected]8664dfb2010-07-16 11:48:21209 command_line_pref_store_->set_read_only(true);
[email protected]d8b08c92010-06-07 13:13:28210 user_pref_store_->set_read_only(true);
211 recommended_pref_store_->set_read_only(true);
212 EXPECT_TRUE(pref_value_store_->ReadOnly());
213
214 user_pref_store_->set_read_only(false);
215 EXPECT_FALSE(pref_value_store_->ReadOnly());
216}
217
218TEST_F(PrefValueStoreTest, GetValue) {
219 Value* value;
220
[email protected]db198b22010-07-12 16:48:49221 // Test getting an enforced value overwriting a user-defined and
222 // extension-defined value.
[email protected]d8b08c92010-06-07 13:13:28223 value = NULL;
224 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kHomepage, &value));
225 std::wstring actual_str_value;
226 EXPECT_TRUE(value->GetAsString(&actual_str_value));
[email protected]9677c902010-07-13 06:56:32227 EXPECT_EQ(enforced_pref::kHomepageValue, actual_str_value);
[email protected]d8b08c92010-06-07 13:13:28228
[email protected]8664dfb2010-07-16 11:48:21229 // Test getting an extension value overwriting a user-defined and
230 // command-line-defined value.
[email protected]db198b22010-07-12 16:48:49231 value = NULL;
232 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kCurrentThemeID, &value));
233 EXPECT_TRUE(value->GetAsString(&actual_str_value));
[email protected]9677c902010-07-13 06:56:32234 EXPECT_EQ(extension_pref::kCurrentThemeIDValue, actual_str_value);
[email protected]db198b22010-07-12 16:48:49235
[email protected]8664dfb2010-07-16 11:48:21236 // Test getting a command-line value overwriting a user-defined value.
237 value = NULL;
238 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kApplicationLocale, &value));
239 EXPECT_TRUE(value->GetAsString(&actual_str_value));
240 EXPECT_EQ(command_line_pref::kApplicationLocaleValue, actual_str_value);
241
[email protected]db198b22010-07-12 16:48:49242 // Test getting a user-set value.
[email protected]d8b08c92010-06-07 13:13:28243 value = NULL;
244 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kDeleteCache, &value));
245 bool actual_bool_value = false;
246 EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
[email protected]9677c902010-07-13 06:56:32247 EXPECT_EQ(user_pref::kDeleteCacheValue, actual_bool_value);
[email protected]d8b08c92010-06-07 13:13:28248
249 // Test getting a user set value overwriting a recommended value.
250 value = NULL;
251 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kMaxTabs, &value));
252 int actual_int_value = -1;
253 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
[email protected]9677c902010-07-13 06:56:32254 EXPECT_EQ(user_pref::kMaxTabsValue, actual_int_value);
[email protected]d8b08c92010-06-07 13:13:28255
256 // Test getting a recommended value.
257 value = NULL;
258 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kRecommendedPref, &value));
259 actual_bool_value = false;
260 EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
[email protected]9677c902010-07-13 06:56:32261 EXPECT_EQ(recommended_pref::kRecommendedPrefValue, actual_bool_value);
[email protected]d8b08c92010-06-07 13:13:28262
263 // Test getting a preference value that the |PrefValueStore|
264 // does not contain.
265 FundamentalValue tmp_dummy_value(true);
266 Value* v_null = &tmp_dummy_value;
267 ASSERT_FALSE(pref_value_store_->GetValue(prefs::kMissingPref, &v_null));
268 ASSERT_TRUE(v_null == NULL);
269}
270
271TEST_F(PrefValueStoreTest, HasPrefPath) {
272 // Enforced preference
273 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
274 // User preference
275 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kDeleteCache));
276 // Recommended preference
277 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
278 // Unknown preference
279 EXPECT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
280}
281
282TEST_F(PrefValueStoreTest, ReadPrefs) {
283 pref_value_store_->ReadPrefs();
284 // The ReadPrefs method of the |DummyPrefStore| deletes the |pref_store|s
285 // internal dictionary and creates a new empty dictionary. Hence this
286 // dictionary does not contain any of the preloaded preferences.
287 // This shows that the ReadPrefs method of the |DummyPrefStore| was called.
288 EXPECT_FALSE(pref_value_store_->HasPrefPath(prefs::kDeleteCache));
289}
290
291TEST_F(PrefValueStoreTest, WritePrefs) {
292 user_pref_store_->set_prefs_written(false);
293 pref_value_store_->WritePrefs();
294 ASSERT_TRUE(user_pref_store_->get_prefs_written());
295}
296
297TEST_F(PrefValueStoreTest, SetUserPrefValue) {
298 Value* new_value = NULL;
299 Value* actual_value = NULL;
300
301 // Test that enforced values can not be set.
[email protected]d7449e82010-07-14 11:42:35302 ASSERT_TRUE(pref_value_store_->PrefValueInManagedStore(prefs::kHomepage));
[email protected]d8b08c92010-06-07 13:13:28303 // The Ownership is tranfered to |PrefValueStore|.
304 new_value = Value::CreateStringValue(L"http://www.youtube.com");
305 pref_value_store_->SetUserPrefValue(prefs::kHomepage, new_value);
306
307 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kHomepage, &actual_value));
308 std::wstring value_str;
309 actual_value->GetAsString(&value_str);
[email protected]9677c902010-07-13 06:56:32310 ASSERT_EQ(enforced_pref::kHomepageValue, value_str);
[email protected]d8b08c92010-06-07 13:13:28311
312 // User preferences values can be set
[email protected]d7449e82010-07-14 11:42:35313 ASSERT_FALSE(pref_value_store_->PrefValueInManagedStore(prefs::kMaxTabs));
[email protected]d8b08c92010-06-07 13:13:28314 actual_value = NULL;
315 pref_value_store_->GetValue(prefs::kMaxTabs, &actual_value);
316 int int_value;
317 EXPECT_TRUE(actual_value->GetAsInteger(&int_value));
[email protected]9677c902010-07-13 06:56:32318 EXPECT_EQ(user_pref::kMaxTabsValue, int_value);
[email protected]d8b08c92010-06-07 13:13:28319
320 new_value = Value::CreateIntegerValue(1);
321 pref_value_store_->SetUserPrefValue(prefs::kMaxTabs, new_value);
322 actual_value = NULL;
323 pref_value_store_->GetValue(prefs::kMaxTabs, &actual_value);
324 EXPECT_TRUE(new_value->Equals(actual_value));
325
326 // Set and Get |DictionaryValue|
327 DictionaryValue* expected_dict_value = CreateSampleDictValue();
328 pref_value_store_->SetUserPrefValue(prefs::kSampleDict, expected_dict_value);
329
330 actual_value = NULL;
331 std::wstring key(prefs::kSampleDict);
332 pref_value_store_->GetValue(key , &actual_value);
333
334 ASSERT_EQ(expected_dict_value, actual_value);
335 ASSERT_TRUE(expected_dict_value->Equals(actual_value));
336
337 // Set and Get a |ListValue|
338 ListValue* expected_list_value = CreateSampleListValue();
339 pref_value_store_->SetUserPrefValue(prefs::kSampleList, expected_list_value);
340
341 actual_value = NULL;
342 key = prefs::kSampleList;
343 pref_value_store_->GetValue(key, &actual_value);
344
345 ASSERT_EQ(expected_list_value, actual_value);
346 ASSERT_TRUE(expected_list_value->Equals(actual_value));
347}
348
[email protected]d7449e82010-07-14 11:42:35349TEST_F(PrefValueStoreTest, PrefValueInManagedStore) {
[email protected]d8b08c92010-06-07 13:13:28350 // Test an enforced preference.
351 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
[email protected]d7449e82010-07-14 11:42:35352 EXPECT_TRUE(pref_value_store_->PrefValueInManagedStore(prefs::kHomepage));
353
354 // Test an extension preference.
355 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kCurrentThemeID));
356 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(
357 prefs::kCurrentThemeID));
[email protected]d8b08c92010-06-07 13:13:28358
[email protected]8664dfb2010-07-16 11:48:21359 // Test a command-line preference.
360 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kApplicationLocale));
361 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(
362 prefs::kApplicationLocale));
363
[email protected]d8b08c92010-06-07 13:13:28364 // Test a user preference.
365 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
[email protected]d7449e82010-07-14 11:42:35366 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(prefs::kMaxTabs));
[email protected]d8b08c92010-06-07 13:13:28367
368 // Test a preference from the recommended pref store.
369 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
[email protected]d7449e82010-07-14 11:42:35370 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(
371 prefs::kRecommendedPref));
[email protected]d8b08c92010-06-07 13:13:28372
373 // Test a preference for which the PrefValueStore does not contain a value.
374 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
[email protected]d7449e82010-07-14 11:42:35375 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(prefs::kMissingPref));
[email protected]d8b08c92010-06-07 13:13:28376}
377
[email protected]d7449e82010-07-14 11:42:35378TEST_F(PrefValueStoreTest, PrefValueInExtensionStore) {
379 // Test an enforced preference.
380 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
381 EXPECT_TRUE(pref_value_store_->PrefValueInExtensionStore(prefs::kHomepage));
382 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
383 prefs::kHomepage));
384
385 // Test an extension preference.
386 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kCurrentThemeID));
387 EXPECT_TRUE(pref_value_store_->PrefValueInExtensionStore(
388 prefs::kCurrentThemeID));
389 EXPECT_TRUE(pref_value_store_->PrefValueFromExtensionStore(
390 prefs::kCurrentThemeID));
391
[email protected]8664dfb2010-07-16 11:48:21392 // Test a command-line preference.
393 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kApplicationLocale));
394 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(
395 prefs::kApplicationLocale));
396 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
397 prefs::kApplicationLocale));
398
[email protected]d7449e82010-07-14 11:42:35399 // Test a user preference.
400 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
401 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(prefs::kMaxTabs));
402 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(prefs::kMaxTabs));
403
404 // Test a preference from the recommended pref store.
405 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
406 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(
407 prefs::kRecommendedPref));
408 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
409 prefs::kRecommendedPref));
410
411 // Test a preference for which the PrefValueStore does not contain a value.
412 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
413 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(
414 prefs::kMissingPref));
415 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
416 prefs::kMissingPref));
417}
418
419TEST_F(PrefValueStoreTest, PrefValueInUserStore) {
420 // Test an enforced preference.
421 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
422 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(prefs::kHomepage));
423 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(prefs::kHomepage));
424
425 // Test an extension preference.
426 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kCurrentThemeID));
427 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(
428 prefs::kCurrentThemeID));
429 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(
430 prefs::kCurrentThemeID));
431
[email protected]8664dfb2010-07-16 11:48:21432 // Test a command-line preference.
433 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kApplicationLocale));
434 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(
435 prefs::kApplicationLocale));
436 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(
437 prefs::kApplicationLocale));
438
[email protected]d7449e82010-07-14 11:42:35439 // Test a user preference.
440 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
441 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(prefs::kMaxTabs));
442 EXPECT_TRUE(pref_value_store_->PrefValueFromUserStore(prefs::kMaxTabs));
443
444 // Test a preference from the recommended pref store.
445 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
446 EXPECT_FALSE(pref_value_store_->PrefValueInUserStore(
447 prefs::kRecommendedPref));
448 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(
449 prefs::kRecommendedPref));
450
451 // Test a preference for which the PrefValueStore does not contain a value.
452 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
453 EXPECT_FALSE(pref_value_store_->PrefValueInUserStore(prefs::kMissingPref));
454 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(prefs::kMissingPref));
455}
[email protected]61f972b2010-08-04 15:31:38456
457class MockPolicyRefreshCallback {
458 public:
459 MockPolicyRefreshCallback() {}
460 MOCK_METHOD1(DoCallback, void(const std::vector<std::string>));
461};
462
463TEST_F(PrefValueStoreTest, TestPolicyRefresh) {
464 // pref_value_store_ is initialized by PrefValueStoreTest to have values
465 // in both it's managed and recommended store. By replacing them with
466 // dummy stores, all of the paths of the prefs originally managed and
467 // recommended stores should change.
468 MockPolicyRefreshCallback callback;
469 EXPECT_CALL(callback, DoCallback(_)).Times(0);
470 ChromeThread::PostTask(
471 ChromeThread::UI, FROM_HERE,
472 NewRunnableMethod(
473 pref_value_store_.get(),
474 &PrefValueStore::RefreshPolicyPrefs,
475 new DummyPrefStore(),
476 new DummyPrefStore(),
477 NewCallback(&callback,
478 &MockPolicyRefreshCallback::DoCallback)));
479 Mock::VerifyAndClearExpectations(&callback);
480 EXPECT_CALL(callback, DoCallback(expected_differing_paths_)).Times(1);
481 loop_.RunAllPending();
482}
483
484TEST_F(PrefValueStoreTest, TestRefreshPolicyPrefsCompletion) {
485 // Test changed preferences in managed store and removed
486 // preferences in the recommended store. In addition
487 // to "homepage", the other prefs that are set by default in
488 // the test class are removed by the DummyStore
489 scoped_ptr<DummyPrefStore> new_managed_store(new DummyPrefStore());
490 DictionaryValue* dict = new DictionaryValue();
491 dict->SetString(L"homepage", L"some other changed homepage");
492 new_managed_store->set_prefs(dict);
493 MockPolicyRefreshCallback callback;
494 EXPECT_CALL(callback, DoCallback(expected_differing_paths_)).Times(1);
495 pref_value_store_->RefreshPolicyPrefsCompletion(
496 new_managed_store.release(),
497 new DummyPrefStore(),
498 NewCallback(&callback,
499 &MockPolicyRefreshCallback::DoCallback));
500
501 // Test properties that have been removed from the managed store.
502 // Homepage is still set in managed prefs.
503 expected_differing_paths_.clear();
504 expected_differing_paths_.push_back(std::string("homepage"));
505 MockPolicyRefreshCallback callback2;
506 EXPECT_CALL(callback2, DoCallback(expected_differing_paths_)).Times(1);
507 pref_value_store_->RefreshPolicyPrefsCompletion(
508 new DummyPrefStore(),
509 new DummyPrefStore(),
510 NewCallback(&callback2,
511 &MockPolicyRefreshCallback::DoCallback));
512
513 // Test properties that are added to the recommended store.
514 scoped_ptr<DummyPrefStore> new_recommended_store(new DummyPrefStore());
515 dict = new DictionaryValue();
516 dict->SetString(L"homepage", L"some other changed homepage 2");
517 new_recommended_store->set_prefs(dict);
518 expected_differing_paths_.clear();
519 expected_differing_paths_.push_back(std::string("homepage"));
520 MockPolicyRefreshCallback callback3;
521 EXPECT_CALL(callback3, DoCallback(expected_differing_paths_)).Times(1);
522 pref_value_store_->RefreshPolicyPrefsCompletion(
523 new DummyPrefStore(),
524 new_recommended_store.release(),
525 NewCallback(&callback3,
526 &MockPolicyRefreshCallback::DoCallback));
527
528 // Test adding a multi-key path.
529 new_managed_store.reset(new DummyPrefStore());
530 dict = new DictionaryValue();
531 dict->SetString("segment1.segment2", "value");
532 new_managed_store->set_prefs(dict);
533 expected_differing_paths_.clear();
534 expected_differing_paths_.push_back(std::string("homepage"));
535 expected_differing_paths_.push_back(std::string("segment1"));
536 expected_differing_paths_.push_back(std::string("segment1.segment2"));
537 MockPolicyRefreshCallback callback4;
538 EXPECT_CALL(callback4, DoCallback(expected_differing_paths_)).Times(1);
539 pref_value_store_->RefreshPolicyPrefsCompletion(
540 new_managed_store.release(),
541 new DummyPrefStore(),
542 NewCallback(&callback4,
543 &MockPolicyRefreshCallback::DoCallback));
544}
545
546TEST_F(PrefValueStoreTest, TestConcurrentPolicyRefresh) {
547 MockPolicyRefreshCallback callback1;
548 ChromeThread::PostTask(
549 ChromeThread::UI, FROM_HERE,
550 NewRunnableMethod(
551 pref_value_store_.get(),
552 &PrefValueStore::RefreshPolicyPrefs,
553 new DummyPrefStore(),
554 new DummyPrefStore(),
555 NewCallback(&callback1,
556 &MockPolicyRefreshCallback::DoCallback)));
557 EXPECT_CALL(callback1, DoCallback(_)).Times(0);
558
559 MockPolicyRefreshCallback callback2;
560 ChromeThread::PostTask(
561 ChromeThread::UI, FROM_HERE,
562 NewRunnableMethod(
563 pref_value_store_.get(),
564 &PrefValueStore::RefreshPolicyPrefs,
565 new DummyPrefStore(),
566 new DummyPrefStore(),
567 NewCallback(&callback2,
568 &MockPolicyRefreshCallback::DoCallback)));
569 EXPECT_CALL(callback2, DoCallback(_)).Times(0);
570
571 MockPolicyRefreshCallback callback3;
572 ChromeThread::PostTask(
573 ChromeThread::UI, FROM_HERE,
574 NewRunnableMethod(
575 pref_value_store_.get(),
576 &PrefValueStore::RefreshPolicyPrefs,
577 new DummyPrefStore(),
578 new DummyPrefStore(),
579 NewCallback(&callback3,
580 &MockPolicyRefreshCallback::DoCallback)));
581 EXPECT_CALL(callback3, DoCallback(_)).Times(0);
582 Mock::VerifyAndClearExpectations(&callback1);
583 Mock::VerifyAndClearExpectations(&callback2);
584 Mock::VerifyAndClearExpectations(&callback3);
585
586 EXPECT_CALL(callback1, DoCallback(expected_differing_paths_)).Times(1);
587 std::vector<std::string> no_differing_paths;
588 EXPECT_CALL(callback2, DoCallback(no_differing_paths)).Times(1);
589 EXPECT_CALL(callback3, DoCallback(no_differing_paths)).Times(1);
590 loop_.RunAllPending();
591}