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

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

Issue 14757022: Add a non-blocking "OneShotEvent" class (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: dcronin's comments; ExtensionSystem::ready; and WeakPtr support Created 7 years, 7 months 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/extensions/component_loader.h" 5 #include "chrome/browser/extensions/component_loader.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
11 #include "base/prefs/pref_registry_simple.h" 11 #include "base/prefs/pref_registry_simple.h"
12 #include "chrome/browser/extensions/test_extension_service.h" 12 #include "chrome/browser/extensions/test_extension_service.h"
13 #include "chrome/common/chrome_paths.h" 13 #include "chrome/common/chrome_paths.h"
14 #include "chrome/common/extensions/background_info.h" 14 #include "chrome/common/extensions/background_info.h"
15 #include "chrome/common/extensions/extension.h" 15 #include "chrome/common/extensions/extension.h"
16 #include "chrome/common/extensions/extension_set.h" 16 #include "chrome/common/extensions/extension_set.h"
17 #include "chrome/common/pref_names.h" 17 #include "chrome/common/pref_names.h"
18 #include "chrome/test/base/testing_pref_service_syncable.h" 18 #include "chrome/test/base/testing_pref_service_syncable.h"
19 #include "components/user_prefs/pref_registry_syncable.h" 19 #include "components/user_prefs/pref_registry_syncable.h"
20 #include "extensions/common/constants.h" 20 #include "extensions/common/constants.h"
21 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
22 22
23 namespace extensions { 23 namespace extensions {
24 24
25 namespace { 25 namespace {
26 26
27 class MockExtensionService : public TestExtensionService { 27 class MockExtensionService : public TestExtensionService {
28 private: 28 private:
29 bool ready_;
30 size_t unloaded_count_; 29 size_t unloaded_count_;
31 ExtensionSet extension_set_; 30 ExtensionSet extension_set_;
32 31
33 public: 32 public:
34 MockExtensionService() : ready_(false), unloaded_count_(0) { 33 MockExtensionService() : unloaded_count_(0) {
35 } 34 }
36 35
37 virtual void AddComponentExtension(const Extension* extension) OVERRIDE { 36 virtual void AddComponentExtension(const Extension* extension) OVERRIDE {
38 EXPECT_FALSE(extension_set_.Contains(extension->id())); 37 EXPECT_FALSE(extension_set_.Contains(extension->id())) << extension->id();
39 // ExtensionService must become the owner of the extension object. 38 // ExtensionService must become the owner of the extension object.
40 extension_set_.Insert(extension); 39 extension_set_.Insert(extension);
41 } 40 }
42 41
43 virtual void UnloadExtension( 42 virtual void UnloadExtension(
44 const std::string& extension_id, 43 const std::string& extension_id,
45 extension_misc::UnloadedExtensionReason reason) OVERRIDE { 44 extension_misc::UnloadedExtensionReason reason) OVERRIDE {
46 ASSERT_TRUE(extension_set_.Contains(extension_id)); 45 ASSERT_TRUE(extension_set_.Contains(extension_id));
47 // Remove the extension with the matching id. 46 // Remove the extension with the matching id.
48 extension_set_.Remove(extension_id); 47 extension_set_.Remove(extension_id);
49 unloaded_count_++; 48 unloaded_count_++;
50 } 49 }
51 50
52 virtual bool is_ready() OVERRIDE {
53 return ready_;
54 }
55
56 virtual const ExtensionSet* extensions() const OVERRIDE { 51 virtual const ExtensionSet* extensions() const OVERRIDE {
57 return &extension_set_; 52 return &extension_set_;
58 } 53 }
59 54
60 void set_ready(bool ready) { 55 void set_ready() {
61 ready_ = ready; 56 ready_.MarkHappened();
62 } 57 }
63 58
64 size_t unloaded_count() const { 59 size_t unloaded_count() const {
65 return unloaded_count_; 60 return unloaded_count_;
66 } 61 }
67 62
68 void clear_extensions() { 63 void clear_extensions() {
69 extension_set_.Clear(); 64 extension_set_.Clear();
70 } 65 }
71 }; 66 };
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 EXPECT_EQ(2, value); 167 EXPECT_EQ(2, value);
173 168
174 std::string string_value; 169 std::string string_value;
175 manifest.reset(component_loader_.ParseManifest(manifest_contents_)); 170 manifest.reset(component_loader_.ParseManifest(manifest_contents_));
176 ASSERT_TRUE(manifest->GetString("background.page", &string_value)); 171 ASSERT_TRUE(manifest->GetString("background.page", &string_value));
177 EXPECT_EQ("backgroundpage.html", string_value); 172 EXPECT_EQ("backgroundpage.html", string_value);
178 } 173 }
179 174
180 // Test that the extension isn't loaded if the extension service isn't ready. 175 // Test that the extension isn't loaded if the extension service isn't ready.
181 TEST_F(ComponentLoaderTest, AddWhenNotReady) { 176 TEST_F(ComponentLoaderTest, AddWhenNotReady) {
182 extension_service_.set_ready(false);
183 std::string extension_id = 177 std::string extension_id =
184 component_loader_.Add(manifest_contents_, extension_path_); 178 component_loader_.Add(manifest_contents_, extension_path_);
185 EXPECT_NE("", extension_id); 179 EXPECT_NE("", extension_id);
186 EXPECT_EQ(0u, extension_service_.extensions()->size()); 180 EXPECT_EQ(0u, extension_service_.extensions()->size());
187 } 181 }
188 182
189 // Test that it *is* loaded when the extension service *is* ready. 183 // Test that it *is* loaded when the extension service *is* ready.
190 TEST_F(ComponentLoaderTest, AddWhenReady) { 184 TEST_F(ComponentLoaderTest, AddWhenReady) {
191 extension_service_.set_ready(true); 185 extension_service_.set_ready();
192 std::string extension_id = 186 std::string extension_id =
193 component_loader_.Add(manifest_contents_, extension_path_); 187 component_loader_.Add(manifest_contents_, extension_path_);
194 EXPECT_NE("", extension_id); 188 EXPECT_NE("", extension_id);
195 EXPECT_EQ(1u, extension_service_.extensions()->size()); 189 EXPECT_EQ(1u, extension_service_.extensions()->size());
196 EXPECT_TRUE(extension_service_.extensions()->GetByID(extension_id)); 190 EXPECT_TRUE(extension_service_.extensions()->GetByID(extension_id));
197 } 191 }
198 192
199 TEST_F(ComponentLoaderTest, Remove) { 193 TEST_F(ComponentLoaderTest, Remove) {
200 extension_service_.set_ready(false);
201
202 // Removing an extension that was never added should be ok. 194 // Removing an extension that was never added should be ok.
203 component_loader_.Remove(extension_path_); 195 component_loader_.Remove(extension_path_);
204 EXPECT_EQ(0u, extension_service_.extensions()->size()); 196 EXPECT_EQ(0u, extension_service_.extensions()->size());
205 197
206 // Try adding and removing before LoadAll() is called. 198 // Try adding and removing before LoadAll() is called.
207 component_loader_.Add(manifest_contents_, extension_path_); 199 component_loader_.Add(manifest_contents_, extension_path_);
208 component_loader_.Remove(extension_path_); 200 component_loader_.Remove(extension_path_);
209 component_loader_.LoadAll(); 201 component_loader_.LoadAll();
210 EXPECT_EQ(0u, extension_service_.extensions()->size()); 202 EXPECT_EQ(0u, extension_service_.extensions()->size());
211 203
212 // Load an extension, and check that it's unloaded when Remove() is called. 204 // Load an extension, and check that it's unloaded when Remove() is called.
213 extension_service_.set_ready(true); 205 extension_service_.set_ready();
214 std::string extension_id = 206 std::string extension_id =
215 component_loader_.Add(manifest_contents_, extension_path_); 207 component_loader_.Add(manifest_contents_, extension_path_);
216 EXPECT_EQ(1u, extension_service_.extensions()->size()); 208 EXPECT_EQ(1u, extension_service_.extensions()->size());
217 component_loader_.Remove(extension_path_); 209 component_loader_.Remove(extension_path_);
218 EXPECT_EQ(0u, extension_service_.extensions()->size()); 210 EXPECT_EQ(0u, extension_service_.extensions()->size());
219 211
220 // And after calling LoadAll(), it shouldn't get loaded. 212 // And after calling LoadAll(), it shouldn't get loaded.
221 component_loader_.LoadAll(); 213 component_loader_.LoadAll();
222 EXPECT_EQ(0u, extension_service_.extensions()->size()); 214 EXPECT_EQ(0u, extension_service_.extensions()->size());
223 } 215 }
224 216
225 TEST_F(ComponentLoaderTest, LoadAll) { 217 TEST_F(ComponentLoaderTest, LoadAll) {
226 extension_service_.set_ready(false);
227
228 // No extensions should be loaded if none were added. 218 // No extensions should be loaded if none were added.
229 component_loader_.LoadAll(); 219 component_loader_.LoadAll();
230 EXPECT_EQ(0u, extension_service_.extensions()->size()); 220 EXPECT_EQ(0u, extension_service_.extensions()->size());
231 221
232 // Use LoadAll() to load the default extensions. 222 // Use LoadAll() to load the default extensions.
233 component_loader_.AddDefaultComponentExtensions(false); 223 component_loader_.AddDefaultComponentExtensions(false);
234 component_loader_.LoadAll(); 224 component_loader_.LoadAll();
235 unsigned int default_count = extension_service_.extensions()->size(); 225 unsigned int default_count = extension_service_.extensions()->size();
236 226
237 // Clear the list of loaded extensions, and reload with one more. 227 // Clear the list of loaded extensions, and reload with one more.
238 extension_service_.clear_extensions(); 228 extension_service_.clear_extensions();
239 component_loader_.Add(manifest_contents_, extension_path_); 229 component_loader_.Add(manifest_contents_, extension_path_);
240 component_loader_.LoadAll(); 230 component_loader_.LoadAll();
241 231
242 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size()); 232 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
243 } 233 }
244 234
245 TEST_F(ComponentLoaderTest, RemoveAll) { 235 TEST_F(ComponentLoaderTest, RemoveAll) {
246 extension_service_.set_ready(true); 236 extension_service_.set_ready();
247 EXPECT_EQ(0u, extension_service_.extensions()->size()); 237 EXPECT_EQ(0u, extension_service_.extensions()->size());
248 // Add all the default extensions. Since the extension service is ready, they 238 // Add all the default extensions. Since the extension service is ready, they
249 // will be loaded immediately. 239 // will be loaded immediately.
250 component_loader_.AddDefaultComponentExtensions(false); 240 component_loader_.AddDefaultComponentExtensions(false);
251 unsigned int default_count = extension_service_.extensions()->size(); 241 unsigned int default_count = extension_service_.extensions()->size();
252 242
253 // And add one more just to make sure there is anything in there in case 243 // And add one more just to make sure there is anything in there in case
254 // there are no defaults for this platform. 244 // there are no defaults for this platform.
255 component_loader_.Add(manifest_contents_, extension_path_); 245 component_loader_.Add(manifest_contents_, extension_path_);
256 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size()); 246 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
257 247
258 // Remove all default extensions. 248 // Remove all default extensions.
259 component_loader_.RemoveAll(); 249 component_loader_.RemoveAll();
260 EXPECT_EQ(0u, extension_service_.extensions()->size()); 250 EXPECT_EQ(0u, extension_service_.extensions()->size());
261 } 251 }
262 252
263 TEST_F(ComponentLoaderTest, EnterpriseWebStore) { 253 static const char kEnterpriseWebStoreId[] = "afchcafgojfnemjkcbhfekplkmjaldaa";
254
255 TEST_F(ComponentLoaderTest, EnterpriseWebStoreSettingPrefLoadsExtension) {
264 component_loader_.AddDefaultComponentExtensions(false); 256 component_loader_.AddDefaultComponentExtensions(false);
265 component_loader_.LoadAll(); 257 component_loader_.LoadAll();
266 unsigned int default_count = extension_service_.extensions()->size(); 258 unsigned int default_count = extension_service_.extensions()->size();
259 EXPECT_FALSE(
260 extension_service_.extensions()->Contains(kEnterpriseWebStoreId));
267 261
268 // Set the pref, and it should get loaded automatically. 262 // Set the pref, and it should get loaded automatically.
269 extension_service_.set_ready(true); 263 extension_service_.set_ready();
270 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, 264 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL,
271 Value::CreateStringValue("http://www.google.com")); 265 Value::CreateStringValue("http://www.google.com"));
272 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size()); 266 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
273 267 EXPECT_TRUE(extension_service_.extensions()->Contains(kEnterpriseWebStoreId));
274 // Now that the pref is set, check if it's added by default.
275 extension_service_.set_ready(false);
276 extension_service_.clear_extensions();
277 component_loader_.ClearAllRegistered();
278 component_loader_.AddDefaultComponentExtensions(false);
279 component_loader_.LoadAll();
280 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
281 268
282 // Number of loaded extensions should be the same after changing the pref. 269 // Number of loaded extensions should be the same after changing the pref.
283 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, 270 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL,
284 Value::CreateStringValue("http://www.google.de")); 271 Value::CreateStringValue("http://www.google.de"));
285 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size()); 272 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
286 } 273 }
287 274
275 TEST_F(ComponentLoaderTest, EnterpriseWebStoreExtensionLoadsIfPrefSet) {
276 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL,
277 Value::CreateStringValue("http://www.google.com"));
278 EXPECT_EQ(0U, extension_service_.extensions()->size());
279 component_loader_.AddDefaultComponentExtensions(false);
280 component_loader_.LoadAll();
281
282 // Now that the pref is set, check if it's added by default.
283 EXPECT_TRUE(extension_service_.extensions()->Contains(kEnterpriseWebStoreId));
284 unsigned int extension_count = extension_service_.extensions()->size();
285
286 // Number of loaded extensions should be the same after changing the pref.
287 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL,
288 Value::CreateStringValue("http://www.google.de"));
289 EXPECT_EQ(extension_count, extension_service_.extensions()->size());
290 }
291
288 TEST_F(ComponentLoaderTest, AddOrReplace) { 292 TEST_F(ComponentLoaderTest, AddOrReplace) {
289 EXPECT_EQ(0u, component_loader_.registered_extensions_count()); 293 EXPECT_EQ(0u, component_loader_.registered_extensions_count());
290 component_loader_.AddDefaultComponentExtensions(false); 294 component_loader_.AddDefaultComponentExtensions(false);
291 size_t const default_count = component_loader_.registered_extensions_count(); 295 size_t const default_count = component_loader_.registered_extensions_count();
292 base::FilePath known_extension = GetBasePath() 296 base::FilePath known_extension = GetBasePath()
293 .AppendASCII("override_component_extension"); 297 .AppendASCII("override_component_extension");
294 base::FilePath unknow_extension = extension_path_; 298 base::FilePath unknow_extension = extension_path_;
295 299
296 // Replace a default component extension. 300 // Replace a default component extension.
297 component_loader_.AddOrReplace(known_extension); 301 component_loader_.AddOrReplace(known_extension);
298 EXPECT_EQ(default_count, 302 EXPECT_EQ(default_count,
299 component_loader_.registered_extensions_count()); 303 component_loader_.registered_extensions_count());
300 304
301 // Add a new component extension. 305 // Add a new component extension.
302 component_loader_.AddOrReplace(unknow_extension); 306 component_loader_.AddOrReplace(unknow_extension);
303 EXPECT_EQ(default_count + 1, 307 EXPECT_EQ(default_count + 1,
304 component_loader_.registered_extensions_count()); 308 component_loader_.registered_extensions_count());
305 309
306 extension_service_.set_ready(true); 310 extension_service_.set_ready();
307 component_loader_.LoadAll(); 311 component_loader_.LoadAll();
308 312
309 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size()); 313 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
310 EXPECT_EQ(0u, extension_service_.unloaded_count()); 314 EXPECT_EQ(0u, extension_service_.unloaded_count());
311 315
312 // replace loaded component extension. 316 // replace loaded component extension.
313 component_loader_.AddOrReplace(known_extension); 317 component_loader_.AddOrReplace(known_extension);
314 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size()); 318 EXPECT_EQ(default_count + 1, extension_service_.extensions()->size());
315 EXPECT_EQ(1u, extension_service_.unloaded_count()); 319 EXPECT_EQ(1u, extension_service_.unloaded_count());
316 } 320 }
317 321
318 } // namespace extensions 322 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698