Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1687)

Side by Side Diff: chrome/browser/extensions/extension_pref_store_unittest.cc

Issue 4852002: Fix for Bug 50726 "Save extension list and "winning" prefs from extensions" (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Addressed review comments Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/extensions/extension_pref_store.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // 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 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 <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/scoped_ptr.h" 8 #include "base/scoped_ptr.h"
9 #include "base/scoped_temp_dir.h" 9 #include "base/scoped_temp_dir.h"
10 #include "base/values.h" 10 #include "base/values.h"
11 #include "chrome/browser/extensions/extension_pref_store.h" 11 #include "chrome/browser/extensions/extension_pref_store.h"
12 #include "chrome/browser/prefs/default_pref_store.h" 12 #include "chrome/browser/prefs/default_pref_store.h"
13 #include "chrome/browser/prefs/pref_service.h" 13 #include "chrome/browser/prefs/pref_service.h"
14 #include "chrome/browser/prefs/pref_value_store.h" 14 #include "chrome/browser/prefs/pref_value_store.h"
15 #include "chrome/common/extensions/extension.h" 15 #include "chrome/common/extensions/extension.h"
16 #include "chrome/test/testing_pref_service.h" 16 #include "chrome/test/testing_pref_service.h"
17 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 19
20 namespace keys = extension_manifest_keys; 20 namespace keys = extension_manifest_keys;
21 21
22 namespace { 22 namespace {
23 23
24 class TestExtensionPrefStore;
25 class MockPrefService;
26
27 // Use constants to avoid confusing std::map with hard-coded strings.
28 const char kPref1[] = "path1.subpath";
29 const char kPref2[] = "path2";
30 const char kPref3[] = "path3";
31 const char kPref4[] = "path4";
32
33 class ExtensionPrefStoreTest : public testing::Test {
34 public:
35 ExtensionPrefStoreTest()
36 : ui_thread_(BrowserThread::UI, &message_loop_),
37 eps_(NULL),
38 dps_(NULL),
39 value_store_(NULL),
40 pref_service_(NULL)
41 {}
42
43 protected:
44 virtual void SetUp();
45 virtual void TearDown();
46
47 MessageLoop message_loop_;
48 BrowserThread ui_thread_;
49 TestExtensionPrefStore* eps_; // Owned by value_store_.
50 DefaultPrefStore* dps_; // Owned by value_store_.
51 DefaultPrefStore* ups_; // Owned by value_store_.
52 PrefValueStore* value_store_; // Owned by pref_service_.
53 scoped_ptr<MockPrefService> pref_service_;
54 };
55
56 // Mock PrefNotifier that allows the notifications to be tracked.
57 class MockPrefNotifier : public PrefNotifier {
58 public:
59 MockPrefNotifier(PrefService* service, PrefValueStore* value_store)
60 : PrefNotifier(service, value_store) {}
61
62 virtual ~MockPrefNotifier() {}
63
64 MOCK_METHOD1(FireObservers, void(const char* path));
65 };
66
67 // Mock PrefService that allows the PrefNotifier to be injected.
68 class MockPrefService : public PrefService {
69 public:
70 explicit MockPrefService(PrefValueStore* pref_value_store)
71 : PrefService(pref_value_store) {
72 }
73
74 void SetPrefNotifier(MockPrefNotifier* notifier) {
75 pref_notifier_.reset(notifier);
76 }
77 };
78
24 class TestExtensionPrefStore : public ExtensionPrefStore { 79 class TestExtensionPrefStore : public ExtensionPrefStore {
25 public: 80 public:
26 TestExtensionPrefStore() 81 TestExtensionPrefStore()
27 : ExtensionPrefStore(NULL, PrefNotifier::EXTENSION_STORE), 82 : ExtensionPrefStore(NULL, PrefNotifier::EXTENSION_STORE),
28 ext1(NULL), 83 ext1(NULL),
29 ext2(NULL), 84 ext2(NULL),
30 ext3(NULL), 85 ext3(NULL),
31 pref_service_(NULL) { 86 pref_service_(NULL) {
32 // Can't use ASSERT_TRUE here because a constructor can't return a value. 87 // Can't use ASSERT_TRUE here because a constructor can't return a value.
33 if (!temp_dir_.CreateUniqueTempDir()) { 88 if (!temp_dir_.CreateUniqueTempDir()) {
(...skipping 24 matching lines...) Expand all
58 typedef std::vector<std::string> ExtensionIDs; 113 typedef std::vector<std::string> ExtensionIDs;
59 void GetExtensionIDList(ExtensionIDs* result) { 114 void GetExtensionIDList(ExtensionIDs* result) {
60 GetExtensionIDs(result); 115 GetExtensionIDs(result);
61 } 116 }
62 117
63 void SetPrefService(PrefService* pref_service) { 118 void SetPrefService(PrefService* pref_service) {
64 pref_service_ = pref_service; 119 pref_service_ = pref_service;
65 } 120 }
66 121
67 // Overridden from ExtensionPrefStore. 122 // Overridden from ExtensionPrefStore.
68 virtual PrefService* GetPrefService() { 123 virtual PrefService* GetPrefService() const {
69 return pref_service_; 124 return pref_service_;
70 } 125 }
71 126
127 MOCK_METHOD0(SchedulePersist, void());
128
72 // Weak references, for convenience. 129 // Weak references, for convenience.
73 Extension* ext1; 130 Extension* ext1;
74 Extension* ext2; 131 Extension* ext2;
75 Extension* ext3; 132 Extension* ext3;
76 133
77 private: 134 private:
78 ScopedTempDir temp_dir_; 135 ScopedTempDir temp_dir_;
79 136
80 scoped_refptr<Extension> ext1_scoped_; 137 scoped_refptr<Extension> ext1_scoped_;
81 scoped_refptr<Extension> ext2_scoped_; 138 scoped_refptr<Extension> ext2_scoped_;
82 scoped_refptr<Extension> ext3_scoped_; 139 scoped_refptr<Extension> ext3_scoped_;
83 140
84 // Weak reference. 141 // Weak reference.
85 PrefService* pref_service_; 142 PrefService* pref_service_;
86 }; 143 };
87 144
88 // Mock PrefNotifier that allows the notifications to be tracked.
89 class MockPrefNotifier : public PrefNotifier {
90 public:
91 MockPrefNotifier(PrefService* service, PrefValueStore* value_store)
92 : PrefNotifier(service, value_store) {}
93 145
94 virtual ~MockPrefNotifier() {} 146 void ExtensionPrefStoreTest::SetUp() {
147 testing::Test::SetUp();
148 // NiceMock because only TestPersistence counts calls of mock methods.
149 eps_ = new testing::NiceMock<TestExtensionPrefStore>;
150 dps_ = new DefaultPrefStore;
151 ups_ = new DefaultPrefStore;
152 value_store_ = new TestingPrefService::TestingPrefValueStore(
153 NULL, eps_, NULL, ups_, NULL, dps_);
154 pref_service_.reset(new MockPrefService(value_store_));
155 eps_->SetPrefService(pref_service_.get());
95 156
96 MOCK_METHOD1(FireObservers, void(const char* path)); 157 pref_service_->RegisterStringPref(kPref1, "default pref 1");
97 }; 158 pref_service_->RegisterStringPref(kPref2, "default pref 2");
159 pref_service_->RegisterStringPref(kPref3, "default pref 3");
160 pref_service_->RegisterStringPref(kPref4, "default pref 4");
161 }
98 162
99 // Mock PrefService that allows the PrefNotifier to be injected. 163 void ExtensionPrefStoreTest::TearDown() {
100 class MockPrefService : public PrefService { 164 testing::Test::SetUp();
Paweł Hajdan Jr. 2010/11/13 11:51:10 huh? Did you mean TearDown?
battre (please use the other) 2010/11/15 09:27:07 Done.
101 public: 165 pref_service_.reset(NULL); // Frees eps_, dps_, value_store_.
102 explicit MockPrefService(PrefValueStore* pref_value_store) 166 }
103 : PrefService(pref_value_store) {
104 }
105
106 void SetPrefNotifier(MockPrefNotifier* notifier) {
107 pref_notifier_.reset(notifier);
108 }
109 };
110
111 // Use constants to avoid confusing std::map with hard-coded strings.
112 const char kPref1[] = "path1.subpath";
113 const char kPref2[] = "path2";
114 const char kPref3[] = "path3";
115 const char kPref4[] = "path4";
116 167
117 } // namespace 168 } // namespace
118 169
119 TEST(ExtensionPrefStoreTest, InstallOneExtension) { 170 TEST_F(ExtensionPrefStoreTest, ExtensionPrefs) {
120 TestExtensionPrefStore eps; 171 scoped_ptr<DictionaryValue> dict(
172 ExtensionPrefStore::ExtensionPrefs::Create("ext1"));
173 scoped_ptr<ExtensionPrefStore::ExtensionPrefs> ep(
174 new ExtensionPrefStore::ExtensionPrefs(dict.release()));
175 EXPECT_EQ("ext1", ep->extension_id());
176 EXPECT_EQ(0u, ep->pref_values()->size());
177
178 // test set/get
179 ep->Set("key", Value::CreateStringValue("value"));
180 std::string value;
181 ASSERT_TRUE(ep->Get("key") != NULL);
182 ASSERT_TRUE(ep->Get("key")->GetAsString(&value));
183 EXPECT_EQ("value", value);
184 ASSERT_EQ(1u, ep->pref_values()->size());
185 EXPECT_EQ(NULL, ep->Get("non_existing_key"));
186
187 // test delete
188 ep->Set("key", NULL);
189 ASSERT_EQ(NULL, ep->Get("key"));
190 ASSERT_EQ(0u, ep->pref_values()->size());
191 }
192
193 TEST_F(ExtensionPrefStoreTest, ExtensionStack) {
194 scoped_ptr<ListValue> extension_stack_list(new ListValue());
195
196 ExtensionPrefStore::ExtensionStack es;
197 EXPECT_FALSE(es.IsInitialized());
198 es.Init(extension_stack_list.get());
199 ASSERT_TRUE(es.IsInitialized());
200 EXPECT_EQ(0u, es.Size());
201
202 ExtensionPrefStore::ExtensionPrefs tmp = es.CreateEntry("ext1");
203 ASSERT_EQ(1u, es.Size());
204 EXPECT_EQ("ext1", tmp.extension_id());
205
206 // See whether we can retrieve it as well without triggering a CHECK
207 // exception.
208 ExtensionPrefStore::ExtensionPrefs ep1 = es.Get(0);
209
210 // Check whether it has been set up properly.
211 EXPECT_EQ("ext1", ep1.extension_id());
212
213 ExtensionPrefStore::ExtensionPrefs ep2 = es.CreateEntry("ext2");
214 EXPECT_EQ("ext2", ep2.extension_id());
215
216 // Check that order is correct.
217 EXPECT_EQ("ext2", es.Get(0).extension_id());
218 EXPECT_EQ("ext1", es.Get(1).extension_id());
219
220 // Check delete.
221 es.Remove(0);
222 EXPECT_EQ(1u, es.Size());
223 EXPECT_EQ("ext1", es.Get(0).extension_id());
224 }
225
226 TEST_F(ExtensionPrefStoreTest, InstallOneExtension) {
227 TestExtensionPrefStore& eps = *eps_;
121 ASSERT_TRUE(eps.ext1 != NULL); 228 ASSERT_TRUE(eps.ext1 != NULL);
122 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 229 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
123 230
124 TestExtensionPrefStore::ExtensionIDs ids; 231 TestExtensionPrefStore::ExtensionIDs ids;
125 eps.GetExtensionIDList(&ids); 232 eps.GetExtensionIDList(&ids);
126 EXPECT_EQ(1u, ids.size()); 233 ASSERT_EQ(1u, ids.size());
127 EXPECT_EQ(eps.ext1->id(), ids[0]); 234 EXPECT_EQ(eps.ext1->id(), ids[0]);
128 235
129 DictionaryValue* prefs = eps.prefs(); 236 DictionaryValue* prefs = eps.prefs();
130 ASSERT_EQ(1u, prefs->size()); 237 ASSERT_EQ(1u, prefs->size());
131 std::string actual; 238 std::string actual;
132 ASSERT_TRUE(prefs->GetString(kPref1, &actual)); 239 ASSERT_TRUE(prefs->GetString(kPref1, &actual));
133 EXPECT_EQ("val1", actual); 240 EXPECT_EQ("val1", actual);
134 } 241 }
135 242
136 // Make sure the last-installed extension wins. 243 // Make sure the last-installed extension wins.
137 TEST(ExtensionPrefStoreTest, InstallMultipleExtensions) { 244 TEST_F(ExtensionPrefStoreTest, InstallMultipleExtensions) {
138 TestExtensionPrefStore eps; 245 TestExtensionPrefStore& eps = *eps_;
139 ASSERT_TRUE(eps.ext1 != NULL); 246 ASSERT_TRUE(eps.ext1 != NULL);
140 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 247 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
141 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); 248 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
142 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3")); 249 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
143 250
144 TestExtensionPrefStore::ExtensionIDs ids; 251 TestExtensionPrefStore::ExtensionIDs ids;
145 eps.GetExtensionIDList(&ids); 252 eps.GetExtensionIDList(&ids);
146 EXPECT_EQ(3u, ids.size()); 253 ASSERT_EQ(3u, ids.size());
147 EXPECT_EQ(eps.ext3->id(), ids[0]); 254 EXPECT_EQ(eps.ext3->id(), ids[0]);
148 EXPECT_EQ(eps.ext2->id(), ids[1]); 255 EXPECT_EQ(eps.ext2->id(), ids[1]);
149 EXPECT_EQ(eps.ext1->id(), ids[2]); 256 EXPECT_EQ(eps.ext1->id(), ids[2]);
150 257
151 DictionaryValue* prefs = eps.prefs(); 258 DictionaryValue* prefs = eps.prefs();
152 ASSERT_EQ(1u, prefs->size()); 259 ASSERT_EQ(1u, prefs->size());
153 std::string actual; 260 std::string actual;
154 ASSERT_TRUE(prefs->GetString(kPref1, &actual)); 261 ASSERT_TRUE(prefs->GetString(kPref1, &actual));
155 EXPECT_EQ("val3", actual); 262 EXPECT_EQ("val3", actual);
156 } 263 }
157 264
158 // Make sure the last-installed extension wins for each preference. 265 // Make sure the last-installed extension wins for each preference.
159 TEST(ExtensionPrefStoreTest, InstallOverwrittenExtensions) { 266 TEST_F(ExtensionPrefStoreTest, InstallOverwrittenExtensions) {
160 TestExtensionPrefStore eps; 267 TestExtensionPrefStore& eps = *eps_;
161 ASSERT_TRUE(eps.ext1 != NULL); 268 ASSERT_TRUE(eps.ext1 != NULL);
162 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 269 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
163 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); 270 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
164 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3")); 271 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
165 272
166 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4")); 273 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
167 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val5")); 274 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val5"));
168 275
169 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val6")); 276 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val6"));
170 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val7")); 277 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val7"));
171 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val8")); 278 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val8"));
172 279
173 TestExtensionPrefStore::ExtensionIDs ids; 280 TestExtensionPrefStore::ExtensionIDs ids;
174 eps.GetExtensionIDList(&ids); 281 eps.GetExtensionIDList(&ids);
175 EXPECT_EQ(3u, ids.size()); 282 ASSERT_EQ(3u, ids.size());
176 EXPECT_EQ(eps.ext3->id(), ids[0]); 283 EXPECT_EQ(eps.ext3->id(), ids[0]);
177 EXPECT_EQ(eps.ext2->id(), ids[1]); 284 EXPECT_EQ(eps.ext2->id(), ids[1]);
178 EXPECT_EQ(eps.ext1->id(), ids[2]); 285 EXPECT_EQ(eps.ext1->id(), ids[2]);
179 286
180 DictionaryValue* prefs = eps.prefs(); 287 DictionaryValue* prefs = eps.prefs();
181 ASSERT_EQ(3u, prefs->size()); 288 ASSERT_EQ(3u, prefs->size());
182 std::string actual; 289 std::string actual;
183 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); 290 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
184 EXPECT_EQ("val3", actual); 291 EXPECT_EQ("val3", actual);
185 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); 292 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
186 EXPECT_EQ("val5", actual); 293 EXPECT_EQ("val5", actual);
187 EXPECT_TRUE(prefs->GetString(kPref3, &actual)); 294 EXPECT_TRUE(prefs->GetString(kPref3, &actual));
188 EXPECT_EQ("val8", actual); 295 EXPECT_EQ("val8", actual);
189 } 296 }
190 297
191 // Make sure the last-installed extension wins even if other extensions set 298 // Make sure the last-installed extension wins even if other extensions set
192 // the same or different preferences later. 299 // the same or different preferences later.
193 TEST(ExtensionPrefStoreTest, InstallInterleavedExtensions) { 300 TEST_F(ExtensionPrefStoreTest, InstallInterleavedExtensions) {
194 TestExtensionPrefStore eps; 301 TestExtensionPrefStore& eps = *eps_;
195 ASSERT_TRUE(eps.ext1 != NULL); 302 ASSERT_TRUE(eps.ext1 != NULL);
196 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 303 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
197 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val2")); 304 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val2"));
198 eps.InstallExtensionPref(eps.ext3, kPref3, Value::CreateStringValue("val3")); 305 eps.InstallExtensionPref(eps.ext3, kPref3, Value::CreateStringValue("val3"));
199 306
200 eps.InstallExtensionPref(eps.ext3, kPref3, Value::CreateStringValue("val4")); 307 eps.InstallExtensionPref(eps.ext3, kPref3, Value::CreateStringValue("val4"));
201 eps.InstallExtensionPref(eps.ext2, kPref3, Value::CreateStringValue("val5")); 308 eps.InstallExtensionPref(eps.ext2, kPref3, Value::CreateStringValue("val5"));
202 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val6")); 309 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val6"));
203 310
204 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val7")); 311 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val7"));
205 312
206 TestExtensionPrefStore::ExtensionIDs ids; 313 TestExtensionPrefStore::ExtensionIDs ids;
207 eps.GetExtensionIDList(&ids); 314 eps.GetExtensionIDList(&ids);
208 EXPECT_EQ(3u, ids.size()); 315 ASSERT_EQ(3u, ids.size());
209 EXPECT_EQ(eps.ext3->id(), ids[0]); 316 EXPECT_EQ(eps.ext3->id(), ids[0]);
210 EXPECT_EQ(eps.ext2->id(), ids[1]); 317 EXPECT_EQ(eps.ext2->id(), ids[1]);
211 EXPECT_EQ(eps.ext1->id(), ids[2]); 318 EXPECT_EQ(eps.ext1->id(), ids[2]);
212 319
213 DictionaryValue* prefs = eps.prefs(); 320 DictionaryValue* prefs = eps.prefs();
214 ASSERT_EQ(3u, prefs->size()); 321 ASSERT_EQ(3u, prefs->size());
215 std::string actual; 322 std::string actual;
216 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); 323 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
217 EXPECT_EQ("val7", actual); 324 EXPECT_EQ("val7", actual);
218 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); 325 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
219 EXPECT_EQ("val2", actual); 326 EXPECT_EQ("val2", actual);
220 EXPECT_TRUE(prefs->GetString(kPref3, &actual)); 327 EXPECT_TRUE(prefs->GetString(kPref3, &actual));
221 EXPECT_EQ("val4", actual); 328 EXPECT_EQ("val4", actual);
222 } 329 }
223 330
224 TEST(ExtensionPrefStoreTest, UninstallOnlyExtension) { 331 TEST_F(ExtensionPrefStoreTest, UninstallOnlyExtension) {
225 TestExtensionPrefStore eps; 332 TestExtensionPrefStore& eps = *eps_;
226 ASSERT_TRUE(eps.ext1 != NULL); 333 ASSERT_TRUE(eps.ext1 != NULL);
227 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 334 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
228 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val2")); 335 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val2"));
229 336
230 // No need to check the state here; the Install* tests cover that. 337 // No need to check the state here; the Install* tests cover that.
231 eps.UninstallExtension(eps.ext1); 338 eps.UninstallExtension(eps.ext1);
232 339
233 TestExtensionPrefStore::ExtensionIDs ids; 340 TestExtensionPrefStore::ExtensionIDs ids;
234 eps.GetExtensionIDList(&ids); 341 eps.GetExtensionIDList(&ids);
235 EXPECT_EQ(0u, ids.size()); 342 EXPECT_EQ(0u, ids.size());
236 343
237 DictionaryValue* prefs = eps.prefs(); 344 DictionaryValue* prefs = eps.prefs();
238 std::string actual; 345 std::string actual;
239 // "path1.name" has been removed, but an empty "path1" dictionary is still 346 // "path1.name" has been removed, but an empty "path1" dictionary is still
240 // present. 347 // present.
241 ASSERT_EQ(1u, prefs->size()); 348 ASSERT_EQ(1u, prefs->size());
242 EXPECT_FALSE(prefs->GetString(kPref1, &actual)); 349 EXPECT_FALSE(prefs->GetString(kPref1, &actual));
243 EXPECT_FALSE(prefs->GetString(kPref2, &actual)); 350 EXPECT_FALSE(prefs->GetString(kPref2, &actual));
244 } 351 }
245 352
246 // Tests uninstalling an extension that wasn't winning for any preferences. 353 // Tests uninstalling an extension that wasn't winning for any preferences.
247 TEST(ExtensionPrefStoreTest, UninstallIrrelevantExtension) { 354 TEST_F(ExtensionPrefStoreTest, UninstallIrrelevantExtension) {
248 TestExtensionPrefStore eps; 355 TestExtensionPrefStore& eps = *eps_;
249 ASSERT_TRUE(eps.ext1 != NULL); 356 ASSERT_TRUE(eps.ext1 != NULL);
250 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 357 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
251 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); 358 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
252 359
253 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val3")); 360 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val3"));
254 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val4")); 361 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val4"));
255 362
256 eps.UninstallExtension(eps.ext1); 363 eps.UninstallExtension(eps.ext1);
257 364
258 TestExtensionPrefStore::ExtensionIDs ids; 365 TestExtensionPrefStore::ExtensionIDs ids;
259 eps.GetExtensionIDList(&ids); 366 eps.GetExtensionIDList(&ids);
260 EXPECT_EQ(1u, ids.size()); 367 ASSERT_EQ(1u, ids.size());
261 EXPECT_EQ(eps.ext2->id(), ids[0]); 368 EXPECT_EQ(eps.ext2->id(), ids[0]);
262 369
263 DictionaryValue* prefs = eps.prefs(); 370 DictionaryValue* prefs = eps.prefs();
264 ASSERT_EQ(2u, prefs->size()); 371 ASSERT_EQ(2u, prefs->size());
265 std::string actual; 372 std::string actual;
266 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); 373 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
267 EXPECT_EQ("val2", actual); 374 EXPECT_EQ("val2", actual);
268 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); 375 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
269 EXPECT_EQ("val4", actual); 376 EXPECT_EQ("val4", actual);
270 } 377 }
271 378
272 // Tests uninstalling an extension that was winning for all preferences. 379 // Tests uninstalling an extension that was winning for all preferences.
273 TEST(ExtensionPrefStoreTest, UninstallExtensionFromTop) { 380 TEST_F(ExtensionPrefStoreTest, UninstallExtensionFromTop) {
274 TestExtensionPrefStore eps; 381 TestExtensionPrefStore& eps = *eps_;
275 ASSERT_TRUE(eps.ext1 != NULL); 382 ASSERT_TRUE(eps.ext1 != NULL);
276 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 383 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
277 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); 384 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
278 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3")); 385 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
279 386
280 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4")); 387 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
281 eps.InstallExtensionPref(eps.ext3, kPref2, Value::CreateStringValue("val5")); 388 eps.InstallExtensionPref(eps.ext3, kPref2, Value::CreateStringValue("val5"));
282 389
283 eps.UninstallExtension(eps.ext3); 390 eps.UninstallExtension(eps.ext3);
284 391
285 TestExtensionPrefStore::ExtensionIDs ids; 392 TestExtensionPrefStore::ExtensionIDs ids;
286 eps.GetExtensionIDList(&ids); 393 eps.GetExtensionIDList(&ids);
287 EXPECT_EQ(2u, ids.size()); 394 ASSERT_EQ(2u, ids.size());
288 EXPECT_EQ(eps.ext2->id(), ids[0]); 395 EXPECT_EQ(eps.ext2->id(), ids[0]);
289 EXPECT_EQ(eps.ext1->id(), ids[1]); 396 EXPECT_EQ(eps.ext1->id(), ids[1]);
290 397
291 DictionaryValue* prefs = eps.prefs(); 398 DictionaryValue* prefs = eps.prefs();
292 ASSERT_EQ(2u, prefs->size()); 399 ASSERT_EQ(2u, prefs->size());
293 std::string actual; 400 std::string actual;
294 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); 401 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
295 EXPECT_EQ("val2", actual); 402 EXPECT_EQ("val2", actual);
296 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); 403 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
297 EXPECT_EQ("val4", actual); 404 EXPECT_EQ("val4", actual);
298 } 405 }
299 406
300 // Tests uninstalling an extension that was winning for only some preferences. 407 // Tests uninstalling an extension that was winning for only some preferences.
301 TEST(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) { 408 TEST_F(ExtensionPrefStoreTest, UninstallExtensionFromMiddle) {
302 TestExtensionPrefStore eps; 409 TestExtensionPrefStore& eps = *eps_;
303 ASSERT_TRUE(eps.ext1 != NULL); 410 ASSERT_TRUE(eps.ext1 != NULL);
304 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1")); 411 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
305 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2")); 412 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
306 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3")); 413 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
307 414
308 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4")); 415 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
309 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val5")); 416 eps.InstallExtensionPref(eps.ext2, kPref2, Value::CreateStringValue("val5"));
310 417
311 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val6")); 418 eps.InstallExtensionPref(eps.ext1, kPref3, Value::CreateStringValue("val6"));
312 419
313 eps.InstallExtensionPref(eps.ext2, kPref4, Value::CreateStringValue("val7")); 420 eps.InstallExtensionPref(eps.ext2, kPref4, Value::CreateStringValue("val7"));
314 421
315 eps.UninstallExtension(eps.ext2); 422 eps.UninstallExtension(eps.ext2);
316 423
317 TestExtensionPrefStore::ExtensionIDs ids; 424 TestExtensionPrefStore::ExtensionIDs ids;
318 eps.GetExtensionIDList(&ids); 425 eps.GetExtensionIDList(&ids);
319 EXPECT_EQ(2u, ids.size()); 426 ASSERT_EQ(2u, ids.size());
320 EXPECT_EQ(eps.ext3->id(), ids[0]); 427 EXPECT_EQ(eps.ext3->id(), ids[0]);
321 EXPECT_EQ(eps.ext1->id(), ids[1]); 428 EXPECT_EQ(eps.ext1->id(), ids[1]);
322 429
323 DictionaryValue* prefs = eps.prefs(); 430 DictionaryValue* prefs = eps.prefs();
324 ASSERT_EQ(3u, prefs->size()); 431 ASSERT_EQ(3u, prefs->size());
325 std::string actual; 432 std::string actual;
326 EXPECT_TRUE(prefs->GetString(kPref1, &actual)); 433 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
327 EXPECT_EQ("val3", actual); 434 EXPECT_EQ("val3", actual);
328 EXPECT_TRUE(prefs->GetString(kPref2, &actual)); 435 EXPECT_TRUE(prefs->GetString(kPref2, &actual));
329 EXPECT_EQ("val4", actual); 436 EXPECT_EQ("val4", actual);
330 EXPECT_TRUE(prefs->GetString(kPref3, &actual)); 437 EXPECT_TRUE(prefs->GetString(kPref3, &actual));
331 EXPECT_EQ("val6", actual); 438 EXPECT_EQ("val6", actual);
332 EXPECT_FALSE(prefs->GetString(kPref4, &actual)); 439 EXPECT_FALSE(prefs->GetString(kPref4, &actual));
333 } 440 }
334 441
335 TEST(ExtensionPrefStoreTest, NotifyWhenNeeded) { 442 TEST_F(ExtensionPrefStoreTest, NotifyWhenNeeded) {
336 using testing::Mock; 443 using testing::Mock;
444 using testing::StrEq;
337 445
338 TestExtensionPrefStore* eps = new TestExtensionPrefStore; 446 TestExtensionPrefStore* eps = eps_;
339 DefaultPrefStore* dps = new DefaultPrefStore;
340 ASSERT_TRUE(eps->ext1 != NULL); 447 ASSERT_TRUE(eps->ext1 != NULL);
341 448
342 // The PrefValueStore takes ownership of the PrefStores; in this case, that's 449 // The PrefService takes ownership of the PrefNotifier.
343 // only an ExtensionPrefStore. Likewise, the PrefService takes ownership of 450 MockPrefNotifier* pref_notifier = new MockPrefNotifier(pref_service_.get(),
344 // the PrefValueStore and PrefNotifier. 451 value_store_);
345 PrefValueStore* value_store = new TestingPrefService::TestingPrefValueStore( 452 pref_service_->SetPrefNotifier(pref_notifier);
346 NULL, eps, NULL, NULL, NULL, dps);
347 scoped_ptr<MockPrefService> pref_service(new MockPrefService(value_store));
348 MockPrefNotifier* pref_notifier = new MockPrefNotifier(pref_service.get(),
349 value_store);
350 pref_service->SetPrefNotifier(pref_notifier);
351
352 eps->SetPrefService(pref_service.get());
353 pref_service->RegisterStringPref(kPref1, std::string());
354 453
355 EXPECT_CALL(*pref_notifier, FireObservers(kPref1)); 454 EXPECT_CALL(*pref_notifier, FireObservers(kPref1));
356 eps->InstallExtensionPref(eps->ext1, kPref1, 455 eps->InstallExtensionPref(eps->ext1, kPref1,
357 Value::CreateStringValue("https://www.chromium.org")); 456 Value::CreateStringValue("https://www.chromium.org"));
358 Mock::VerifyAndClearExpectations(pref_notifier); 457 Mock::VerifyAndClearExpectations(pref_notifier);
359 458
360 EXPECT_CALL(*pref_notifier, FireObservers(kPref1)).Times(0); 459 EXPECT_CALL(*pref_notifier, FireObservers(kPref1)).Times(0);
361 eps->InstallExtensionPref(eps->ext1, kPref1, 460 eps->InstallExtensionPref(eps->ext1, kPref1,
362 Value::CreateStringValue("https://www.chromium.org")); 461 Value::CreateStringValue("https://www.chromium.org"));
363 Mock::VerifyAndClearExpectations(pref_notifier); 462 Mock::VerifyAndClearExpectations(pref_notifier);
364 463
365 EXPECT_CALL(*pref_notifier, FireObservers(kPref1)).Times(2); 464 EXPECT_CALL(*pref_notifier, FireObservers(StrEq(kPref1))).Times(2);
366 eps->InstallExtensionPref(eps->ext1, kPref1, 465 eps->InstallExtensionPref(eps->ext1, kPref1,
367 Value::CreateStringValue("chrome://newtab")); 466 Value::CreateStringValue("chrome://newtab"));
368 eps->UninstallExtension(eps->ext1); 467 eps->UninstallExtension(eps->ext1);
369 } 468 }
469
470 // Make sure the precedence is respected when extensions are loaded
471 // and the precedence of extensions has been defined in the pref stores already.
472 TEST_F(ExtensionPrefStoreTest, InstallRegisteredExtensions) {
473 TestExtensionPrefStore& eps = *eps_;
474 ASSERT_TRUE(eps.ext1 != NULL);
475
476 ListValue* extensionPrefs = new ListValue();
477 ups_->prefs()->Set(ExtensionPrefStore::kExtensionPreferencesKey,
478 extensionPrefs);
479
480 ExtensionPrefStore::ExtensionStack es;
481 es.Init(extensionPrefs);
482
483 ExtensionPrefStore::ExtensionPrefs ext3 = es.CreateEntry(eps.ext3->id());
484 ExtensionPrefStore::ExtensionPrefs ext1 = es.CreateEntry(eps.ext1->id());
485 ExtensionPrefStore::ExtensionPrefs ext2 = es.CreateEntry(eps.ext2->id());
486 // Precedence: 3 < 1 < 2 --> 3 wins.
487
488 TestExtensionPrefStore::ExtensionIDs ids;
489 eps.GetExtensionIDList(&ids);
490 ASSERT_EQ(3u, ids.size());
491 EXPECT_EQ(eps.ext2->id(), ids[0]);
492 EXPECT_EQ(eps.ext1->id(), ids[1]);
493 EXPECT_EQ(eps.ext3->id(), ids[2]);
494
495 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
496 {
497 DictionaryValue* prefs = eps.prefs();
498 ASSERT_EQ(1u, prefs->size());
499 std::string actual;
500 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
501 EXPECT_EQ("val1", actual);
502 }
503
504 // ext2 has higher higher precedence --> override.
505 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
506 {
507 DictionaryValue* prefs = eps.prefs();
508 ASSERT_EQ(1u, prefs->size());
509 std::string actual;
510 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
511 EXPECT_EQ("val2", actual);
512 }
513
514 // ext3 has lower precedence --> does not override.
515 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
516 {
517 DictionaryValue* prefs = eps.prefs();
518 ASSERT_EQ(1u, prefs->size());
519 std::string actual;
520 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
521 EXPECT_EQ("val2", actual);
522 }
523
524 ids.clear();
525 eps.GetExtensionIDList(&ids);
526 ASSERT_EQ(3u, ids.size());
527 EXPECT_EQ(eps.ext2->id(), ids[0]);
528 EXPECT_EQ(eps.ext1->id(), ids[1]);
529 EXPECT_EQ(eps.ext3->id(), ids[2]);
530 }
531
532 // Make sure the precedence is respected when extensions are loaded and
533 // uninstalled later.
534 TEST_F(ExtensionPrefStoreTest, UninstallRegisteredExtensions) {
535 TestExtensionPrefStore& eps = *eps_;
536 ASSERT_TRUE(eps.ext1 != NULL);
537
538 ListValue *extensionPrefs = new ListValue();
539 ups_->prefs()->Set(ExtensionPrefStore::kExtensionPreferencesKey,
540 extensionPrefs);
541
542 ExtensionPrefStore::ExtensionStack es;
543 es.Init(extensionPrefs);
544
545 ExtensionPrefStore::ExtensionPrefs ext3 = es.CreateEntry(eps.ext3->id());
546 ExtensionPrefStore::ExtensionPrefs ext1 = es.CreateEntry(eps.ext1->id());
547 ExtensionPrefStore::ExtensionPrefs ext2 = es.CreateEntry(eps.ext2->id());
548 // precedence: 3 < 1 < 2 --> 3 wins
549
550 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
551 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
552 eps.InstallExtensionPref(eps.ext3, kPref1, Value::CreateStringValue("val3"));
553
554 // Correct state of this setup is ensured by InstallRegisteredExtensions test
555
556 eps.UninstallExtension(eps.ext2);
557 {
558 DictionaryValue* prefs = eps.prefs();
559 ASSERT_EQ(1u, prefs->size());
560 std::string actual;
561 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
562 EXPECT_EQ("val1", actual);
563 }
564
565 TestExtensionPrefStore::ExtensionIDs ids;
566 eps.GetExtensionIDList(&ids);
567 ASSERT_EQ(2u, ids.size());
568 EXPECT_EQ(eps.ext1->id(), ids[0]);
569 EXPECT_EQ(eps.ext3->id(), ids[1]);
570 }
571
572 // Make sure that preregistered preference values are available before extension
573 // is registered.
574 TEST_F(ExtensionPrefStoreTest, ReadFromRegisteredExtensions) {
575 TestExtensionPrefStore& eps = *eps_;
576 ASSERT_TRUE(eps.ext1 != NULL);
577
578 ListValue *extensionPrefs = new ListValue();
579 ups_->prefs()->Set(ExtensionPrefStore::kExtensionPreferencesKey,
580 extensionPrefs);
581
582 ExtensionPrefStore::ExtensionStack es;
583 es.Init(extensionPrefs);
584
585 ExtensionPrefStore::ExtensionPrefs ext1 = es.CreateEntry(eps.ext1->id());
586 ext1.Set(kPref1, Value::CreateStringValue("val1"));
587
588 TestExtensionPrefStore::ExtensionIDs ids;
589 eps.GetExtensionIDList(&ids);
590 ASSERT_EQ(1u, ids.size());
591 EXPECT_EQ(eps.ext1->id(), ids[0]);
592
593 // Check value is available before extension is started.
594 {
595 DictionaryValue* prefs = eps.prefs();
596 ASSERT_EQ(1u, prefs->size());
597 std::string actual;
598 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
599 EXPECT_EQ("val1", actual);
600 }
601
602 // Check value can be overriden when extension is started.
603 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val2"));
604 {
605 DictionaryValue* prefs = eps.prefs();
606 ASSERT_EQ(1u, prefs->size());
607 std::string actual;
608 EXPECT_TRUE(prefs->GetString(kPref1, &actual));
609 EXPECT_EQ("val2", actual);
610 }
611
612 ids.clear();
613 eps.GetExtensionIDList(&ids);
614 ASSERT_EQ(1u, ids.size());
615 EXPECT_EQ(eps.ext1->id(), ids[0]);
616 }
617
618 TEST_F(ExtensionPrefStoreTest, TestPersistence) {
619 // Check whether changes are persisted.
620 using testing::Mock;
621
622 TestExtensionPrefStore& eps = *eps_;
623
624 // install pref
625 EXPECT_CALL(eps, SchedulePersist());
626 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val1"));
627 Mock::VerifyAndClearExpectations(&eps);
628
629 // overwrite by different extension
630 EXPECT_CALL(eps, SchedulePersist());
631 eps.InstallExtensionPref(eps.ext2, kPref1, Value::CreateStringValue("val2"));
632 Mock::VerifyAndClearExpectations(&eps);
633
634 // overwrite
635 EXPECT_CALL(eps, SchedulePersist());
636 eps.InstallExtensionPref(eps.ext1, kPref1, Value::CreateStringValue("val3"));
637 Mock::VerifyAndClearExpectations(&eps);
638
639 // add second pref
640 EXPECT_CALL(eps, SchedulePersist());
641 eps.InstallExtensionPref(eps.ext1, kPref2, Value::CreateStringValue("val4"));
642 Mock::VerifyAndClearExpectations(&eps);
643
644 // uninstall
645 EXPECT_CALL(eps, SchedulePersist());
646 eps.UninstallExtension(eps.ext1);
647 Mock::VerifyAndClearExpectations(&eps);
648 }
649
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_pref_store.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698