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

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

Powered by Google App Engine
This is Rietveld 408576698