blob: 3d222367d3891f48766771fa064b125d6bac337c [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
5#include "app/test/data/resource.h"
6#include "base/scoped_ptr.h"
7#include "base/values.h"
8#include "chrome/browser/dummy_pref_store.h"
9#include "chrome/browser/pref_value_store.h"
10
11#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]db198b22010-07-12 16:48:4921 const wchar_t kExtensionPref[] = L"extension.pref";
[email protected]d8b08c92010-06-07 13:13:2822 const wchar_t kHomepage[] = L"homepage";
[email protected]db198b22010-07-12 16:48:4923 const wchar_t kMaxTabs[] = L"tabs.max_tabs";
[email protected]d8b08c92010-06-07 13:13:2824 const wchar_t kMissingPref[] = L"this.pref.does_not_exist";
25 const wchar_t kRecommendedPref[] = L"this.pref.recommended_value_only";
26 const wchar_t kSampleDict[] = L"sample.dict";
27 const wchar_t kSampleList[] = L"sample.list";
28}
29
[email protected]db198b22010-07-12 16:48:4930// Potentailly expected values of all preferences used in this test program.
31namespace user {
[email protected]d8b08c92010-06-07 13:13:2832 const int kMaxTabsValue = 31;
33 const bool kDeleteCacheValue = true;
[email protected]db198b22010-07-12 16:48:4934 const std::wstring kCurrentThemeIDValue = L"abcdefg";
[email protected]d8b08c92010-06-07 13:13:2835 const std::wstring kHomepageValue = L"http://www.google.com";
36}
37
38namespace enforced {
39 const std::wstring kHomepageValue = L"http://www.topeka.com";
40}
41
[email protected]db198b22010-07-12 16:48:4942namespace extension {
43 const std::wstring kCurrentThemeIDValue = L"set by extension";
44 const std::wstring kHomepageValue = L"http://www.chromium.org";
45}
46
[email protected]d8b08c92010-06-07 13:13:2847namespace recommended {
48 const int kMaxTabsValue = 10;
49 const bool kRecommendedPrefValue = true;
50}
51
52class PrefValueStoreTest : public testing::Test {
53 protected:
54 scoped_ptr<PrefValueStore> pref_value_store_;
55
56 // |PrefStore|s are owned by the |PrefValueStore|.
57 DummyPrefStore* enforced_pref_store_;
[email protected]db198b22010-07-12 16:48:4958 DummyPrefStore* extension_pref_store_;
[email protected]d8b08c92010-06-07 13:13:2859 DummyPrefStore* recommended_pref_store_;
60 DummyPrefStore* user_pref_store_;
61
62 // Preferences are owned by the individual |DummyPrefStores|.
63 DictionaryValue* enforced_prefs_;
[email protected]db198b22010-07-12 16:48:4964 DictionaryValue* extension_prefs_;
[email protected]d8b08c92010-06-07 13:13:2865 DictionaryValue* user_prefs_;
66 DictionaryValue* recommended_prefs_;
67
68 virtual void SetUp() {
69 // Create dummy user preferences.
70 enforced_prefs_= CreateEnforcedPrefs();
[email protected]db198b22010-07-12 16:48:4971 extension_prefs_ = CreateExtensionPrefs();
[email protected]d8b08c92010-06-07 13:13:2872 user_prefs_ = CreateUserPrefs();
73 recommended_prefs_ = CreateRecommendedPrefs();
74
75 // Create |DummyPrefStore|s.
76 enforced_pref_store_ = new DummyPrefStore();
77 enforced_pref_store_->set_prefs(enforced_prefs_);
[email protected]db198b22010-07-12 16:48:4978 extension_pref_store_ = new DummyPrefStore();
79 extension_pref_store_->set_prefs(extension_prefs_);
[email protected]d8b08c92010-06-07 13:13:2880 user_pref_store_ = new DummyPrefStore();
81 user_pref_store_->set_read_only(false);
82 user_pref_store_->set_prefs(user_prefs_);
83 recommended_pref_store_ = new DummyPrefStore();
84 recommended_pref_store_->set_prefs(recommended_prefs_);
85
86 // Create a new pref-value-store.
87 pref_value_store_.reset(new PrefValueStore(enforced_pref_store_,
[email protected]db198b22010-07-12 16:48:4988 extension_pref_store_,
[email protected]d8b08c92010-06-07 13:13:2889 user_pref_store_,
90 recommended_pref_store_));
91 }
92
93 // Creates a new dictionary and stores some sample user preferences
94 // in it.
95 DictionaryValue* CreateUserPrefs() {
96 DictionaryValue* user_prefs = new DictionaryValue();
[email protected]db198b22010-07-12 16:48:4997 user_prefs->SetBoolean(prefs::kDeleteCache, user::kDeleteCacheValue);
98 user_prefs->SetInteger(prefs::kMaxTabs, user::kMaxTabsValue);
99 user_prefs->SetString(prefs::kCurrentThemeID, user::kCurrentThemeIDValue);
100 user_prefs->SetString(prefs::kHomepage, user::kHomepageValue);
[email protected]d8b08c92010-06-07 13:13:28101 return user_prefs;
102 }
103
104 DictionaryValue* CreateEnforcedPrefs() {
105 DictionaryValue* enforced_prefs = new DictionaryValue();
106 enforced_prefs->SetString(prefs::kHomepage, enforced::kHomepageValue);
107 return enforced_prefs;
108 }
109
[email protected]db198b22010-07-12 16:48:49110 DictionaryValue* CreateExtensionPrefs() {
111 DictionaryValue* extension_prefs = new DictionaryValue();
112 extension_prefs->SetString(prefs::kCurrentThemeID,
113 extension::kCurrentThemeIDValue);
114 extension_prefs->SetString(prefs::kHomepage, extension::kHomepageValue);
115 return extension_prefs;
116 }
117
[email protected]d8b08c92010-06-07 13:13:28118 DictionaryValue* CreateRecommendedPrefs() {
119 DictionaryValue* recommended_prefs = new DictionaryValue();
120 recommended_prefs->SetInteger(prefs::kMaxTabs, recommended::kMaxTabsValue);
121 recommended_prefs->SetBoolean(
122 prefs::kRecommendedPref,
123 recommended::kRecommendedPrefValue);
124 return recommended_prefs; }
125
126 DictionaryValue* CreateSampleDictValue() {
127 DictionaryValue* sample_dict = new DictionaryValue();
128 sample_dict->SetBoolean(L"issample", true);
129 sample_dict->SetInteger(L"value", 4);
130 sample_dict->SetString(L"descr", L"Sample Test Dictionary");
131 return sample_dict;
132 }
133
134 ListValue* CreateSampleListValue() {
135 ListValue* sample_list = new ListValue();
136 sample_list->Set(0, Value::CreateIntegerValue(0));
137 sample_list->Set(1, Value::CreateIntegerValue(1));
138 sample_list->Set(2, Value::CreateIntegerValue(2));
139 sample_list->Set(3, Value::CreateIntegerValue(3));
140 return sample_list;
141 }
142
143 virtual void TearDown() {}
144};
145
146
147TEST_F(PrefValueStoreTest, IsReadOnly) {
148 enforced_pref_store_->set_read_only(true);
[email protected]db198b22010-07-12 16:48:49149 extension_pref_store_->set_read_only(true);
[email protected]d8b08c92010-06-07 13:13:28150 user_pref_store_->set_read_only(true);
151 recommended_pref_store_->set_read_only(true);
152 EXPECT_TRUE(pref_value_store_->ReadOnly());
153
154 user_pref_store_->set_read_only(false);
155 EXPECT_FALSE(pref_value_store_->ReadOnly());
156}
157
158TEST_F(PrefValueStoreTest, GetValue) {
159 Value* value;
160
[email protected]db198b22010-07-12 16:48:49161 // Test getting an enforced value overwriting a user-defined and
162 // extension-defined value.
[email protected]d8b08c92010-06-07 13:13:28163 value = NULL;
164 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kHomepage, &value));
165 std::wstring actual_str_value;
166 EXPECT_TRUE(value->GetAsString(&actual_str_value));
167 EXPECT_EQ(enforced::kHomepageValue, actual_str_value);
168
[email protected]db198b22010-07-12 16:48:49169 // Test getting an extension value overwriting a user-defined value.
170 value = NULL;
171 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kCurrentThemeID, &value));
172 EXPECT_TRUE(value->GetAsString(&actual_str_value));
173 EXPECT_EQ(extension::kCurrentThemeIDValue, actual_str_value);
174
175 // Test getting a user-set value.
[email protected]d8b08c92010-06-07 13:13:28176 value = NULL;
177 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kDeleteCache, &value));
178 bool actual_bool_value = false;
179 EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
[email protected]db198b22010-07-12 16:48:49180 EXPECT_EQ(user::kDeleteCacheValue, actual_bool_value);
[email protected]d8b08c92010-06-07 13:13:28181
182 // Test getting a user set value overwriting a recommended value.
183 value = NULL;
184 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kMaxTabs, &value));
185 int actual_int_value = -1;
186 EXPECT_TRUE(value->GetAsInteger(&actual_int_value));
[email protected]db198b22010-07-12 16:48:49187 EXPECT_EQ(user::kMaxTabsValue, actual_int_value);
[email protected]d8b08c92010-06-07 13:13:28188
189 // Test getting a recommended value.
190 value = NULL;
191 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kRecommendedPref, &value));
192 actual_bool_value = false;
193 EXPECT_TRUE(value->GetAsBoolean(&actual_bool_value));
194 EXPECT_EQ(recommended::kRecommendedPrefValue, actual_bool_value);
195
196 // Test getting a preference value that the |PrefValueStore|
197 // does not contain.
198 FundamentalValue tmp_dummy_value(true);
199 Value* v_null = &tmp_dummy_value;
200 ASSERT_FALSE(pref_value_store_->GetValue(prefs::kMissingPref, &v_null));
201 ASSERT_TRUE(v_null == NULL);
202}
203
204TEST_F(PrefValueStoreTest, HasPrefPath) {
205 // Enforced preference
206 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
207 // User preference
208 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kDeleteCache));
209 // Recommended preference
210 EXPECT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
211 // Unknown preference
212 EXPECT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
213}
214
215TEST_F(PrefValueStoreTest, ReadPrefs) {
216 pref_value_store_->ReadPrefs();
217 // The ReadPrefs method of the |DummyPrefStore| deletes the |pref_store|s
218 // internal dictionary and creates a new empty dictionary. Hence this
219 // dictionary does not contain any of the preloaded preferences.
220 // This shows that the ReadPrefs method of the |DummyPrefStore| was called.
221 EXPECT_FALSE(pref_value_store_->HasPrefPath(prefs::kDeleteCache));
222}
223
224TEST_F(PrefValueStoreTest, WritePrefs) {
225 user_pref_store_->set_prefs_written(false);
226 pref_value_store_->WritePrefs();
227 ASSERT_TRUE(user_pref_store_->get_prefs_written());
228}
229
230TEST_F(PrefValueStoreTest, SetUserPrefValue) {
231 Value* new_value = NULL;
232 Value* actual_value = NULL;
233
234 // Test that enforced values can not be set.
235 ASSERT_TRUE(pref_value_store_->PrefValueIsManaged(prefs::kHomepage));
236 // The Ownership is tranfered to |PrefValueStore|.
237 new_value = Value::CreateStringValue(L"http://www.youtube.com");
238 pref_value_store_->SetUserPrefValue(prefs::kHomepage, new_value);
239
240 ASSERT_TRUE(pref_value_store_->GetValue(prefs::kHomepage, &actual_value));
241 std::wstring value_str;
242 actual_value->GetAsString(&value_str);
243 ASSERT_EQ(enforced::kHomepageValue, value_str);
244
245 // User preferences values can be set
246 ASSERT_FALSE(pref_value_store_->PrefValueIsManaged(prefs::kMaxTabs));
247 actual_value = NULL;
248 pref_value_store_->GetValue(prefs::kMaxTabs, &actual_value);
249 int int_value;
250 EXPECT_TRUE(actual_value->GetAsInteger(&int_value));
[email protected]db198b22010-07-12 16:48:49251 EXPECT_EQ(user::kMaxTabsValue, int_value);
[email protected]d8b08c92010-06-07 13:13:28252
253 new_value = Value::CreateIntegerValue(1);
254 pref_value_store_->SetUserPrefValue(prefs::kMaxTabs, new_value);
255 actual_value = NULL;
256 pref_value_store_->GetValue(prefs::kMaxTabs, &actual_value);
257 EXPECT_TRUE(new_value->Equals(actual_value));
258
259 // Set and Get |DictionaryValue|
260 DictionaryValue* expected_dict_value = CreateSampleDictValue();
261 pref_value_store_->SetUserPrefValue(prefs::kSampleDict, expected_dict_value);
262
263 actual_value = NULL;
264 std::wstring key(prefs::kSampleDict);
265 pref_value_store_->GetValue(key , &actual_value);
266
267 ASSERT_EQ(expected_dict_value, actual_value);
268 ASSERT_TRUE(expected_dict_value->Equals(actual_value));
269
270 // Set and Get a |ListValue|
271 ListValue* expected_list_value = CreateSampleListValue();
272 pref_value_store_->SetUserPrefValue(prefs::kSampleList, expected_list_value);
273
274 actual_value = NULL;
275 key = prefs::kSampleList;
276 pref_value_store_->GetValue(key, &actual_value);
277
278 ASSERT_EQ(expected_list_value, actual_value);
279 ASSERT_TRUE(expected_list_value->Equals(actual_value));
280}
281
282TEST_F(PrefValueStoreTest, PrefValueIsManaged) {
283 // Test an enforced preference.
284 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kHomepage));
285 EXPECT_TRUE(pref_value_store_->PrefValueIsManaged(prefs::kHomepage));
286
287 // Test a user preference.
288 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kMaxTabs));
289 EXPECT_FALSE(pref_value_store_->PrefValueIsManaged(prefs::kMaxTabs));
290
291 // Test a preference from the recommended pref store.
292 ASSERT_TRUE(pref_value_store_->HasPrefPath(prefs::kRecommendedPref));
293 EXPECT_FALSE(pref_value_store_->PrefValueIsManaged(prefs::kRecommendedPref));
294
295 // Test a preference for which the PrefValueStore does not contain a value.
296 ASSERT_FALSE(pref_value_store_->HasPrefPath(prefs::kMissingPref));
297 EXPECT_FALSE(pref_value_store_->PrefValueIsManaged(prefs::kMissingPref));
298}
299