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 "extensions/common/manifest_test.h"
7 #include "base/files/file_path.h"
8 #include "base/files/file_util.h"
9 #include "base/json/json_file_value_serializer.h"
10 #include "base/path_service.h"
11 #include "base/strings/string_util.h"
12 #include "base/values.h"
13 #include "extensions/common/extension_l10n_util.h"
14 #include "extensions/common/extension_paths.h"
15 #include "extensions/common/test_util.h"
16 #include "ui/base/l10n/l10n_util.h"
18 namespace extensions
{
21 // |manifest_path| is an absolute path to a manifest file.
22 base::DictionaryValue
* LoadManifestFile(const base::FilePath
& manifest_path
,
24 base::FilePath extension_path
= manifest_path
.DirName();
26 EXPECT_TRUE(base::PathExists(manifest_path
)) <<
27 "Couldn't find " << manifest_path
.value();
29 JSONFileValueSerializer
serializer(manifest_path
);
30 base::DictionaryValue
* manifest
=
31 static_cast<base::DictionaryValue
*>(serializer
.Deserialize(NULL
, error
));
33 // 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.
35 // Only localize manifests that indicate they want to be localized.
36 // Calling LocalizeExtension at this point mirrors file_util::LoadExtension.
38 manifest_path
.value().find(FILE_PATH_LITERAL("localized")) !=
40 extension_l10n_util::LocalizeExtension(extension_path
, manifest
, error
);
47 ManifestTest::ManifestTest()
48 : enable_apps_(true) {
51 ManifestTest::~ManifestTest() {
54 // Helper class that simplifies creating methods that take either a filename
55 // to a manifest or the manifest itself.
56 ManifestTest::ManifestData::ManifestData(const char* name
)
57 : name_(name
), manifest_(NULL
) {
60 ManifestTest::ManifestData::ManifestData(base::DictionaryValue
* manifest
,
62 : name_(name
), manifest_(manifest
) {
63 CHECK(manifest_
) << "Manifest NULL";
66 ManifestTest::ManifestData::ManifestData(
67 scoped_ptr
<base::DictionaryValue
> manifest
)
68 : manifest_(manifest
.get()), manifest_holder_(manifest
.Pass()) {
69 CHECK(manifest_
) << "Manifest NULL";
72 ManifestTest::ManifestData::ManifestData(const ManifestData
& m
) {
76 ManifestTest::ManifestData::~ManifestData() {
79 base::DictionaryValue
* ManifestTest::ManifestData::GetManifest(
80 base::FilePath test_data_dir
, std::string
* error
) const {
84 base::FilePath manifest_path
= test_data_dir
.AppendASCII(name_
);
85 manifest_
= LoadManifestFile(manifest_path
, error
);
86 manifest_holder_
.reset(manifest_
);
90 base::FilePath
ManifestTest::GetTestDataDir() {
92 PathService::Get(DIR_TEST_DATA
, &path
);
93 return path
.AppendASCII("manifest_tests");
96 scoped_ptr
<base::DictionaryValue
> ManifestTest::LoadManifest(
97 char const* manifest_name
, std::string
* error
) {
98 base::FilePath manifest_path
= GetTestDataDir().AppendASCII(manifest_name
);
99 return make_scoped_ptr(LoadManifestFile(manifest_path
, error
));
102 scoped_refptr
<Extension
> ManifestTest::LoadExtension(
103 const ManifestData
& manifest
,
105 extensions::Manifest::Location location
,
107 base::FilePath test_data_dir
= GetTestDataDir();
108 base::DictionaryValue
* value
= manifest
.GetManifest(test_data_dir
, error
);
111 return Extension::Create(
112 test_data_dir
.DirName(), location
, *value
, flags
, error
);
115 scoped_refptr
<Extension
> ManifestTest::LoadAndExpectSuccess(
116 const ManifestData
& manifest
,
117 extensions::Manifest::Location location
,
120 scoped_refptr
<Extension
> extension
=
121 LoadExtension(manifest
, &error
, location
, flags
);
122 EXPECT_TRUE(extension
.get()) << manifest
.name();
123 EXPECT_EQ("", error
) << manifest
.name();
127 scoped_refptr
<Extension
> ManifestTest::LoadAndExpectSuccess(
128 char const* manifest_name
,
129 extensions::Manifest::Location location
,
131 return LoadAndExpectSuccess(ManifestData(manifest_name
), location
, flags
);
134 scoped_refptr
<Extension
> ManifestTest::LoadAndExpectWarning(
135 const ManifestData
& manifest
,
136 const std::string
& expected_warning
,
137 extensions::Manifest::Location location
,
140 scoped_refptr
<Extension
> extension
=
141 LoadExtension(manifest
, &error
, location
, flags
);
142 EXPECT_TRUE(extension
.get()) << manifest
.name();
143 EXPECT_EQ("", error
) << manifest
.name();
144 EXPECT_EQ(1u, extension
->install_warnings().size());
145 EXPECT_EQ(expected_warning
, extension
->install_warnings()[0].message
);
149 scoped_refptr
<Extension
> ManifestTest::LoadAndExpectWarning(
150 char const* manifest_name
,
151 const std::string
& expected_warning
,
152 extensions::Manifest::Location location
,
154 return LoadAndExpectWarning(
155 ManifestData(manifest_name
), expected_warning
, location
, flags
);
158 void ManifestTest::VerifyExpectedError(
159 Extension
* extension
,
160 const std::string
& name
,
161 const std::string
& error
,
162 const std::string
& expected_error
) {
163 EXPECT_FALSE(extension
) <<
164 "Expected failure loading extension '" << name
<<
165 "', but didn't get one.";
166 EXPECT_TRUE(MatchPattern(error
, expected_error
)) << name
<<
167 " expected '" << expected_error
<< "' but got '" << error
<< "'";
170 void ManifestTest::LoadAndExpectError(
171 const ManifestData
& manifest
,
172 const std::string
& expected_error
,
173 extensions::Manifest::Location location
,
176 scoped_refptr
<Extension
> extension(
177 LoadExtension(manifest
, &error
, location
, flags
));
178 VerifyExpectedError(extension
.get(), manifest
.name(), error
,
182 void ManifestTest::LoadAndExpectError(
183 char const* manifest_name
,
184 const std::string
& expected_error
,
185 extensions::Manifest::Location location
,
187 return LoadAndExpectError(
188 ManifestData(manifest_name
), expected_error
, location
, flags
);
191 void ManifestTest::AddPattern(extensions::URLPatternSet
* extent
,
192 const std::string
& pattern
) {
193 int schemes
= URLPattern::SCHEME_ALL
;
194 extent
->AddPattern(URLPattern(schemes
, pattern
));
197 ManifestTest::Testcase::Testcase(
198 std::string manifest_filename
,
199 std::string expected_error
,
200 extensions::Manifest::Location location
,
202 : manifest_filename_(manifest_filename
),
203 expected_error_(expected_error
),
204 location_(location
), flags_(flags
) {
207 ManifestTest::Testcase::Testcase(std::string manifest_filename
,
208 std::string expected_error
)
209 : manifest_filename_(manifest_filename
),
210 expected_error_(expected_error
),
211 location_(extensions::Manifest::INTERNAL
),
212 flags_(Extension::NO_FLAGS
) {
215 ManifestTest::Testcase::Testcase(std::string manifest_filename
)
216 : manifest_filename_(manifest_filename
),
217 location_(extensions::Manifest::INTERNAL
),
218 flags_(Extension::NO_FLAGS
) {}
220 ManifestTest::Testcase::Testcase(
221 std::string manifest_filename
,
222 extensions::Manifest::Location location
,
224 : manifest_filename_(manifest_filename
),
228 void ManifestTest::RunTestcases(const Testcase
* testcases
,
229 size_t num_testcases
,
231 for (size_t i
= 0; i
< num_testcases
; ++i
)
232 RunTestcase(testcases
[i
], type
);
235 void ManifestTest::RunTestcase(const Testcase
& testcase
,
238 case EXPECT_TYPE_ERROR
:
239 LoadAndExpectError(testcase
.manifest_filename_
.c_str(),
240 testcase
.expected_error_
,
244 case EXPECT_TYPE_WARNING
:
245 LoadAndExpectWarning(testcase
.manifest_filename_
.c_str(),
246 testcase
.expected_error_
,
250 case EXPECT_TYPE_SUCCESS
:
251 LoadAndExpectSuccess(testcase
.manifest_filename_
.c_str(),
258 } // namespace extensions