OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "extensions/common/manifest_test.h" | |
6 | |
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" | |
17 | |
18 namespace extensions { | |
19 namespace { | |
20 | |
21 // |manifest_path| is an absolute path to a manifest file. | |
22 base::DictionaryValue* LoadManifestFile(const base::FilePath& manifest_path, | |
23 std::string* error) { | |
24 base::FilePath extension_path = manifest_path.DirName(); | |
25 | |
26 EXPECT_TRUE(base::PathExists(manifest_path)) << | |
27 "Couldn't find " << manifest_path.value(); | |
28 | |
29 JSONFileValueSerializer serializer(manifest_path); | |
30 base::DictionaryValue* manifest = | |
31 static_cast<base::DictionaryValue*>(serializer.Deserialize(NULL, error)); | |
32 | |
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. | |
37 if (manifest && | |
38 manifest_path.value().find(FILE_PATH_LITERAL("localized")) != | |
39 std::string::npos) | |
40 extension_l10n_util::LocalizeExtension(extension_path, manifest, error); | |
41 | |
42 return manifest; | |
43 } | |
44 | |
45 } // namespace | |
46 | |
47 ManifestTest::ManifestTest() | |
48 : enable_apps_(true) { | |
49 } | |
50 | |
51 ManifestTest::~ManifestTest() { | |
52 } | |
53 | |
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) { | |
58 } | |
59 | |
60 ManifestTest::ManifestData::ManifestData(base::DictionaryValue* manifest, | |
61 const char* name) | |
62 : name_(name), manifest_(manifest) { | |
63 CHECK(manifest_) << "Manifest NULL"; | |
64 } | |
65 | |
66 ManifestTest::ManifestData::ManifestData( | |
67 scoped_ptr<base::DictionaryValue> manifest) | |
68 : manifest_(manifest.get()), manifest_holder_(manifest.Pass()) { | |
69 CHECK(manifest_) << "Manifest NULL"; | |
70 } | |
71 | |
72 ManifestTest::ManifestData::ManifestData(const ManifestData& m) { | |
73 NOTREACHED(); | |
74 } | |
75 | |
76 ManifestTest::ManifestData::~ManifestData() { | |
77 } | |
78 | |
79 base::DictionaryValue* ManifestTest::ManifestData::GetManifest( | |
80 base::FilePath test_data_dir, std::string* error) const { | |
81 if (manifest_) | |
82 return manifest_; | |
83 | |
84 base::FilePath manifest_path = test_data_dir.AppendASCII(name_); | |
85 manifest_ = LoadManifestFile(manifest_path, error); | |
86 manifest_holder_.reset(manifest_); | |
87 return manifest_; | |
88 } | |
89 | |
90 base::FilePath ManifestTest::GetTestDataDir() { | |
91 base::FilePath path; | |
92 PathService::Get(DIR_TEST_DATA, &path); | |
93 return path.AppendASCII("manifest_tests"); | |
94 } | |
95 | |
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)); | |
100 } | |
101 | |
102 scoped_refptr<Extension> ManifestTest::LoadExtension( | |
103 const ManifestData& manifest, | |
104 std::string* error, | |
105 extensions::Manifest::Location location, | |
106 int flags) { | |
107 base::FilePath test_data_dir = GetTestDataDir(); | |
108 base::DictionaryValue* value = manifest.GetManifest(test_data_dir, error); | |
109 if (!value) | |
110 return NULL; | |
111 return Extension::Create( | |
112 test_data_dir.DirName(), location, *value, flags, error); | |
113 } | |
114 | |
115 scoped_refptr<Extension> ManifestTest::LoadAndExpectSuccess( | |
116 const ManifestData& manifest, | |
117 extensions::Manifest::Location location, | |
118 int flags) { | |
119 std::string error; | |
120 scoped_refptr<Extension> extension = | |
121 LoadExtension(manifest, &error, location, flags); | |
122 EXPECT_TRUE(extension.get()) << manifest.name(); | |
123 EXPECT_EQ("", error) << manifest.name(); | |
124 return extension; | |
125 } | |
126 | |
127 scoped_refptr<Extension> ManifestTest::LoadAndExpectSuccess( | |
128 char const* manifest_name, | |
129 extensions::Manifest::Location location, | |
130 int flags) { | |
131 return LoadAndExpectSuccess(ManifestData(manifest_name), location, flags); | |
132 } | |
133 | |
134 scoped_refptr<Extension> ManifestTest::LoadAndExpectWarning( | |
135 const ManifestData& manifest, | |
136 const std::string& expected_warning, | |
137 extensions::Manifest::Location location, | |
138 int flags) { | |
139 std::string error; | |
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); | |
146 return extension; | |
147 } | |
148 | |
149 scoped_refptr<Extension> ManifestTest::LoadAndExpectWarning( | |
150 char const* manifest_name, | |
151 const std::string& expected_warning, | |
152 extensions::Manifest::Location location, | |
153 int flags) { | |
154 return LoadAndExpectWarning( | |
155 ManifestData(manifest_name), expected_warning, location, flags); | |
156 } | |
157 | |
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 << "'"; | |
168 } | |
169 | |
170 void ManifestTest::LoadAndExpectError( | |
171 const ManifestData& manifest, | |
172 const std::string& expected_error, | |
173 extensions::Manifest::Location location, | |
174 int flags) { | |
175 std::string error; | |
176 scoped_refptr<Extension> extension( | |
177 LoadExtension(manifest, &error, location, flags)); | |
178 VerifyExpectedError(extension.get(), manifest.name(), error, | |
179 expected_error); | |
180 } | |
181 | |
182 void ManifestTest::LoadAndExpectError( | |
183 char const* manifest_name, | |
184 const std::string& expected_error, | |
185 extensions::Manifest::Location location, | |
186 int flags) { | |
187 return LoadAndExpectError( | |
188 ManifestData(manifest_name), expected_error, location, flags); | |
189 } | |
190 | |
191 void ManifestTest::AddPattern(extensions::URLPatternSet* extent, | |
192 const std::string& pattern) { | |
193 int schemes = URLPattern::SCHEME_ALL; | |
194 extent->AddPattern(URLPattern(schemes, pattern)); | |
195 } | |
196 | |
197 ManifestTest::Testcase::Testcase( | |
198 std::string manifest_filename, | |
199 std::string expected_error, | |
200 extensions::Manifest::Location location, | |
201 int flags) | |
202 : manifest_filename_(manifest_filename), | |
203 expected_error_(expected_error), | |
204 location_(location), flags_(flags) { | |
205 } | |
206 | |
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) { | |
213 } | |
214 | |
215 ManifestTest::Testcase::Testcase(std::string manifest_filename) | |
216 : manifest_filename_(manifest_filename), | |
217 location_(extensions::Manifest::INTERNAL), | |
218 flags_(Extension::NO_FLAGS) {} | |
219 | |
220 ManifestTest::Testcase::Testcase( | |
221 std::string manifest_filename, | |
222 extensions::Manifest::Location location, | |
223 int flags) | |
224 : manifest_filename_(manifest_filename), | |
225 location_(location), | |
226 flags_(flags) {} | |
227 | |
228 void ManifestTest::RunTestcases(const Testcase* testcases, | |
229 size_t num_testcases, | |
230 ExpectType type) { | |
231 for (size_t i = 0; i < num_testcases; ++i) | |
232 RunTestcase(testcases[i], type); | |
233 } | |
234 | |
235 void ManifestTest::RunTestcase(const Testcase& testcase, | |
236 ExpectType type) { | |
237 switch (type) { | |
238 case EXPECT_TYPE_ERROR: | |
239 LoadAndExpectError(testcase.manifest_filename_.c_str(), | |
240 testcase.expected_error_, | |
241 testcase.location_, | |
242 testcase.flags_); | |
243 break; | |
244 case EXPECT_TYPE_WARNING: | |
245 LoadAndExpectWarning(testcase.manifest_filename_.c_str(), | |
246 testcase.expected_error_, | |
247 testcase.location_, | |
248 testcase.flags_); | |
249 break; | |
250 case EXPECT_TYPE_SUCCESS: | |
251 LoadAndExpectSuccess(testcase.manifest_filename_.c_str(), | |
252 testcase.location_, | |
253 testcase.flags_); | |
254 break; | |
255 } | |
256 } | |
257 | |
258 } // namespace extensions | |
OLD | NEW |