Index: chrome/browser/extensions/component_loader_unittest.cc |
diff --git a/chrome/browser/extensions/component_loader_unittest.cc b/chrome/browser/extensions/component_loader_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e3d8c81166f775f8e76461e27b5490e7b2fe4a0 |
--- /dev/null |
+++ b/chrome/browser/extensions/component_loader_unittest.cc |
@@ -0,0 +1,252 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <string> |
+ |
+#include "chrome/browser/extensions/component_loader.h" |
+ |
+#include "base/file_util.h" |
+#include "base/path_service.h" |
+#include "chrome/browser/extensions/test_extension_service.h" |
+#include "chrome/common/chrome_paths.h" |
+#include "chrome/common/extensions/extension.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/test/base/testing_pref_service.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+class MockExtensionService : public TestExtensionService { |
+ private: |
+ bool ready_; |
+ ExtensionList extension_list_; |
+ |
+ public: |
+ MockExtensionService() : ready_(false) { |
+ } |
+ |
+ virtual void AddExtension(const Extension* extension) OVERRIDE { |
+ // ExtensionService must become the owner of the extension object. |
+ extension_list_.push_back(extension); |
+ } |
+ |
+ virtual void UnloadExtension( |
+ const std::string& extension_id, |
+ extension_misc::UnloadedExtensionReason reason) OVERRIDE { |
+ // Remove the extension with the matching id. |
+ for (ExtensionList::iterator it = extension_list_.begin(); |
+ it != extension_list_.end(); |
+ ++it) { |
+ if ((*it)->id() == extension_id) { |
+ extension_list_.erase(it); |
+ return; |
+ } |
+ } |
+ } |
+ |
+ virtual bool is_ready() OVERRIDE { |
+ return ready_; |
+ } |
+ |
+ virtual const ExtensionList* extensions() const OVERRIDE { |
+ return &extension_list_; |
+ } |
+ |
+ void set_ready(bool ready) { |
+ ready_ = ready; |
+ } |
+ |
+ void clear_extension_list() { |
+ extension_list_.clear(); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+namespace extensions { |
+ |
+class ComponentLoaderTest : public testing::Test { |
+ public: |
+ ComponentLoaderTest() : |
+ // Note: we pass the same pref service here, to stand in for both |
+ // user prefs and local state. |
+ component_loader_(&extension_service_, &prefs_, &prefs_) { |
+ } |
+ |
+ void SetUp() { |
+ FilePath test_data_dir; |
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); |
+ extension_path_ = |
+ test_data_dir.AppendASCII("extensions") |
+ .AppendASCII("good") |
+ .AppendASCII("Extensions") |
+ .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
+ .AppendASCII("1.0.0.0"); |
+ |
+ // Read in the extension manifest. |
+ ASSERT_TRUE(file_util::ReadFileToString( |
+ extension_path_.Append(Extension::kManifestFilename), |
+ &manifest_contents_)); |
+ |
+ // Register the user prefs that ComponentLoader will read. |
+ prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreURL, std::string()); |
+ prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreName, std::string()); |
+ |
+ // Register the local state prefs. |
+#if defined(OS_CHROMEOS) |
+ prefs_.RegisterBooleanPref(prefs::kAccessibilityEnabled, false); |
+#endif |
+ } |
+ |
+ protected: |
+ MockExtensionService extension_service_; |
+ TestingPrefService prefs_; |
+ ComponentLoader component_loader_; |
+ |
+ // The root directory of the text extension. |
+ FilePath extension_path_; |
+ |
+ // The contents of the text extension's manifest file. |
+ std::string manifest_contents_; |
+}; |
+ |
+TEST_F(ComponentLoaderTest, ParseManifest) { |
+ scoped_ptr<DictionaryValue> manifest; |
+ |
+ // Test invalid JSON. |
+ manifest.reset( |
+ component_loader_.ParseManifest("{ 'test': 3 } invalid")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ // Test manifests that are valid JSON, but don't have an object literal |
+ // at the root. ParseManifest() should always return NULL. |
+ |
+ manifest.reset(component_loader_.ParseManifest("")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ manifest.reset(component_loader_.ParseManifest("[{ \"foo\": 3 }]")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ manifest.reset(component_loader_.ParseManifest("\"Test\"")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ manifest.reset(component_loader_.ParseManifest("42")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ manifest.reset(component_loader_.ParseManifest("true")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ manifest.reset(component_loader_.ParseManifest("false")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ manifest.reset(component_loader_.ParseManifest("null")); |
+ ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
+ |
+ // Test parsing valid JSON. |
+ |
+ int value; |
+ manifest.reset(component_loader_.ParseManifest( |
+ "{ \"test\": { \"one\": 1 }, \"two\": 2 }")); |
+ ASSERT_NE(manifest.get(), (DictionaryValue*)NULL); |
+ ASSERT_TRUE(manifest->GetInteger("test.one", &value)); |
+ ASSERT_EQ(1, value); |
+ ASSERT_TRUE(manifest->GetInteger("two", &value)); |
+ ASSERT_EQ(2, value); |
+ |
+ std::string string_value; |
+ manifest.reset(component_loader_.ParseManifest(manifest_contents_)); |
+ ASSERT_TRUE(manifest->GetString("background_page", &string_value)); |
+ ASSERT_EQ("backgroundpage.html", string_value); |
+} |
+ |
+// Test that the extension isn't loaded if the extension service isn't ready. |
+TEST_F(ComponentLoaderTest, AddWhenNotReady) { |
+ scoped_refptr<const Extension> extension; |
+ extension_service_.set_ready(false); |
+ extension = component_loader_.Add(manifest_contents_, extension_path_); |
+ ASSERT_EQ((Extension*)NULL, extension.get()); |
+ ASSERT_EQ(0U, extension_service_.extensions()->size()); |
+} |
+ |
+// Test that it *is* loaded when the extension service *is* ready. |
+TEST_F(ComponentLoaderTest, AddWhenReady) { |
+ scoped_refptr<const Extension> extension; |
+ extension_service_.set_ready(true); |
+ extension = component_loader_.Add(manifest_contents_, extension_path_); |
+ ASSERT_NE((Extension*)NULL, extension.get()); |
+ ASSERT_EQ(1U, extension_service_.extensions()->size()); |
+} |
+ |
+TEST_F(ComponentLoaderTest, Remove) { |
+ extension_service_.set_ready(false); |
+ |
+ // Removing an extension that was never added should be ok. |
+ component_loader_.Remove(extension_path_); |
+ ASSERT_EQ(0U, extension_service_.extensions()->size()); |
+ |
+ // Try adding and removing before LoadAll() is called. |
+ component_loader_.Add(manifest_contents_, extension_path_); |
+ component_loader_.Remove(extension_path_); |
+ component_loader_.LoadAll(); |
+ ASSERT_EQ(0U, extension_service_.extensions()->size()); |
+ |
+ // Load an extension, and check that it's unloaded when Remove() is called. |
+ scoped_refptr<const Extension> extension; |
+ extension_service_.set_ready(true); |
+ extension = component_loader_.Add(manifest_contents_, extension_path_); |
+ ASSERT_NE((Extension*)NULL, extension.get()); |
+ component_loader_.Remove(extension_path_); |
+ ASSERT_EQ(0U, extension_service_.extensions()->size()); |
+ |
+ // And after calling LoadAll(), it shouldn't get loaded. |
+ component_loader_.LoadAll(); |
+ ASSERT_EQ(0U, extension_service_.extensions()->size()); |
+} |
+ |
+TEST_F(ComponentLoaderTest, LoadAll) { |
+ extension_service_.set_ready(false); |
+ |
+ // No extensions should be loaded if none were added. |
+ component_loader_.LoadAll(); |
+ ASSERT_EQ(0U, extension_service_.extensions()->size()); |
+ |
+ // Use LoadAll() to load the default extensions. |
+ component_loader_.AddDefaultComponentExtensions(); |
+ component_loader_.LoadAll(); |
+ unsigned int default_count = extension_service_.extensions()->size(); |
+ |
+ // Clear the list of loaded extensions, and reload with one more. |
+ extension_service_.clear_extension_list(); |
+ component_loader_.Add(manifest_contents_, extension_path_); |
+ component_loader_.LoadAll(); |
+ |
+ ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
+} |
+ |
+TEST_F(ComponentLoaderTest, EnterpriseWebStore) { |
+ component_loader_.AddDefaultComponentExtensions(); |
+ component_loader_.LoadAll(); |
+ unsigned int default_count = extension_service_.extensions()->size(); |
+ |
+ // Set the pref, and it should get loaded automatically. |
+ extension_service_.set_ready(true); |
+ prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, |
+ Value::CreateStringValue("http://www.google.com")); |
+ ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
+ |
+ // Now that the pref is set, check if it's added by default. |
+ extension_service_.set_ready(false); |
+ extension_service_.clear_extension_list(); |
+ component_loader_.ClearAllRegistered(); |
+ component_loader_.AddDefaultComponentExtensions(); |
+ component_loader_.LoadAll(); |
+ ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
+ |
+ // Number of loaded extensions should be the same after changing the pref. |
+ prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, |
+ Value::CreateStringValue("http://www.google.de")); |
+ ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
+} |
+ |
+} // namespace extensions |