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 |