Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <string> | |
| 6 | |
| 7 #include "chrome/browser/extensions/component_loader.h" | |
| 8 | |
| 9 #include "base/file_util.h" | |
| 10 #include "base/path_service.h" | |
| 11 #include "chrome/browser/extensions/test_extension_service.h" | |
| 12 #include "chrome/common/chrome_paths.h" | |
| 13 #include "chrome/common/extensions/extension.h" | |
| 14 #include "chrome/common/pref_names.h" | |
| 15 #include "chrome/test/base/testing_pref_service.h" | |
| 16 #include "testing/gtest/include/gtest/gtest.h" | |
| 17 | |
| 18 class StubExtensionService : public TestExtensionService { | |
|
Aaron Boodman
2011/11/15 17:34:47
Name this "MockExtensionService?" Also, it should
Patrick Dubroy
2011/11/15 19:19:16
Done and done.
I named it that way because some p
| |
| 19 private: | |
| 20 bool ready_; | |
| 21 ExtensionList extension_list_; | |
| 22 | |
| 23 public: | |
| 24 StubExtensionService() : ready_(false) { | |
| 25 } | |
| 26 | |
| 27 virtual void AddExtension(const Extension* extension) OVERRIDE { | |
| 28 // ExtensionService must become the owner of the extension object. | |
| 29 extension_list_.push_back(extension); | |
| 30 } | |
| 31 | |
| 32 virtual void UnloadExtension( | |
| 33 const std::string& extension_id, | |
| 34 extension_misc::UnloadedExtensionReason reason) OVERRIDE { | |
| 35 // Remove the extension with the matching id. | |
| 36 for (ExtensionList::iterator it = extension_list_.begin(); | |
| 37 it != extension_list_.end(); | |
| 38 ++it) { | |
| 39 if ((*it)->id() == extension_id) { | |
| 40 extension_list_.erase(it); | |
| 41 return; | |
| 42 } | |
| 43 } | |
| 44 } | |
| 45 | |
| 46 virtual bool is_ready() OVERRIDE { | |
| 47 return ready_; | |
| 48 } | |
| 49 | |
| 50 virtual const ExtensionList* extensions() const OVERRIDE { | |
| 51 return &extension_list_; | |
| 52 } | |
| 53 | |
| 54 void set_ready(bool ready) { | |
| 55 ready_ = ready; | |
| 56 } | |
| 57 | |
| 58 void clear_extension_list() { | |
| 59 extension_list_.clear(); | |
| 60 } | |
| 61 }; | |
| 62 | |
| 63 namespace extensions { | |
| 64 | |
| 65 class ComponentLoaderTest : public testing::Test { | |
| 66 public: | |
| 67 ComponentLoaderTest() : | |
| 68 component_loader_(&extension_service_, &prefs_) { | |
| 69 } | |
| 70 | |
| 71 void SetUp() { | |
| 72 FilePath test_data_dir; | |
| 73 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); | |
| 74 extension_path_ = | |
| 75 test_data_dir.AppendASCII("extensions") | |
| 76 .AppendASCII("good") | |
| 77 .AppendASCII("Extensions") | |
| 78 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") | |
| 79 .AppendASCII("1.0.0.0"); | |
| 80 | |
| 81 // Read in the extension manifest. | |
| 82 ASSERT_TRUE(file_util::ReadFileToString( | |
| 83 extension_path_.Append(Extension::kManifestFilename), | |
| 84 &manifest_contents_)); | |
| 85 | |
| 86 // Register the prefs that ComponentLoader will read. | |
| 87 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreURL, std::string()); | |
| 88 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreName, std::string()); | |
| 89 } | |
| 90 | |
| 91 protected: | |
| 92 StubExtensionService extension_service_; | |
| 93 TestingPrefService prefs_; | |
| 94 ComponentLoader component_loader_; | |
| 95 | |
| 96 // The root directory of the text extension. | |
| 97 FilePath extension_path_; | |
| 98 | |
| 99 // The contents of the text extension's manifest file. | |
| 100 std::string manifest_contents_; | |
| 101 }; | |
| 102 | |
| 103 TEST_F(ComponentLoaderTest, ParseManifest) { | |
| 104 scoped_ptr<DictionaryValue> manifest; | |
| 105 | |
| 106 // Test invalid JSON. | |
| 107 manifest.reset( | |
| 108 component_loader_.ParseManifest("{ 'test': 3 } invalid")); | |
| 109 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 110 | |
| 111 // Test manifests that are valid JSON, but don't have an object literal | |
| 112 // at the root. ParseManifest() should always return NULL. | |
| 113 | |
| 114 manifest.reset(component_loader_.ParseManifest("")); | |
| 115 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 116 | |
| 117 manifest.reset(component_loader_.ParseManifest("[{ \"foo\": 3 }]")); | |
| 118 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 119 | |
| 120 manifest.reset(component_loader_.ParseManifest("\"Test\"")); | |
| 121 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 122 | |
| 123 manifest.reset(component_loader_.ParseManifest("42")); | |
| 124 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 125 | |
| 126 manifest.reset(component_loader_.ParseManifest("true")); | |
| 127 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 128 | |
| 129 manifest.reset(component_loader_.ParseManifest("false")); | |
| 130 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 131 | |
| 132 manifest.reset(component_loader_.ParseManifest("null")); | |
| 133 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | |
| 134 | |
| 135 // Test parsing valid JSON. | |
| 136 | |
| 137 int value; | |
| 138 manifest.reset(component_loader_.ParseManifest( | |
| 139 "{ \"test\": { \"one\": 1 }, \"two\": 2 }")); | |
| 140 ASSERT_NE(manifest.get(), (DictionaryValue*)NULL); | |
| 141 ASSERT_TRUE(manifest->GetInteger("test.one", &value)); | |
| 142 ASSERT_EQ(1, value); | |
| 143 ASSERT_TRUE(manifest->GetInteger("two", &value)); | |
| 144 ASSERT_EQ(2, value); | |
| 145 | |
| 146 std::string string_value; | |
| 147 manifest.reset(component_loader_.ParseManifest(manifest_contents_)); | |
| 148 ASSERT_TRUE(manifest->GetString("background_page", &string_value)); | |
| 149 ASSERT_EQ("backgroundpage.html", string_value); | |
| 150 } | |
| 151 | |
| 152 // Test that the extension isn't loaded if the extension service isn't ready. | |
| 153 TEST_F(ComponentLoaderTest, AddWhenNotReady) { | |
| 154 scoped_refptr<const Extension> extension; | |
| 155 extension_service_.set_ready(false); | |
| 156 extension = component_loader_.Add(manifest_contents_, extension_path_); | |
| 157 ASSERT_EQ((Extension*)NULL, extension.get()); | |
| 158 ASSERT_EQ(0U, extension_service_.extensions()->size()); | |
|
Aaron Boodman
2011/11/15 17:34:47
Nit: we use the lowercase "u" elsewhere in the cod
Patrick Dubroy
2011/11/15 19:19:16
Seems like we use both pretty heavily:
/usr/local
| |
| 159 } | |
| 160 | |
| 161 // Test that it *is* loaded when the extension service *is* ready. | |
| 162 TEST_F(ComponentLoaderTest, AddWhenReady) { | |
| 163 scoped_refptr<const Extension> extension; | |
| 164 extension_service_.set_ready(true); | |
| 165 extension = component_loader_.Add(manifest_contents_, extension_path_); | |
| 166 ASSERT_NE((Extension*)NULL, extension.get()); | |
| 167 ASSERT_EQ(1U, extension_service_.extensions()->size()); | |
| 168 } | |
| 169 | |
| 170 TEST_F(ComponentLoaderTest, Remove) { | |
| 171 extension_service_.set_ready(false); | |
| 172 | |
| 173 // Removing an extension that was never added should be ok. | |
| 174 component_loader_.Remove(extension_path_); | |
| 175 ASSERT_EQ(0U, extension_service_.extensions()->size()); | |
| 176 | |
| 177 // Try adding and removing before LoadAll() is called. | |
| 178 component_loader_.Add(manifest_contents_, extension_path_); | |
| 179 component_loader_.Remove(extension_path_); | |
| 180 component_loader_.LoadAll(); | |
| 181 ASSERT_EQ(0U, extension_service_.extensions()->size()); | |
| 182 | |
| 183 // Load an extension, and check that it's unloaded when Remove() is called. | |
| 184 scoped_refptr<const Extension> extension; | |
| 185 extension_service_.set_ready(true); | |
| 186 extension = component_loader_.Add(manifest_contents_, extension_path_); | |
| 187 ASSERT_NE((Extension*)NULL, extension.get()); | |
| 188 component_loader_.Remove(extension_path_); | |
| 189 ASSERT_EQ(0U, extension_service_.extensions()->size()); | |
| 190 | |
| 191 // And after calling LoadAll(), it shouldn't get loaded. | |
| 192 component_loader_.LoadAll(); | |
| 193 ASSERT_EQ(0U, extension_service_.extensions()->size()); | |
| 194 } | |
| 195 | |
| 196 TEST_F(ComponentLoaderTest, LoadAll) { | |
| 197 extension_service_.set_ready(false); | |
| 198 | |
| 199 // No extensions should be loaded if none were added. | |
| 200 component_loader_.LoadAll(); | |
| 201 ASSERT_EQ(0U, extension_service_.extensions()->size()); | |
| 202 | |
| 203 // Use LoadAll() to load the default extensions. | |
| 204 component_loader_.AddDefaultComponentExtensions(); | |
| 205 component_loader_.LoadAll(); | |
| 206 unsigned int default_count = extension_service_.extensions()->size(); | |
| 207 | |
| 208 // Clear the list of loaded extensions, and reload with one more. | |
| 209 extension_service_.clear_extension_list(); | |
| 210 component_loader_.Add(manifest_contents_, extension_path_); | |
| 211 component_loader_.LoadAll(); | |
| 212 | |
| 213 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | |
| 214 } | |
| 215 | |
| 216 TEST_F(ComponentLoaderTest, EnterpriseWebStore) { | |
| 217 component_loader_.AddDefaultComponentExtensions(); | |
| 218 component_loader_.LoadAll(); | |
| 219 unsigned int default_count = extension_service_.extensions()->size(); | |
| 220 | |
| 221 // Set the pref, and it should get loaded automatically. | |
| 222 extension_service_.set_ready(true); | |
| 223 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, | |
| 224 Value::CreateStringValue("http://www.google.com")); | |
| 225 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | |
| 226 | |
| 227 // Now that the pref is set, check if it's added by default. | |
| 228 extension_service_.set_ready(false); | |
| 229 extension_service_.clear_extension_list(); | |
| 230 component_loader_.ClearAllRegisteredForTesting(); | |
| 231 component_loader_.AddDefaultComponentExtensions(); | |
| 232 component_loader_.LoadAll(); | |
| 233 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | |
| 234 | |
| 235 // Number of loaded extensions should be the same after changing the pref. | |
| 236 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, | |
| 237 Value::CreateStringValue("http://www.google.de")); | |
| 238 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | |
| 239 } | |
| 240 | |
| 241 } // namespace extensions | |
| OLD | NEW |