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
3 // found in the LICENSE file.
5 #include "chrome/common/extensions/manifest_tests/extension_manifest_test.h"
7 #include "base/file_util.h"
8 #include "base/files/file_path.h"
9 #include "base/json/json_file_value_serializer.h"
10 #include "base/path_service.h"
11 #include "base/values.h"
12 #include "chrome/common/chrome_paths.h"
13 #include "chrome/common/extensions/extension_l10n_util.h"
14 #include "ui/base/l10n/l10n_util.h"
16 using extensions::Extension;
20 // If filename is a relative path, LoadManifestFile will treat it relative to
21 // the appropriate test directory.
22 base::DictionaryValue* LoadManifestFile(const base::FilePath& filename_path,
24 base::FilePath extension_path;
25 base::FilePath manifest_path;
27 PathService::Get(chrome::DIR_TEST_DATA, &manifest_path);
28 manifest_path = manifest_path.Append(filename_path);
29 extension_path = manifest_path.DirName();
31 EXPECT_TRUE(base::PathExists(manifest_path)) <<
32 "Couldn't find " << manifest_path.value();
34 JSONFileValueSerializer serializer(manifest_path);
35 base::DictionaryValue* manifest =
36 static_cast<base::DictionaryValue*>(serializer.Deserialize(NULL, error));
38 // Most unit tests don't need localization, and they'll fail if we try to
39 // localize them, since their manifests don't have a default_locale key.
40 // Only localize manifests that indicate they want to be localized.
41 // Calling LocalizeExtension at this point mirrors
42 // extension_file_util::LoadExtension.
44 filename_path.value().find(FILE_PATH_LITERAL("localized")) !=
46 extension_l10n_util::LocalizeExtension(extension_path, manifest, error);
53 ExtensionManifestTest::ExtensionManifestTest()
56 current_channel_(chrome::VersionInfo::CHANNEL_UNKNOWN) {}
58 // Helper class that simplifies creating methods that take either a filename
59 // to a manifest or the manifest itself.
60 ExtensionManifestTest::Manifest::Manifest(const char* name)
61 : name_(name), manifest_(NULL) {
64 ExtensionManifestTest::Manifest::Manifest(base::DictionaryValue* manifest,
66 : name_(name), manifest_(manifest) {
67 CHECK(manifest_) << "Manifest NULL";
70 ExtensionManifestTest::Manifest::Manifest(const Manifest& m) {
74 ExtensionManifestTest::Manifest::~Manifest() {
77 base::DictionaryValue* ExtensionManifestTest::Manifest::GetManifest(
78 char const* test_data_dir, std::string* error) const {
82 base::FilePath filename_path;
83 filename_path = filename_path.AppendASCII("extensions")
84 .AppendASCII(test_data_dir)
86 manifest_ = LoadManifestFile(filename_path, error);
87 manifest_holder_.reset(manifest_);
91 char const* ExtensionManifestTest::test_data_dir() {
92 return "manifest_tests";
95 scoped_ptr<base::DictionaryValue> ExtensionManifestTest::LoadManifest(
96 char const* manifest_name, std::string* error) {
97 base::FilePath filename_path;
98 filename_path = filename_path.AppendASCII("extensions")
99 .AppendASCII(test_data_dir())
100 .AppendASCII(manifest_name);
101 return make_scoped_ptr(LoadManifestFile(filename_path, error));
104 scoped_refptr<Extension> ExtensionManifestTest::LoadExtension(
105 const Manifest& manifest,
107 extensions::Manifest::Location location,
109 base::DictionaryValue* value = manifest.GetManifest(test_data_dir(), error);
113 PathService::Get(chrome::DIR_TEST_DATA, &path);
114 path = path.AppendASCII("extensions").AppendASCII(test_data_dir());
115 return Extension::Create(path.DirName(), location, *value, flags, error);
118 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectSuccess(
119 const Manifest& manifest,
120 extensions::Manifest::Location location,
123 scoped_refptr<Extension> extension =
124 LoadExtension(manifest, &error, location, flags);
125 EXPECT_TRUE(extension.get()) << manifest.name();
126 EXPECT_EQ("", error) << manifest.name();
130 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectSuccess(
131 char const* manifest_name,
132 extensions::Manifest::Location location,
134 return LoadAndExpectSuccess(Manifest(manifest_name), location, flags);
137 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectWarning(
138 const Manifest& manifest,
139 const std::string& expected_warning,
140 extensions::Manifest::Location location,
143 scoped_refptr<Extension> extension =
144 LoadExtension(manifest, &error, location, flags);
145 EXPECT_TRUE(extension.get()) << manifest.name();
146 EXPECT_EQ("", error) << manifest.name();
147 EXPECT_EQ(1u, extension->install_warnings().size());
148 EXPECT_EQ(expected_warning, extension->install_warnings()[0].message);
152 scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectWarning(
153 char const* manifest_name,
154 const std::string& expected_warning,
155 extensions::Manifest::Location location,
157 return LoadAndExpectWarning(
158 Manifest(manifest_name), expected_warning, location, flags);
161 void ExtensionManifestTest::VerifyExpectedError(
162 Extension* extension,
163 const std::string& name,
164 const std::string& error,
165 const std::string& expected_error) {
166 EXPECT_FALSE(extension) <<
167 "Expected failure loading extension '" << name <<
168 "', but didn't get one.";
169 EXPECT_TRUE(MatchPattern(error, expected_error)) << name <<
170 " expected '" << expected_error << "' but got '" << error << "'";
173 void ExtensionManifestTest::LoadAndExpectError(
174 const Manifest& manifest,
175 const std::string& expected_error,
176 extensions::Manifest::Location location,
179 scoped_refptr<Extension> extension(
180 LoadExtension(manifest, &error, location, flags));
181 VerifyExpectedError(extension.get(), manifest.name(), error,
185 void ExtensionManifestTest::LoadAndExpectError(
186 char const* manifest_name,
187 const std::string& expected_error,
188 extensions::Manifest::Location location,
190 return LoadAndExpectError(
191 Manifest(manifest_name), expected_error, location, flags);
194 void ExtensionManifestTest::AddPattern(extensions::URLPatternSet* extent,
195 const std::string& pattern) {
196 int schemes = URLPattern::SCHEME_ALL;
197 extent->AddPattern(URLPattern(schemes, pattern));
200 ExtensionManifestTest::Testcase::Testcase(
201 std::string manifest_filename,
202 std::string expected_error,
203 extensions::Manifest::Location location,
205 : manifest_filename_(manifest_filename),
206 expected_error_(expected_error),
207 location_(location), flags_(flags) {
210 ExtensionManifestTest::Testcase::Testcase(std::string manifest_filename,
211 std::string expected_error)
212 : manifest_filename_(manifest_filename),
213 expected_error_(expected_error),
214 location_(extensions::Manifest::INTERNAL),
215 flags_(Extension::NO_FLAGS) {
218 ExtensionManifestTest::Testcase::Testcase(std::string manifest_filename)
219 : manifest_filename_(manifest_filename),
220 location_(extensions::Manifest::INTERNAL),
221 flags_(Extension::NO_FLAGS) {}
223 ExtensionManifestTest::Testcase::Testcase(
224 std::string manifest_filename,
225 extensions::Manifest::Location location,
227 : manifest_filename_(manifest_filename),
231 void ExtensionManifestTest::RunTestcases(const Testcase* testcases,
232 size_t num_testcases,
234 for (size_t i = 0; i < num_testcases; ++i)
235 RunTestcase(testcases[i], type);
238 void ExtensionManifestTest::RunTestcase(const Testcase& testcase,
241 case EXPECT_TYPE_ERROR:
242 LoadAndExpectError(testcase.manifest_filename_.c_str(),
243 testcase.expected_error_,
247 case EXPECT_TYPE_WARNING:
248 LoadAndExpectWarning(testcase.manifest_filename_.c_str(),
249 testcase.expected_error_,
253 case EXPECT_TYPE_SUCCESS:
254 LoadAndExpectSuccess(testcase.manifest_filename_.c_str(),