blob: c15994596be31c51be10abc610a3274c6bef7400 [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"
6#include "base/values.h"
[email protected]99178112010-08-09 23:36:047#include "chrome/browser/policy/configuration_policy_pref_store.h"
[email protected]fa26b3d52010-08-06 08:51:508#include "chrome/browser/chrome_thread.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]fa26b3d52010-08-06 08:51:5011#include "chrome/test/testing_pref_service.h"
[email protected]d8b08c92010-06-07 13:13:2812#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15using testing::_;
16using testing::Mock;
17
[email protected]d81288a02010-08-18 07:25:5018namespace {
19
20class MockPolicyRefreshCallback {
21 public:
22 MockPolicyRefreshCallback() {}
23 MOCK_METHOD1(DoCallback, void(const std::vector<std::string>));
24};
25
26} // namespace
27
[email protected]d8b08c92010-06-07 13:13:2828// Names of the preferences used in this test program.
29namespace prefs {
[email protected]57ecc4b2010-08-11 03:02:5130 const char kCurrentThemeID[] = "extensions.theme.id";
31 const char kDeleteCache[] = "browser.clear_data.cache";
32 const char kHomepage[] = "homepage";
33 const char kMaxTabs[] = "tabs.max_tabs";
34 const char kMissingPref[] = "this.pref.does_not_exist";
35 const char kRecommendedPref[] = "this.pref.recommended_value_only";
36 const char kSampleDict[] = "sample.dict";
37 const char kSampleList[] = "sample.list";
[email protected]8664dfb2010-07-16 11:48:2138
39 // This must match the actual pref name so the command-line store knows about
40 // it.
[email protected]57ecc4b2010-08-11 03:02:5141 const char kApplicationLocale[] = "intl.app_locale";
[email protected]d8b08c92010-06-07 13:13:2842}
43
[email protected]d81288a02010-08-18 07:25:5044// Potentially expected values of all preferences used in this test program.
[email protected]9677c902010-07-13 06:56:3245// The "user" namespace is defined globally in an ARM system header, so we need
46// something different here.
47namespace user_pref {
[email protected]d8b08c92010-06-07 13:13:2848 const int kMaxTabsValue = 31;
49 const bool kDeleteCacheValue = true;
[email protected]57ecc4b2010-08-11 03:02:5150 const char kCurrentThemeIDValue[] = "abcdefg";
51 const char kHomepageValue[] = "http://www.google.com";
52 const char kApplicationLocaleValue[] = "is-WRONG";
[email protected]d8b08c92010-06-07 13:13:2853}
54
[email protected]9677c902010-07-13 06:56:3255namespace enforced_pref {
[email protected]57ecc4b2010-08-11 03:02:5156 const std::string kHomepageValue = "http://www.topeka.com";
[email protected]d8b08c92010-06-07 13:13:2857}
58
[email protected]9677c902010-07-13 06:56:3259namespace extension_pref {
[email protected]57ecc4b2010-08-11 03:02:5160 const char kCurrentThemeIDValue[] = "set by extension";
61 const char kHomepageValue[] = "http://www.chromium.org";
[email protected]db198b22010-07-12 16:48:4962}
63
[email protected]8664dfb2010-07-16 11:48:2164namespace command_line_pref {
[email protected]57ecc4b2010-08-11 03:02:5165 const char kApplicationLocaleValue[] = "hi-MOM";
66 const char kCurrentThemeIDValue[] = "zyxwvut";
67 const char kHomepageValue[] = "http://www.ferretcentral.org";
[email protected]8664dfb2010-07-16 11:48:2168}
69
[email protected]9677c902010-07-13 06:56:3270namespace recommended_pref {
[email protected]d8b08c92010-06-07 13:13:2871 const int kMaxTabsValue = 10;
72 const bool kRecommendedPrefValue = true;
73}
74
75class PrefValueStoreTest : public testing::Test {
76 protected:
[email protected]d8b08c92010-06-07 13:13:2877 virtual void SetUp() {
78 // Create dummy user preferences.
79 enforced_prefs_= CreateEnforcedPrefs();
[email protected]db198b22010-07-12 16:48:4980 extension_prefs_ = CreateExtensionPrefs();
[email protected]8664dfb2010-07-16 11:48:2181 command_line_prefs_ = CreateCommandLinePrefs();
[email protected]d8b08c92010-06-07 13:13:2882 user_prefs_ = CreateUserPrefs();
83 recommended_prefs_ = CreateRecommendedPrefs();
84
85 // Create |DummyPrefStore|s.
86 enforced_pref_store_ = new DummyPrefStore();
87 enforced_pref_store_->set_prefs(enforced_prefs_);
[email protected]db198b22010-07-12 16:48:4988 extension_pref_store_ = new DummyPrefStore();
89 extension_pref_store_->set_prefs(extension_prefs_);
[email protected]8664dfb2010-07-16 11:48:2190 command_line_pref_store_ = new DummyPrefStore();
91 command_line_pref_store_->set_prefs(command_line_prefs_);
[email protected]d8b08c92010-06-07 13:13:2892 user_pref_store_ = new DummyPrefStore();
93 user_pref_store_->set_read_only(false);
94 user_pref_store_->set_prefs(user_prefs_);
95 recommended_pref_store_ = new DummyPrefStore();
96 recommended_pref_store_->set_prefs(recommended_prefs_);
97
98 // Create a new pref-value-store.
[email protected]fa26b3d52010-08-06 08:51:5099 pref_value_store_ = new TestingPrefService::TestingPrefValueStore(
100 enforced_pref_store_,
101 extension_pref_store_,
102 command_line_pref_store_,
103 user_pref_store_,
104 recommended_pref_store_);
[email protected]61f972b2010-08-04 15:31:38105
106 ui_thread_.reset(new ChromeThread(ChromeThread::UI, &loop_));
107 file_thread_.reset(new ChromeThread(ChromeThread::FILE, &loop_));
[email protected]d8b08c92010-06-07 13:13:28108 }
109
110 // Creates a new dictionary and stores some sample user preferences
111 // in it.
112 DictionaryValue* CreateUserPrefs() {
113 DictionaryValue* user_prefs = new DictionaryValue();
[email protected]9677c902010-07-13 06:56:32114 user_prefs->SetBoolean(prefs::kDeleteCache, user_pref::kDeleteCacheValue);
115 user_prefs->SetInteger(prefs::kMaxTabs, user_pref::kMaxTabsValue);
116 user_prefs->SetString(prefs::kCurrentThemeID,
117 user_pref::kCurrentThemeIDValue);
[email protected]8664dfb2010-07-16 11:48:21118 user_prefs->SetString(prefs::kApplicationLocale,
119 user_pref::kApplicationLocaleValue);
[email protected]9677c902010-07-13 06:56:32120 user_prefs->SetString(prefs::kHomepage, user_pref::kHomepageValue);
[email protected]d8b08c92010-06-07 13:13:28121 return user_prefs;
122 }
123
124 DictionaryValue* CreateEnforcedPrefs() {
125 DictionaryValue* enforced_prefs = new DictionaryValue();
[email protected]9677c902010-07-13 06:56:32126 enforced_prefs->SetString(prefs::kHomepage, enforced_pref::kHomepageValue);
[email protected]57ecc4b2010-08-11 03:02:51127 expected_differing_paths_.push_back(prefs::kHomepage);
[email protected]d8b08c92010-06-07 13:13:28128 return enforced_prefs;
129 }
130
[email protected]db198b22010-07-12 16:48:49131 DictionaryValue* CreateExtensionPrefs() {
132 DictionaryValue* extension_prefs = new DictionaryValue();
133 extension_prefs->SetString(prefs::kCurrentThemeID,
[email protected]9677c902010-07-13 06:56:32134 extension_pref::kCurrentThemeIDValue);
135 extension_prefs->SetString(prefs::kHomepage,
136 extension_pref::kHomepageValue);
[email protected]db198b22010-07-12 16:48:49137 return extension_prefs;
138 }
139
[email protected]8664dfb2010-07-16 11:48:21140 DictionaryValue* CreateCommandLinePrefs() {
141 DictionaryValue* command_line_prefs = new DictionaryValue();
142 command_line_prefs->SetString(prefs::kCurrentThemeID,
143 command_line_pref::kCurrentThemeIDValue);
144 command_line_prefs->SetString(prefs::kApplicationLocale,
145 command_line_pref::kApplicationLocaleValue);
146 command_line_prefs->SetString(prefs::kHomepage,
147 command_line_pref::kHomepageValue);
148 return command_line_prefs;
149 }
150
[email protected]d8b08c92010-06-07 13:13:28151 DictionaryValue* CreateRecommendedPrefs() {
152 DictionaryValue* recommended_prefs = new DictionaryValue();
[email protected]9677c902010-07-13 06:56:32153 recommended_prefs->SetInteger(prefs::kMaxTabs,
154 recommended_pref::kMaxTabsValue);
[email protected]d8b08c92010-06-07 13:13:28155 recommended_prefs->SetBoolean(
156 prefs::kRecommendedPref,
[email protected]9677c902010-07-13 06:56:32157 recommended_pref::kRecommendedPrefValue);
[email protected]61f972b2010-08-04 15:31:38158
159 // Expected differing paths must be added in lexicographic order
160 // to work properly
161 expected_differing_paths_.push_back("tabs");
[email protected]57ecc4b2010-08-11 03:02:51162 expected_differing_paths_.push_back(prefs::kMaxTabs);
[email protected]61f972b2010-08-04 15:31:38163 expected_differing_paths_.push_back("this");
164 expected_differing_paths_.push_back("this.pref");
[email protected]57ecc4b2010-08-11 03:02:51165 expected_differing_paths_.push_back(prefs::kRecommendedPref);
[email protected]d8b08c92010-06-07 13:13:28166 return recommended_prefs; }
167
168 DictionaryValue* CreateSampleDictValue() {
169 DictionaryValue* sample_dict = new DictionaryValue();
[email protected]16b527162010-08-15 18:37:10170 sample_dict->SetBoolean("issample", true);
171 sample_dict->SetInteger("value", 4);
172 sample_dict->SetString("descr", "Sample Test Dictionary");
[email protected]d8b08c92010-06-07 13:13:28173 return sample_dict;
174 }
175
176 ListValue* CreateSampleListValue() {
177 ListValue* sample_list = new ListValue();
178 sample_list->Set(0, Value::CreateIntegerValue(0));
179 sample_list->Set(1, Value::CreateIntegerValue(1));
180 sample_list->Set(2, Value::CreateIntegerValue(2));
181 sample_list->Set(3, Value::CreateIntegerValue(3));
182 return sample_list;
183 }
184
[email protected]61f972b2010-08-04 15:31:38185 virtual void TearDown() {
186 loop_.RunAllPending();
187 }
[email protected]d8b08c92010-06-07 13:13:28188
[email protected]61f972b2010-08-04 15:31:38189 MessageLoop loop_;
190
[email protected]fa26b3d52010-08-06 08:51:50191 scoped_refptr<TestingPrefService::TestingPrefValueStore> pref_value_store_;
[email protected]61f972b2010-08-04 15:31:38192
193 // |PrefStore|s are owned by the |PrefValueStore|.
194 DummyPrefStore* enforced_pref_store_;
195 DummyPrefStore* extension_pref_store_;
196 DummyPrefStore* command_line_pref_store_;
197 DummyPrefStore* recommended_pref_store_;
198 DummyPrefStore* user_pref_store_;
199
200 // A vector of the preferences paths in the managed and recommended
201 // PrefStores that are set at the beginning of a test. Can be modified
202 // by the test to track changes that it makes to the preferences
203 // stored in the managed and recommended PrefStores.
204 std::vector<std::string> expected_differing_paths_;
205
206 // Preferences are owned by the individual |DummyPrefStores|.
207 DictionaryValue* enforced_prefs_;
208 DictionaryValue* extension_prefs_;
209 DictionaryValue* command_line_prefs_;
210 DictionaryValue* user_prefs_;
211 DictionaryValue* recommended_prefs_;
212
213 private:
214 scoped_ptr<ChromeThread> ui_thread_;
215 scoped_ptr<ChromeThread> file_thread_;
216};
[email protected]d8b08c92010-06-07 13:13:28217
218TEST_F(PrefValueStoreTest, IsReadOnly) {
219 enforced_pref_store_->set_read_only(true);
[email protected]db198b22010-07-12 16:48:49220 extension_pref_store_->set_read_only(true);
[email protected]8664dfb2010-07-16 11:48:21221 command_line_pref_store_->set_read_only(true);
[email protected]d8b08c92010-06-07 13:13:28222 user_pref_store_->set_read_only(true);
223 recommended_pref_store_->set_read_only(true);
224 EXPECT_TRUE(pref_value_store_->ReadOnly());
225
226 user_pref_store_->set_read_only(false);
227 EXPECT_FALSE(pref_value_store_->ReadOnly());
228}
229
230TEST_F(PrefValueStoreTest, GetValue) {
231 Value* value;
232
[email protected]db198b22010-07-12 16:48:49233 // Test getting an enforced value overwriting a user-defined and
234 // extension-defined value.
[email protected]d8b08c92010-06-07 13:13:28235 value = NULL;
236 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kHomepage, &value));
[email protected]57ecc4b2010-08-11 03:02:51237 std::string actual_str_value;
[email protected]d8b08c92010-06-07 13:13:28238 EXPECT_TRUE(value->GetAsString(&actual_str_value));
[email protected]9677c902010-07-13 06:56:32239 EXPECT_EQ(enforced_pref::kHomepageValue, actual_str_value);
[email protected]d8b08c92010-06-07 13:13:28240
[email protected]8664dfb2010-07-16 11:48:21241 // Test getting an extension value overwriting a user-defined and
242 // command-line-defined value.
[email protected]db198b22010-07-12 16:48:49243 value = NULL;
244 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kCurrentThemeID, &value));
245 EXPECT_TRUE(value->GetAsString(&actual_str_value));
[email protected]9677c902010-07-13 06:56:32246 EXPECT_EQ(extension_pref::kCurrentThemeIDValue, actual_str_value);
[email protected]db198b22010-07-12 16:48:49247
[email protected]8664dfb2010-07-16 11:48:21248 // Test getting a command-line value overwriting a user-defined value.
249 value = NULL;
250 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kApplicationLocale, &value));
251 EXPECT_TRUE(value->GetAsString(&actual_str_value));
252 EXPECT_EQ(command_line_pref::kApplicationLocaleValue, actual_str_value);
253
[email protected]db198b22010-07-12 16:48:49254 // Test getting a user-set value.
[email protected]d8b08c92010-06-07 13:13:28255 value = NULL;
256 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kDeleteCache, &value));
257 bool actual_bool_value = false;
258 EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
[email protected]9677c902010-07-13 06:56:32259 EXPECT_EQ(user_pref::kDeleteCacheValue, actual_bool_value);
[email protected]d8b08c92010-06-07 13:13:28260
261 // Test getting a user set value overwriting a recommended value.
262 value = NULL;
263 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kMaxTabs, &value));
264 int actual_int_value = -1;
265 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
[email protected]9677c902010-07-13 06:56:32266 EXPECT_EQ(user_pref::kMaxTabsValue, actual_int_value);
[email protected]d8b08c92010-06-07 13:13:28267
268 // Test getting a recommended value.
269 value = NULL;
270 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kRecommendedPref, &value));
271 actual_bool_value = false;
272 EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
[email protected]9677c902010-07-13 06:56:32273 EXPECT_EQ(recommended_pref::kRecommendedPrefValue, actual_bool_value);
[email protected]d8b08c92010-06-07 13:13:28274
275 // Test getting a preference value that the |PrefValueStore|
276 // does not contain.
277 FundamentalValue tmp_dummy_value(true);
278 Value* v_null = &tmp_dummy_value;
279 ASSERT_FALSE(pref_value_store_->GetValue(prefs::kMissingPref, &v_null));
280 ASSERT_TRUE(v_null == NULL);
281}
282
283TEST_F(PrefValueStoreTest, HasPrefPath) {
284 // Enforced preference
285 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
286 // User preference
287 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kDeleteCache));
288 // Recommended preference
289 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
290 // Unknown preference
291 EXPECT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
292}
293
[email protected]d81288a02010-08-18 07:25:50294TEST_F(PrefValueStoreTest, PrefHasChanged) {
295 ASSERT_TRUE(pref_value_store_->PrefValueInManagedStore(prefs::kHomepage));
296
297 // Pretend we used to have a different enforced value set.
298 scoped_ptr<Value> value(Value::CreateStringValue("http://www.youtube.com"));
299 EXPECT_TRUE(pref_value_store_->PrefHasChanged(prefs::kHomepage, value.get()));
300
301 // Pretend we used to have the same enforced value set.
302 value.reset(Value::CreateStringValue(enforced_pref::kHomepageValue));
303 EXPECT_FALSE(pref_value_store_->PrefHasChanged(prefs::kHomepage,
304 value.get()));
305
306 // Really set a new value in a lower-priority store.
307 Value* new_value = Value::CreateStringValue("http://www.chromium.org");
308 pref_value_store_->SetUserPrefValue(prefs::kHomepage, new_value);
309 EXPECT_FALSE(pref_value_store_->PrefHasChanged(prefs::kHomepage,
310 value.get()));
311}
312
[email protected]d8b08c92010-06-07 13:13:28313TEST_F(PrefValueStoreTest, ReadPrefs) {
314 pref_value_store_->ReadPrefs();
315 // The ReadPrefs method of the |DummyPrefStore| deletes the |pref_store|s
316 // internal dictionary and creates a new empty dictionary. Hence this
317 // dictionary does not contain any of the preloaded preferences.
318 // This shows that the ReadPrefs method of the |DummyPrefStore| was called.
319 EXPECT_FALSE(pref_value_store_->HasPrefPath(prefs::kDeleteCache));
320}
321
322TEST_F(PrefValueStoreTest, WritePrefs) {
323 user_pref_store_->set_prefs_written(false);
324 pref_value_store_->WritePrefs();
325 ASSERT_TRUE(user_pref_store_->get_prefs_written());
326}
327
328TEST_F(PrefValueStoreTest, SetUserPrefValue) {
329 Value* new_value = NULL;
330 Value* actual_value = NULL;
331
332 // Test that enforced values can not be set.
[email protected]d7449e82010-07-14 11:42:35333 ASSERT_TRUE(pref_value_store_->PrefValueInManagedStore(prefs::kHomepage));
[email protected]d8b08c92010-06-07 13:13:28334 // The Ownership is tranfered to |PrefValueStore|.
[email protected]16b527162010-08-15 18:37:10335 new_value = Value::CreateStringValue("http://www.youtube.com");
[email protected]d8b08c92010-06-07 13:13:28336 pref_value_store_->SetUserPrefValue(prefs::kHomepage, new_value);
337
338 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kHomepage, &actual_value));
[email protected]57ecc4b2010-08-11 03:02:51339 std::string value_str;
[email protected]d8b08c92010-06-07 13:13:28340 actual_value->GetAsString(&value_str);
[email protected]9677c902010-07-13 06:56:32341 ASSERT_EQ(enforced_pref::kHomepageValue, value_str);
[email protected]d8b08c92010-06-07 13:13:28342
343 // User preferences values can be set
[email protected]d7449e82010-07-14 11:42:35344 ASSERT_FALSE(pref_value_store_->PrefValueInManagedStore(prefs::kMaxTabs));
[email protected]d8b08c92010-06-07 13:13:28345 actual_value = NULL;
346 pref_value_store_->GetValue(prefs::kMaxTabs, &actual_value);
347 int int_value;
348 EXPECT_TRUE(actual_value->GetAsInteger(&int_value));
[email protected]9677c902010-07-13 06:56:32349 EXPECT_EQ(user_pref::kMaxTabsValue, int_value);
[email protected]d8b08c92010-06-07 13:13:28350
351 new_value = Value::CreateIntegerValue(1);
352 pref_value_store_->SetUserPrefValue(prefs::kMaxTabs, new_value);
353 actual_value = NULL;
354 pref_value_store_->GetValue(prefs::kMaxTabs, &actual_value);
355 EXPECT_TRUE(new_value->Equals(actual_value));
356
357 // Set and Get |DictionaryValue|
358 DictionaryValue* expected_dict_value = CreateSampleDictValue();
359 pref_value_store_->SetUserPrefValue(prefs::kSampleDict, expected_dict_value);
360
361 actual_value = NULL;
[email protected]57ecc4b2010-08-11 03:02:51362 std::string key(prefs::kSampleDict);
[email protected]d8b08c92010-06-07 13:13:28363 pref_value_store_->GetValue(key , &actual_value);
364
365 ASSERT_EQ(expected_dict_value, actual_value);
366 ASSERT_TRUE(expected_dict_value->Equals(actual_value));
367
368 // Set and Get a |ListValue|
369 ListValue* expected_list_value = CreateSampleListValue();
370 pref_value_store_->SetUserPrefValue(prefs::kSampleList, expected_list_value);
371
372 actual_value = NULL;
373 key = prefs::kSampleList;
374 pref_value_store_->GetValue(key, &actual_value);
375
376 ASSERT_EQ(expected_list_value, actual_value);
377 ASSERT_TRUE(expected_list_value->Equals(actual_value));
378}
379
[email protected]d7449e82010-07-14 11:42:35380TEST_F(PrefValueStoreTest, PrefValueInManagedStore) {
[email protected]d8b08c92010-06-07 13:13:28381 // Test an enforced preference.
382 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
[email protected]d7449e82010-07-14 11:42:35383 EXPECT_TRUE(pref_value_store_->PrefValueInManagedStore(prefs::kHomepage));
384
385 // Test an extension preference.
386 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kCurrentThemeID));
387 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(
388 prefs::kCurrentThemeID));
[email protected]d8b08c92010-06-07 13:13:28389
[email protected]8664dfb2010-07-16 11:48:21390 // Test a command-line preference.
391 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kApplicationLocale));
392 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(
393 prefs::kApplicationLocale));
394
[email protected]d8b08c92010-06-07 13:13:28395 // Test a user preference.
396 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
[email protected]d7449e82010-07-14 11:42:35397 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(prefs::kMaxTabs));
[email protected]d8b08c92010-06-07 13:13:28398
399 // Test a preference from the recommended pref store.
400 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
[email protected]d7449e82010-07-14 11:42:35401 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(
402 prefs::kRecommendedPref));
[email protected]d8b08c92010-06-07 13:13:28403
404 // Test a preference for which the PrefValueStore does not contain a value.
405 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
[email protected]d7449e82010-07-14 11:42:35406 EXPECT_FALSE(pref_value_store_->PrefValueInManagedStore(prefs::kMissingPref));
[email protected]d8b08c92010-06-07 13:13:28407}
408
[email protected]d7449e82010-07-14 11:42:35409TEST_F(PrefValueStoreTest, PrefValueInExtensionStore) {
410 // Test an enforced preference.
411 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
412 EXPECT_TRUE(pref_value_store_->PrefValueInExtensionStore(prefs::kHomepage));
413 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
414 prefs::kHomepage));
415
416 // Test an extension preference.
417 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kCurrentThemeID));
418 EXPECT_TRUE(pref_value_store_->PrefValueInExtensionStore(
419 prefs::kCurrentThemeID));
420 EXPECT_TRUE(pref_value_store_->PrefValueFromExtensionStore(
421 prefs::kCurrentThemeID));
422
[email protected]8664dfb2010-07-16 11:48:21423 // Test a command-line preference.
424 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kApplicationLocale));
425 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(
426 prefs::kApplicationLocale));
427 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
428 prefs::kApplicationLocale));
429
[email protected]d7449e82010-07-14 11:42:35430 // Test a user preference.
431 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
432 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(prefs::kMaxTabs));
433 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(prefs::kMaxTabs));
434
435 // Test a preference from the recommended pref store.
436 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
437 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(
438 prefs::kRecommendedPref));
439 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
440 prefs::kRecommendedPref));
441
442 // Test a preference for which the PrefValueStore does not contain a value.
443 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
444 EXPECT_FALSE(pref_value_store_->PrefValueInExtensionStore(
445 prefs::kMissingPref));
446 EXPECT_FALSE(pref_value_store_->PrefValueFromExtensionStore(
447 prefs::kMissingPref));
448}
449
450TEST_F(PrefValueStoreTest, PrefValueInUserStore) {
451 // Test an enforced preference.
452 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
453 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(prefs::kHomepage));
454 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(prefs::kHomepage));
455
456 // Test an extension preference.
457 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kCurrentThemeID));
458 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(
459 prefs::kCurrentThemeID));
460 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(
461 prefs::kCurrentThemeID));
462
[email protected]8664dfb2010-07-16 11:48:21463 // Test a command-line preference.
464 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kApplicationLocale));
465 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(
466 prefs::kApplicationLocale));
467 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(
468 prefs::kApplicationLocale));
469
[email protected]d7449e82010-07-14 11:42:35470 // Test a user preference.
471 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
472 EXPECT_TRUE(pref_value_store_->PrefValueInUserStore(prefs::kMaxTabs));
473 EXPECT_TRUE(pref_value_store_->PrefValueFromUserStore(prefs::kMaxTabs));
474
475 // Test a preference from the recommended pref store.
476 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
477 EXPECT_FALSE(pref_value_store_->PrefValueInUserStore(
478 prefs::kRecommendedPref));
479 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(
480 prefs::kRecommendedPref));
481
482 // Test a preference for which the PrefValueStore does not contain a value.
483 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
484 EXPECT_FALSE(pref_value_store_->PrefValueInUserStore(prefs::kMissingPref));
485 EXPECT_FALSE(pref_value_store_->PrefValueFromUserStore(prefs::kMissingPref));
486}
[email protected]61f972b2010-08-04 15:31:38487
[email protected]61f972b2010-08-04 15:31:38488TEST_F(PrefValueStoreTest, TestPolicyRefresh) {
489 // pref_value_store_ is initialized by PrefValueStoreTest to have values
490 // in both it's managed and recommended store. By replacing them with
491 // dummy stores, all of the paths of the prefs originally managed and
492 // recommended stores should change.
493 MockPolicyRefreshCallback callback;
494 EXPECT_CALL(callback, DoCallback(_)).Times(0);
495 ChromeThread::PostTask(
496 ChromeThread::UI, FROM_HERE,
497 NewRunnableMethod(
498 pref_value_store_.get(),
499 &PrefValueStore::RefreshPolicyPrefs,
500 new DummyPrefStore(),
501 new DummyPrefStore(),
502 NewCallback(&callback,
503 &MockPolicyRefreshCallback::DoCallback)));
504 Mock::VerifyAndClearExpectations(&callback);
505 EXPECT_CALL(callback, DoCallback(expected_differing_paths_)).Times(1);
506 loop_.RunAllPending();
507}
508
509TEST_F(PrefValueStoreTest, TestRefreshPolicyPrefsCompletion) {
510 // Test changed preferences in managed store and removed
511 // preferences in the recommended store. In addition
512 // to "homepage", the other prefs that are set by default in
513 // the test class are removed by the DummyStore
514 scoped_ptr<DummyPrefStore> new_managed_store(new DummyPrefStore());
515 DictionaryValue* dict = new DictionaryValue();
[email protected]16b527162010-08-15 18:37:10516 dict->SetString("homepage", "some other changed homepage");
[email protected]61f972b2010-08-04 15:31:38517 new_managed_store->set_prefs(dict);
518 MockPolicyRefreshCallback callback;
519 EXPECT_CALL(callback, DoCallback(expected_differing_paths_)).Times(1);
520 pref_value_store_->RefreshPolicyPrefsCompletion(
521 new_managed_store.release(),
522 new DummyPrefStore(),
523 NewCallback(&callback,
524 &MockPolicyRefreshCallback::DoCallback));
525
526 // Test properties that have been removed from the managed store.
527 // Homepage is still set in managed prefs.
528 expected_differing_paths_.clear();
529 expected_differing_paths_.push_back(std::string("homepage"));
530 MockPolicyRefreshCallback callback2;
531 EXPECT_CALL(callback2, DoCallback(expected_differing_paths_)).Times(1);
532 pref_value_store_->RefreshPolicyPrefsCompletion(
533 new DummyPrefStore(),
534 new DummyPrefStore(),
535 NewCallback(&callback2,
536 &MockPolicyRefreshCallback::DoCallback));
537
538 // Test properties that are added to the recommended store.
539 scoped_ptr<DummyPrefStore> new_recommended_store(new DummyPrefStore());
540 dict = new DictionaryValue();
[email protected]16b527162010-08-15 18:37:10541 dict->SetString("homepage", "some other changed homepage 2");
[email protected]61f972b2010-08-04 15:31:38542 new_recommended_store->set_prefs(dict);
543 expected_differing_paths_.clear();
544 expected_differing_paths_.push_back(std::string("homepage"));
545 MockPolicyRefreshCallback callback3;
546 EXPECT_CALL(callback3, DoCallback(expected_differing_paths_)).Times(1);
547 pref_value_store_->RefreshPolicyPrefsCompletion(
548 new DummyPrefStore(),
549 new_recommended_store.release(),
550 NewCallback(&callback3,
551 &MockPolicyRefreshCallback::DoCallback));
552
553 // Test adding a multi-key path.
554 new_managed_store.reset(new DummyPrefStore());
555 dict = new DictionaryValue();
556 dict->SetString("segment1.segment2", "value");
557 new_managed_store->set_prefs(dict);
558 expected_differing_paths_.clear();
559 expected_differing_paths_.push_back(std::string("homepage"));
560 expected_differing_paths_.push_back(std::string("segment1"));
561 expected_differing_paths_.push_back(std::string("segment1.segment2"));
562 MockPolicyRefreshCallback callback4;
563 EXPECT_CALL(callback4, DoCallback(expected_differing_paths_)).Times(1);
564 pref_value_store_->RefreshPolicyPrefsCompletion(
565 new_managed_store.release(),
566 new DummyPrefStore(),
567 NewCallback(&callback4,
568 &MockPolicyRefreshCallback::DoCallback));
569}
570
571TEST_F(PrefValueStoreTest, TestConcurrentPolicyRefresh) {
572 MockPolicyRefreshCallback callback1;
573 ChromeThread::PostTask(
574 ChromeThread::UI, FROM_HERE,
575 NewRunnableMethod(
576 pref_value_store_.get(),
577 &PrefValueStore::RefreshPolicyPrefs,
578 new DummyPrefStore(),
579 new DummyPrefStore(),
580 NewCallback(&callback1,
581 &MockPolicyRefreshCallback::DoCallback)));
582 EXPECT_CALL(callback1, DoCallback(_)).Times(0);
583
584 MockPolicyRefreshCallback callback2;
585 ChromeThread::PostTask(
586 ChromeThread::UI, FROM_HERE,
587 NewRunnableMethod(
588 pref_value_store_.get(),
589 &PrefValueStore::RefreshPolicyPrefs,
590 new DummyPrefStore(),
591 new DummyPrefStore(),
592 NewCallback(&callback2,
593 &MockPolicyRefreshCallback::DoCallback)));
594 EXPECT_CALL(callback2, DoCallback(_)).Times(0);
595
596 MockPolicyRefreshCallback callback3;
597 ChromeThread::PostTask(
598 ChromeThread::UI, FROM_HERE,
599 NewRunnableMethod(
600 pref_value_store_.get(),
601 &PrefValueStore::RefreshPolicyPrefs,
602 new DummyPrefStore(),
603 new DummyPrefStore(),
604 NewCallback(&callback3,
605 &MockPolicyRefreshCallback::DoCallback)));
606 EXPECT_CALL(callback3, DoCallback(_)).Times(0);
607 Mock::VerifyAndClearExpectations(&callback1);
608 Mock::VerifyAndClearExpectations(&callback2);
609 Mock::VerifyAndClearExpectations(&callback3);
610
611 EXPECT_CALL(callback1, DoCallback(expected_differing_paths_)).Times(1);
612 std::vector<std::string> no_differing_paths;
613 EXPECT_CALL(callback2, DoCallback(no_differing_paths)).Times(1);
614 EXPECT_CALL(callback3, DoCallback(no_differing_paths)).Times(1);
615 loop_.RunAllPending();
616}