| OLD | NEW |
| 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 "extensions/common/manifest_test.h" | 5 #include "chrome/common/extensions/manifest_tests/extension_manifest_test.h" |
| 6 | 6 |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 9 #include "base/json/json_file_value_serializer.h" | 9 #include "base/json/json_file_value_serializer.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| 11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/common/chrome_paths.h" |
| 13 #include "extensions/common/extension_l10n_util.h" | 14 #include "extensions/common/extension_l10n_util.h" |
| 14 #include "extensions/common/extension_paths.h" | |
| 15 #include "extensions/common/test_util.h" | 15 #include "extensions/common/test_util.h" |
| 16 #include "ui/base/l10n/l10n_util.h" | 16 #include "ui/base/l10n/l10n_util.h" |
| 17 | 17 |
| 18 namespace extensions { | 18 using extensions::Extension; |
| 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 // |manifest_path| is an absolute path to a manifest file. | 22 // If filename is a relative path, LoadManifestFile will treat it relative to |
| 22 base::DictionaryValue* LoadManifestFile(const base::FilePath& manifest_path, | 23 // the appropriate test directory. |
| 24 base::DictionaryValue* LoadManifestFile(const base::FilePath& filename_path, |
| 23 std::string* error) { | 25 std::string* error) { |
| 24 base::FilePath extension_path = manifest_path.DirName(); | 26 base::FilePath extension_path; |
| 27 base::FilePath manifest_path; |
| 28 |
| 29 PathService::Get(chrome::DIR_TEST_DATA, &manifest_path); |
| 30 manifest_path = manifest_path.Append(filename_path); |
| 31 extension_path = manifest_path.DirName(); |
| 25 | 32 |
| 26 EXPECT_TRUE(base::PathExists(manifest_path)) << | 33 EXPECT_TRUE(base::PathExists(manifest_path)) << |
| 27 "Couldn't find " << manifest_path.value(); | 34 "Couldn't find " << manifest_path.value(); |
| 28 | 35 |
| 29 JSONFileValueSerializer serializer(manifest_path); | 36 JSONFileValueSerializer serializer(manifest_path); |
| 30 base::DictionaryValue* manifest = | 37 base::DictionaryValue* manifest = |
| 31 static_cast<base::DictionaryValue*>(serializer.Deserialize(NULL, error)); | 38 static_cast<base::DictionaryValue*>(serializer.Deserialize(NULL, error)); |
| 32 | 39 |
| 33 // Most unit tests don't need localization, and they'll fail if we try to | 40 // Most unit tests don't need localization, and they'll fail if we try to |
| 34 // localize them, since their manifests don't have a default_locale key. | 41 // localize them, since their manifests don't have a default_locale key. |
| 35 // Only localize manifests that indicate they want to be localized. | 42 // Only localize manifests that indicate they want to be localized. |
| 36 // Calling LocalizeExtension at this point mirrors file_util::LoadExtension. | 43 // Calling LocalizeExtension at this point mirrors file_util::LoadExtension. |
| 37 if (manifest && | 44 if (manifest && |
| 38 manifest_path.value().find(FILE_PATH_LITERAL("localized")) != | 45 filename_path.value().find(FILE_PATH_LITERAL("localized")) != |
| 39 std::string::npos) | 46 std::string::npos) |
| 40 extension_l10n_util::LocalizeExtension(extension_path, manifest, error); | 47 extension_l10n_util::LocalizeExtension(extension_path, manifest, error); |
| 41 | 48 |
| 42 return manifest; | 49 return manifest; |
| 43 } | 50 } |
| 44 | 51 |
| 45 } // namespace | 52 } // namespace |
| 46 | 53 |
| 47 ManifestTest::ManifestTest() | 54 ExtensionManifestTest::ExtensionManifestTest() |
| 48 : enable_apps_(true) { | 55 : enable_apps_(true), |
| 49 } | 56 // UNKNOWN == trunk. |
| 50 | 57 current_channel_(chrome::VersionInfo::CHANNEL_UNKNOWN) {} |
| 51 ManifestTest::~ManifestTest() { | |
| 52 } | |
| 53 | 58 |
| 54 // Helper class that simplifies creating methods that take either a filename | 59 // Helper class that simplifies creating methods that take either a filename |
| 55 // to a manifest or the manifest itself. | 60 // to a manifest or the manifest itself. |
| 56 ManifestTest::ManifestData::ManifestData(const char* name) | 61 ExtensionManifestTest::Manifest::Manifest(const char* name) |
| 57 : name_(name), manifest_(NULL) { | 62 : name_(name), manifest_(NULL) { |
| 58 } | 63 } |
| 59 | 64 |
| 60 ManifestTest::ManifestData::ManifestData(base::DictionaryValue* manifest, | 65 ExtensionManifestTest::Manifest::Manifest(base::DictionaryValue* manifest, |
| 61 const char* name) | 66 const char* name) |
| 62 : name_(name), manifest_(manifest) { | 67 : name_(name), manifest_(manifest) { |
| 63 CHECK(manifest_) << "Manifest NULL"; | 68 CHECK(manifest_) << "Manifest NULL"; |
| 64 } | 69 } |
| 65 | 70 |
| 66 ManifestTest::ManifestData::ManifestData( | 71 ExtensionManifestTest::Manifest::Manifest( |
| 67 scoped_ptr<base::DictionaryValue> manifest) | 72 scoped_ptr<base::DictionaryValue> manifest) |
| 68 : manifest_(manifest.get()), manifest_holder_(manifest.Pass()) { | 73 : manifest_(manifest.get()), manifest_holder_(manifest.Pass()) { |
| 69 CHECK(manifest_) << "Manifest NULL"; | 74 CHECK(manifest_) << "Manifest NULL"; |
| 70 } | 75 } |
| 71 | 76 |
| 72 ManifestTest::ManifestData::ManifestData(const ManifestData& m) { | 77 ExtensionManifestTest::Manifest::Manifest(const Manifest& m) { |
| 73 NOTREACHED(); | 78 NOTREACHED(); |
| 74 } | 79 } |
| 75 | 80 |
| 76 ManifestTest::ManifestData::~ManifestData() { | 81 ExtensionManifestTest::Manifest::~Manifest() { |
| 77 } | 82 } |
| 78 | 83 |
| 79 base::DictionaryValue* ManifestTest::ManifestData::GetManifest( | 84 base::DictionaryValue* ExtensionManifestTest::Manifest::GetManifest( |
| 80 base::FilePath test_data_dir, std::string* error) const { | 85 char const* test_data_dir, std::string* error) const { |
| 81 if (manifest_) | 86 if (manifest_) |
| 82 return manifest_; | 87 return manifest_; |
| 83 | 88 |
| 84 base::FilePath manifest_path = test_data_dir.AppendASCII(name_); | 89 base::FilePath filename_path; |
| 85 manifest_ = LoadManifestFile(manifest_path, error); | 90 filename_path = filename_path.AppendASCII("extensions") |
| 91 .AppendASCII(test_data_dir) |
| 92 .AppendASCII(name_); |
| 93 manifest_ = LoadManifestFile(filename_path, error); |
| 86 manifest_holder_.reset(manifest_); | 94 manifest_holder_.reset(manifest_); |
| 87 return manifest_; | 95 return manifest_; |
| 88 } | 96 } |
| 89 | 97 |
| 90 base::FilePath ManifestTest::GetTestDataDir() { | 98 char const* ExtensionManifestTest::test_data_dir() { |
| 91 base::FilePath path; | 99 return "manifest_tests"; |
| 92 PathService::Get(DIR_TEST_DATA, &path); | |
| 93 return path.AppendASCII("manifest_tests"); | |
| 94 } | 100 } |
| 95 | 101 |
| 96 scoped_ptr<base::DictionaryValue> ManifestTest::LoadManifest( | 102 scoped_ptr<base::DictionaryValue> ExtensionManifestTest::LoadManifest( |
| 97 char const* manifest_name, std::string* error) { | 103 char const* manifest_name, std::string* error) { |
| 98 base::FilePath manifest_path = GetTestDataDir().AppendASCII(manifest_name); | 104 base::FilePath filename_path; |
| 99 return make_scoped_ptr(LoadManifestFile(manifest_path, error)); | 105 filename_path = filename_path.AppendASCII("extensions") |
| 106 .AppendASCII(test_data_dir()) |
| 107 .AppendASCII(manifest_name); |
| 108 return make_scoped_ptr(LoadManifestFile(filename_path, error)); |
| 100 } | 109 } |
| 101 | 110 |
| 102 scoped_refptr<Extension> ManifestTest::LoadExtension( | 111 scoped_refptr<Extension> ExtensionManifestTest::LoadExtension( |
| 103 const ManifestData& manifest, | 112 const Manifest& manifest, |
| 104 std::string* error, | 113 std::string* error, |
| 105 extensions::Manifest::Location location, | 114 extensions::Manifest::Location location, |
| 106 int flags) { | 115 int flags) { |
| 107 base::FilePath test_data_dir = GetTestDataDir(); | 116 base::DictionaryValue* value = manifest.GetManifest(test_data_dir(), error); |
| 108 base::DictionaryValue* value = manifest.GetManifest(test_data_dir, error); | |
| 109 if (!value) | 117 if (!value) |
| 110 return NULL; | 118 return NULL; |
| 111 return Extension::Create( | 119 base::FilePath path; |
| 112 test_data_dir.DirName(), location, *value, flags, error); | 120 PathService::Get(chrome::DIR_TEST_DATA, &path); |
| 121 path = path.AppendASCII("extensions").AppendASCII(test_data_dir()); |
| 122 return Extension::Create(path.DirName(), location, *value, flags, error); |
| 113 } | 123 } |
| 114 | 124 |
| 115 scoped_refptr<Extension> ManifestTest::LoadAndExpectSuccess( | 125 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectSuccess( |
| 116 const ManifestData& manifest, | 126 const Manifest& manifest, |
| 117 extensions::Manifest::Location location, | 127 extensions::Manifest::Location location, |
| 118 int flags) { | 128 int flags) { |
| 119 std::string error; | 129 std::string error; |
| 120 scoped_refptr<Extension> extension = | 130 scoped_refptr<Extension> extension = |
| 121 LoadExtension(manifest, &error, location, flags); | 131 LoadExtension(manifest, &error, location, flags); |
| 122 EXPECT_TRUE(extension.get()) << manifest.name(); | 132 EXPECT_TRUE(extension.get()) << manifest.name(); |
| 123 EXPECT_EQ("", error) << manifest.name(); | 133 EXPECT_EQ("", error) << manifest.name(); |
| 124 return extension; | 134 return extension; |
| 125 } | 135 } |
| 126 | 136 |
| 127 scoped_refptr<Extension> ManifestTest::LoadAndExpectSuccess( | 137 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectSuccess( |
| 128 char const* manifest_name, | 138 char const* manifest_name, |
| 129 extensions::Manifest::Location location, | 139 extensions::Manifest::Location location, |
| 130 int flags) { | 140 int flags) { |
| 131 return LoadAndExpectSuccess(ManifestData(manifest_name), location, flags); | 141 return LoadAndExpectSuccess(Manifest(manifest_name), location, flags); |
| 132 } | 142 } |
| 133 | 143 |
| 134 scoped_refptr<Extension> ManifestTest::LoadAndExpectWarning( | 144 scoped_refptr<Extension> ExtensionManifestTest::LoadFromStringAndExpectSuccess( |
| 135 const ManifestData& manifest, | 145 char const* manifest_json) { |
| 146 return LoadAndExpectSuccess( |
| 147 Manifest(extensions::test_util::ParseJsonDictionaryWithSingleQuotes( |
| 148 manifest_json))); |
| 149 } |
| 150 |
| 151 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectWarning( |
| 152 const Manifest& manifest, |
| 136 const std::string& expected_warning, | 153 const std::string& expected_warning, |
| 137 extensions::Manifest::Location location, | 154 extensions::Manifest::Location location, |
| 138 int flags) { | 155 int flags) { |
| 139 std::string error; | 156 std::string error; |
| 140 scoped_refptr<Extension> extension = | 157 scoped_refptr<Extension> extension = |
| 141 LoadExtension(manifest, &error, location, flags); | 158 LoadExtension(manifest, &error, location, flags); |
| 142 EXPECT_TRUE(extension.get()) << manifest.name(); | 159 EXPECT_TRUE(extension.get()) << manifest.name(); |
| 143 EXPECT_EQ("", error) << manifest.name(); | 160 EXPECT_EQ("", error) << manifest.name(); |
| 144 EXPECT_EQ(1u, extension->install_warnings().size()); | 161 EXPECT_EQ(1u, extension->install_warnings().size()); |
| 145 EXPECT_EQ(expected_warning, extension->install_warnings()[0].message); | 162 EXPECT_EQ(expected_warning, extension->install_warnings()[0].message); |
| 146 return extension; | 163 return extension; |
| 147 } | 164 } |
| 148 | 165 |
| 149 scoped_refptr<Extension> ManifestTest::LoadAndExpectWarning( | 166 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectWarning( |
| 150 char const* manifest_name, | 167 char const* manifest_name, |
| 151 const std::string& expected_warning, | 168 const std::string& expected_warning, |
| 152 extensions::Manifest::Location location, | 169 extensions::Manifest::Location location, |
| 153 int flags) { | 170 int flags) { |
| 154 return LoadAndExpectWarning( | 171 return LoadAndExpectWarning( |
| 155 ManifestData(manifest_name), expected_warning, location, flags); | 172 Manifest(manifest_name), expected_warning, location, flags); |
| 156 } | 173 } |
| 157 | 174 |
| 158 void ManifestTest::VerifyExpectedError( | 175 void ExtensionManifestTest::VerifyExpectedError( |
| 159 Extension* extension, | 176 Extension* extension, |
| 160 const std::string& name, | 177 const std::string& name, |
| 161 const std::string& error, | 178 const std::string& error, |
| 162 const std::string& expected_error) { | 179 const std::string& expected_error) { |
| 163 EXPECT_FALSE(extension) << | 180 EXPECT_FALSE(extension) << |
| 164 "Expected failure loading extension '" << name << | 181 "Expected failure loading extension '" << name << |
| 165 "', but didn't get one."; | 182 "', but didn't get one."; |
| 166 EXPECT_TRUE(MatchPattern(error, expected_error)) << name << | 183 EXPECT_TRUE(MatchPattern(error, expected_error)) << name << |
| 167 " expected '" << expected_error << "' but got '" << error << "'"; | 184 " expected '" << expected_error << "' but got '" << error << "'"; |
| 168 } | 185 } |
| 169 | 186 |
| 170 void ManifestTest::LoadAndExpectError( | 187 void ExtensionManifestTest::LoadAndExpectError( |
| 171 const ManifestData& manifest, | 188 const Manifest& manifest, |
| 172 const std::string& expected_error, | 189 const std::string& expected_error, |
| 173 extensions::Manifest::Location location, | 190 extensions::Manifest::Location location, |
| 174 int flags) { | 191 int flags) { |
| 175 std::string error; | 192 std::string error; |
| 176 scoped_refptr<Extension> extension( | 193 scoped_refptr<Extension> extension( |
| 177 LoadExtension(manifest, &error, location, flags)); | 194 LoadExtension(manifest, &error, location, flags)); |
| 178 VerifyExpectedError(extension.get(), manifest.name(), error, | 195 VerifyExpectedError(extension.get(), manifest.name(), error, |
| 179 expected_error); | 196 expected_error); |
| 180 } | 197 } |
| 181 | 198 |
| 182 void ManifestTest::LoadAndExpectError( | 199 void ExtensionManifestTest::LoadAndExpectError( |
| 183 char const* manifest_name, | 200 char const* manifest_name, |
| 184 const std::string& expected_error, | 201 const std::string& expected_error, |
| 185 extensions::Manifest::Location location, | 202 extensions::Manifest::Location location, |
| 186 int flags) { | 203 int flags) { |
| 187 return LoadAndExpectError( | 204 return LoadAndExpectError( |
| 188 ManifestData(manifest_name), expected_error, location, flags); | 205 Manifest(manifest_name), expected_error, location, flags); |
| 189 } | 206 } |
| 190 | 207 |
| 191 void ManifestTest::AddPattern(extensions::URLPatternSet* extent, | 208 void ExtensionManifestTest::LoadFromStringAndExpectError( |
| 209 char const* manifest_json, |
| 210 const std::string& expected_error) { |
| 211 return LoadAndExpectError( |
| 212 Manifest(extensions::test_util::ParseJsonDictionaryWithSingleQuotes( |
| 213 manifest_json)), |
| 214 expected_error); |
| 215 } |
| 216 |
| 217 void ExtensionManifestTest::AddPattern(extensions::URLPatternSet* extent, |
| 192 const std::string& pattern) { | 218 const std::string& pattern) { |
| 193 int schemes = URLPattern::SCHEME_ALL; | 219 int schemes = URLPattern::SCHEME_ALL; |
| 194 extent->AddPattern(URLPattern(schemes, pattern)); | 220 extent->AddPattern(URLPattern(schemes, pattern)); |
| 195 } | 221 } |
| 196 | 222 |
| 197 ManifestTest::Testcase::Testcase( | 223 ExtensionManifestTest::Testcase::Testcase( |
| 198 std::string manifest_filename, | 224 std::string manifest_filename, |
| 199 std::string expected_error, | 225 std::string expected_error, |
| 200 extensions::Manifest::Location location, | 226 extensions::Manifest::Location location, |
| 201 int flags) | 227 int flags) |
| 202 : manifest_filename_(manifest_filename), | 228 : manifest_filename_(manifest_filename), |
| 203 expected_error_(expected_error), | 229 expected_error_(expected_error), |
| 204 location_(location), flags_(flags) { | 230 location_(location), flags_(flags) { |
| 205 } | 231 } |
| 206 | 232 |
| 207 ManifestTest::Testcase::Testcase(std::string manifest_filename, | 233 ExtensionManifestTest::Testcase::Testcase(std::string manifest_filename, |
| 208 std::string expected_error) | 234 std::string expected_error) |
| 209 : manifest_filename_(manifest_filename), | 235 : manifest_filename_(manifest_filename), |
| 210 expected_error_(expected_error), | 236 expected_error_(expected_error), |
| 211 location_(extensions::Manifest::INTERNAL), | 237 location_(extensions::Manifest::INTERNAL), |
| 212 flags_(Extension::NO_FLAGS) { | 238 flags_(Extension::NO_FLAGS) { |
| 213 } | 239 } |
| 214 | 240 |
| 215 ManifestTest::Testcase::Testcase(std::string manifest_filename) | 241 ExtensionManifestTest::Testcase::Testcase(std::string manifest_filename) |
| 216 : manifest_filename_(manifest_filename), | 242 : manifest_filename_(manifest_filename), |
| 217 location_(extensions::Manifest::INTERNAL), | 243 location_(extensions::Manifest::INTERNAL), |
| 218 flags_(Extension::NO_FLAGS) {} | 244 flags_(Extension::NO_FLAGS) {} |
| 219 | 245 |
| 220 ManifestTest::Testcase::Testcase( | 246 ExtensionManifestTest::Testcase::Testcase( |
| 221 std::string manifest_filename, | 247 std::string manifest_filename, |
| 222 extensions::Manifest::Location location, | 248 extensions::Manifest::Location location, |
| 223 int flags) | 249 int flags) |
| 224 : manifest_filename_(manifest_filename), | 250 : manifest_filename_(manifest_filename), |
| 225 location_(location), | 251 location_(location), |
| 226 flags_(flags) {} | 252 flags_(flags) {} |
| 227 | 253 |
| 228 void ManifestTest::RunTestcases(const Testcase* testcases, | 254 void ExtensionManifestTest::RunTestcases(const Testcase* testcases, |
| 229 size_t num_testcases, | 255 size_t num_testcases, |
| 230 ExpectType type) { | 256 ExpectType type) { |
| 231 for (size_t i = 0; i < num_testcases; ++i) | 257 for (size_t i = 0; i < num_testcases; ++i) |
| 232 RunTestcase(testcases[i], type); | 258 RunTestcase(testcases[i], type); |
| 233 } | 259 } |
| 234 | 260 |
| 235 void ManifestTest::RunTestcase(const Testcase& testcase, | 261 void ExtensionManifestTest::RunTestcase(const Testcase& testcase, |
| 236 ExpectType type) { | 262 ExpectType type) { |
| 237 switch (type) { | 263 switch (type) { |
| 238 case EXPECT_TYPE_ERROR: | 264 case EXPECT_TYPE_ERROR: |
| 239 LoadAndExpectError(testcase.manifest_filename_.c_str(), | 265 LoadAndExpectError(testcase.manifest_filename_.c_str(), |
| 240 testcase.expected_error_, | 266 testcase.expected_error_, |
| 241 testcase.location_, | 267 testcase.location_, |
| 242 testcase.flags_); | 268 testcase.flags_); |
| 243 break; | 269 break; |
| 244 case EXPECT_TYPE_WARNING: | 270 case EXPECT_TYPE_WARNING: |
| 245 LoadAndExpectWarning(testcase.manifest_filename_.c_str(), | 271 LoadAndExpectWarning(testcase.manifest_filename_.c_str(), |
| 246 testcase.expected_error_, | 272 testcase.expected_error_, |
| 247 testcase.location_, | 273 testcase.location_, |
| 248 testcase.flags_); | 274 testcase.flags_); |
| 249 break; | 275 break; |
| 250 case EXPECT_TYPE_SUCCESS: | 276 case EXPECT_TYPE_SUCCESS: |
| 251 LoadAndExpectSuccess(testcase.manifest_filename_.c_str(), | 277 LoadAndExpectSuccess(testcase.manifest_filename_.c_str(), |
| 252 testcase.location_, | 278 testcase.location_, |
| 253 testcase.flags_); | 279 testcase.flags_); |
| 254 break; | 280 break; |
| 255 } | 281 } |
| 256 } | 282 } |
| 257 | |
| 258 } // namespace extensions | |
| OLD | NEW |