Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: chrome/common/extensions/extension_l10n_util_unittest.cc

Issue 228073005: Move core extensions l10n code to //extensions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: unused header is unused Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 "base/file_util.h"
6 #include "base/files/file_path.h"
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/memory/linked_ptr.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/path_service.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/values.h"
13 #include "chrome/common/chrome_paths.h"
14 #include "chrome/common/extensions/extension_l10n_util.h"
15 #include "chrome/common/extensions/message_bundle.h"
16 #include "extensions/common/constants.h"
17 #include "extensions/common/error_utils.h"
18 #include "extensions/common/manifest_constants.h"
19 #include "testing/gmock/include/gmock/gmock.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21 #include "ui/base/l10n/l10n_util.h"
22
23 using extensions::kLocaleFolder;
24 using extensions::kMessagesFilename;
25 using extensions::MessageBundle;
26
27 namespace errors = extensions::manifest_errors;
28 namespace keys = extensions::manifest_keys;
29
30 namespace {
31
32 TEST(ExtensionL10nUtil, ValidateLocalesWithBadLocale) {
33 base::ScopedTempDir temp;
34 ASSERT_TRUE(temp.CreateUniqueTempDir());
35
36 base::FilePath src_path = temp.path().Append(kLocaleFolder);
37 base::FilePath locale = src_path.AppendASCII("ms");
38 ASSERT_TRUE(base::CreateDirectory(locale));
39
40 base::FilePath messages_file = locale.Append(kMessagesFilename);
41 std::string data = "{ \"name\":";
42 ASSERT_TRUE(base::WriteFile(messages_file, data.c_str(), data.length()));
43
44 base::DictionaryValue manifest;
45 manifest.SetString(keys::kDefaultLocale, "en");
46 std::string error;
47 EXPECT_FALSE(extension_l10n_util::ValidateExtensionLocales(
48 temp.path(), &manifest, &error));
49 EXPECT_THAT(error,
50 testing::HasSubstr(
51 base::UTF16ToUTF8(messages_file.LossyDisplayName())));
52 }
53
54 TEST(ExtensionL10nUtil, GetValidLocalesEmptyLocaleFolder) {
55 base::ScopedTempDir temp;
56 ASSERT_TRUE(temp.CreateUniqueTempDir());
57
58 base::FilePath src_path = temp.path().Append(kLocaleFolder);
59 ASSERT_TRUE(base::CreateDirectory(src_path));
60
61 std::string error;
62 std::set<std::string> locales;
63 EXPECT_FALSE(extension_l10n_util::GetValidLocales(src_path,
64 &locales,
65 &error));
66
67 EXPECT_TRUE(locales.empty());
68 }
69
70 TEST(ExtensionL10nUtil, GetValidLocalesWithValidLocaleNoMessagesFile) {
71 base::ScopedTempDir temp;
72 ASSERT_TRUE(temp.CreateUniqueTempDir());
73
74 base::FilePath src_path = temp.path().Append(kLocaleFolder);
75 ASSERT_TRUE(base::CreateDirectory(src_path));
76 ASSERT_TRUE(base::CreateDirectory(src_path.AppendASCII("sr")));
77
78 std::string error;
79 std::set<std::string> locales;
80 EXPECT_FALSE(extension_l10n_util::GetValidLocales(src_path,
81 &locales,
82 &error));
83
84 EXPECT_TRUE(locales.empty());
85 }
86
87 TEST(ExtensionL10nUtil, GetValidLocalesWithUnsupportedLocale) {
88 base::ScopedTempDir temp;
89 ASSERT_TRUE(temp.CreateUniqueTempDir());
90
91 base::FilePath src_path = temp.path().Append(kLocaleFolder);
92 ASSERT_TRUE(base::CreateDirectory(src_path));
93 // Supported locale.
94 base::FilePath locale_1 = src_path.AppendASCII("sr");
95 ASSERT_TRUE(base::CreateDirectory(locale_1));
96 std::string data("whatever");
97 ASSERT_TRUE(base::WriteFile(
98 locale_1.Append(kMessagesFilename),
99 data.c_str(), data.length()));
100 // Unsupported locale.
101 ASSERT_TRUE(base::CreateDirectory(src_path.AppendASCII("xxx_yyy")));
102
103 std::string error;
104 std::set<std::string> locales;
105 EXPECT_TRUE(extension_l10n_util::GetValidLocales(src_path,
106 &locales,
107 &error));
108
109 EXPECT_FALSE(locales.empty());
110 EXPECT_TRUE(locales.find("sr") != locales.end());
111 EXPECT_FALSE(locales.find("xxx_yyy") != locales.end());
112 }
113
114 TEST(ExtensionL10nUtil, GetValidLocalesWithValidLocalesAndMessagesFile) {
115 base::FilePath install_dir;
116 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
117 install_dir = install_dir.AppendASCII("extensions")
118 .AppendASCII("good")
119 .AppendASCII("Extensions")
120 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
121 .AppendASCII("1.0.0.0")
122 .Append(kLocaleFolder);
123
124 std::string error;
125 std::set<std::string> locales;
126 EXPECT_TRUE(extension_l10n_util::GetValidLocales(install_dir,
127 &locales,
128 &error));
129 EXPECT_EQ(3U, locales.size());
130 EXPECT_TRUE(locales.find("sr") != locales.end());
131 EXPECT_TRUE(locales.find("en") != locales.end());
132 EXPECT_TRUE(locales.find("en_US") != locales.end());
133 }
134
135 TEST(ExtensionL10nUtil, LoadMessageCatalogsValidFallback) {
136 base::FilePath install_dir;
137 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
138 install_dir = install_dir.AppendASCII("extensions")
139 .AppendASCII("good")
140 .AppendASCII("Extensions")
141 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
142 .AppendASCII("1.0.0.0")
143 .Append(kLocaleFolder);
144
145 std::string error;
146 std::set<std::string> locales;
147 EXPECT_TRUE(extension_l10n_util::GetValidLocales(install_dir,
148 &locales,
149 &error));
150
151 scoped_ptr<MessageBundle> bundle(extension_l10n_util::LoadMessageCatalogs(
152 install_dir, "sr", "en_US", locales, &error));
153 ASSERT_FALSE(NULL == bundle.get());
154 EXPECT_TRUE(error.empty());
155 EXPECT_EQ("Color", bundle->GetL10nMessage("color"));
156 EXPECT_EQ("Not in the US or GB.", bundle->GetL10nMessage("not_in_US_or_GB"));
157 }
158
159 TEST(ExtensionL10nUtil, LoadMessageCatalogsMissingFiles) {
160 base::ScopedTempDir temp;
161 ASSERT_TRUE(temp.CreateUniqueTempDir());
162
163 base::FilePath src_path = temp.path().Append(kLocaleFolder);
164 ASSERT_TRUE(base::CreateDirectory(src_path));
165
166 std::set<std::string> valid_locales;
167 valid_locales.insert("sr");
168 valid_locales.insert("en");
169 std::string error;
170 EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs(src_path,
171 "en",
172 "sr",
173 valid_locales,
174 &error));
175 EXPECT_FALSE(error.empty());
176 }
177
178 TEST(ExtensionL10nUtil, LoadMessageCatalogsBadJSONFormat) {
179 base::ScopedTempDir temp;
180 ASSERT_TRUE(temp.CreateUniqueTempDir());
181
182 base::FilePath src_path = temp.path().Append(kLocaleFolder);
183 ASSERT_TRUE(base::CreateDirectory(src_path));
184
185 base::FilePath locale = src_path.AppendASCII("sr");
186 ASSERT_TRUE(base::CreateDirectory(locale));
187
188 std::string data = "{ \"name\":";
189 base::FilePath messages_file = locale.Append(kMessagesFilename);
190 ASSERT_TRUE(base::WriteFile(messages_file, data.c_str(), data.length()));
191
192 std::set<std::string> valid_locales;
193 valid_locales.insert("sr");
194 valid_locales.insert("en_US");
195 std::string error;
196 EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs(src_path,
197 "en_US",
198 "sr",
199 valid_locales,
200 &error));
201 EXPECT_EQ(
202 extensions::ErrorUtils::FormatErrorMessage(
203 errors::kLocalesInvalidLocale,
204 base::UTF16ToUTF8(messages_file.LossyDisplayName()),
205 "Line: 1, column: 10, Unexpected token."),
206 error);
207 }
208
209 TEST(ExtensionL10nUtil, LoadMessageCatalogsDuplicateKeys) {
210 base::ScopedTempDir temp;
211 ASSERT_TRUE(temp.CreateUniqueTempDir());
212
213 base::FilePath src_path = temp.path().Append(kLocaleFolder);
214 ASSERT_TRUE(base::CreateDirectory(src_path));
215
216 base::FilePath locale_1 = src_path.AppendASCII("en");
217 ASSERT_TRUE(base::CreateDirectory(locale_1));
218
219 std::string data =
220 "{ \"name\": { \"message\": \"something\" }, "
221 "\"name\": { \"message\": \"something else\" } }";
222 ASSERT_TRUE(base::WriteFile(locale_1.Append(kMessagesFilename),
223 data.c_str(), data.length()));
224
225 base::FilePath locale_2 = src_path.AppendASCII("sr");
226 ASSERT_TRUE(base::CreateDirectory(locale_2));
227
228 ASSERT_TRUE(base::WriteFile(locale_2.Append(kMessagesFilename),
229 data.c_str(), data.length()));
230
231 std::set<std::string> valid_locales;
232 valid_locales.insert("sr");
233 valid_locales.insert("en");
234 std::string error;
235 // JSON parser hides duplicates. We are going to get only one key/value
236 // pair at the end.
237 scoped_ptr<MessageBundle> message_bundle(
238 extension_l10n_util::LoadMessageCatalogs(src_path,
239 "en",
240 "sr",
241 valid_locales,
242 &error));
243 EXPECT_TRUE(NULL != message_bundle.get());
244 EXPECT_TRUE(error.empty());
245 }
246
247 // Caller owns the returned object.
248 MessageBundle* CreateManifestBundle() {
249 linked_ptr<base::DictionaryValue> catalog(new base::DictionaryValue);
250
251 base::DictionaryValue* name_tree = new base::DictionaryValue();
252 name_tree->SetString("message", "name");
253 catalog->Set("name", name_tree);
254
255 base::DictionaryValue* short_name_tree = new base::DictionaryValue();
256 short_name_tree->SetString("message", "short_name");
257 catalog->Set("short_name", short_name_tree);
258
259 base::DictionaryValue* description_tree = new base::DictionaryValue();
260 description_tree->SetString("message", "description");
261 catalog->Set("description", description_tree);
262
263 base::DictionaryValue* action_title_tree = new base::DictionaryValue();
264 action_title_tree->SetString("message", "action title");
265 catalog->Set("title", action_title_tree);
266
267 base::DictionaryValue* omnibox_keyword_tree = new base::DictionaryValue();
268 omnibox_keyword_tree->SetString("message", "omnibox keyword");
269 catalog->Set("omnibox_keyword", omnibox_keyword_tree);
270
271 base::DictionaryValue* file_handler_title_tree = new base::DictionaryValue();
272 file_handler_title_tree->SetString("message", "file handler title");
273 catalog->Set("file_handler_title", file_handler_title_tree);
274
275 base::DictionaryValue* launch_local_path_tree = new base::DictionaryValue();
276 launch_local_path_tree->SetString("message", "main.html");
277 catalog->Set("launch_local_path", launch_local_path_tree);
278
279 base::DictionaryValue* launch_web_url_tree = new base::DictionaryValue();
280 launch_web_url_tree->SetString("message", "http://www.google.com/");
281 catalog->Set("launch_web_url", launch_web_url_tree);
282
283 base::DictionaryValue* first_command_description_tree =
284 new base::DictionaryValue();
285 first_command_description_tree->SetString("message", "first command");
286 catalog->Set("first_command_description", first_command_description_tree);
287
288 base::DictionaryValue* second_command_description_tree =
289 new base::DictionaryValue();
290 second_command_description_tree->SetString("message", "second command");
291 catalog->Set("second_command_description", second_command_description_tree);
292
293 base::DictionaryValue* url_country_tree = new base::DictionaryValue();
294 url_country_tree->SetString("message", "de");
295 catalog->Set("country", url_country_tree);
296
297 std::vector<linked_ptr<base::DictionaryValue> > catalogs;
298 catalogs.push_back(catalog);
299
300 std::string error;
301 MessageBundle* bundle = MessageBundle::Create(catalogs, &error);
302 EXPECT_TRUE(bundle);
303 EXPECT_TRUE(error.empty());
304
305 return bundle;
306 }
307
308 TEST(ExtensionL10nUtil, LocalizeEmptyManifest) {
309 base::DictionaryValue manifest;
310 std::string error;
311 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
312
313 EXPECT_FALSE(
314 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
315 EXPECT_EQ(std::string(errors::kInvalidName), error);
316 }
317
318 TEST(ExtensionL10nUtil, LocalizeManifestWithoutNameMsgAndEmptyDescription) {
319 base::DictionaryValue manifest;
320 manifest.SetString(keys::kName, "no __MSG");
321 std::string error;
322 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
323
324 EXPECT_TRUE(
325 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
326
327 std::string result;
328 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
329 EXPECT_EQ("no __MSG", result);
330
331 EXPECT_FALSE(manifest.HasKey(keys::kDescription));
332
333 EXPECT_TRUE(error.empty());
334 }
335
336 TEST(ExtensionL10nUtil, LocalizeManifestWithNameMsgAndEmptyDescription) {
337 base::DictionaryValue manifest;
338 manifest.SetString(keys::kName, "__MSG_name__");
339 std::string error;
340 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
341
342 EXPECT_TRUE(
343 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
344
345 std::string result;
346 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
347 EXPECT_EQ("name", result);
348
349 EXPECT_FALSE(manifest.HasKey(keys::kDescription));
350
351 EXPECT_TRUE(error.empty());
352 }
353
354 TEST(ExtensionL10nUtil, LocalizeManifestWithLocalLaunchURL) {
355 base::DictionaryValue manifest;
356 manifest.SetString(keys::kName, "name");
357 manifest.SetString(keys::kLaunchLocalPath, "__MSG_launch_local_path__");
358 std::string error;
359 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
360
361 EXPECT_TRUE(
362 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
363
364 std::string result;
365 ASSERT_TRUE(manifest.GetString(keys::kLaunchLocalPath, &result));
366 EXPECT_EQ("main.html", result);
367
368 EXPECT_TRUE(error.empty());
369 }
370
371 TEST(ExtensionL10nUtil, LocalizeManifestWithHostedLaunchURL) {
372 base::DictionaryValue manifest;
373 manifest.SetString(keys::kName, "name");
374 manifest.SetString(keys::kLaunchWebURL, "__MSG_launch_web_url__");
375 std::string error;
376 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
377
378 EXPECT_TRUE(
379 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
380
381 std::string result;
382 ASSERT_TRUE(manifest.GetString(keys::kLaunchWebURL, &result));
383 EXPECT_EQ("http://www.google.com/", result);
384
385 EXPECT_TRUE(error.empty());
386 }
387
388 TEST(ExtensionL10nUtil, LocalizeManifestWithBadNameMsg) {
389 base::DictionaryValue manifest;
390 manifest.SetString(keys::kName, "__MSG_name_is_bad__");
391 manifest.SetString(keys::kDescription, "__MSG_description__");
392 std::string error;
393 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
394
395 EXPECT_FALSE(
396 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
397
398 std::string result;
399 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
400 EXPECT_EQ("__MSG_name_is_bad__", result);
401
402 ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
403 EXPECT_EQ("__MSG_description__", result);
404
405 EXPECT_EQ("Variable __MSG_name_is_bad__ used but not defined.", error);
406 }
407
408 TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionDefaultTitleMsgs) {
409 base::DictionaryValue manifest;
410 manifest.SetString(keys::kName, "__MSG_name__");
411 manifest.SetString(keys::kDescription, "__MSG_description__");
412 std::string action_title(keys::kBrowserAction);
413 action_title.append(".");
414 action_title.append(keys::kPageActionDefaultTitle);
415 manifest.SetString(action_title, "__MSG_title__");
416
417 std::string error;
418 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
419
420 EXPECT_TRUE(
421 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
422
423 std::string result;
424 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
425 EXPECT_EQ("name", result);
426
427 ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
428 EXPECT_EQ("description", result);
429
430 ASSERT_TRUE(manifest.GetString(action_title, &result));
431 EXPECT_EQ("action title", result);
432
433 EXPECT_TRUE(error.empty());
434 }
435
436 TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionOmniboxMsgs) {
437 base::DictionaryValue manifest;
438 manifest.SetString(keys::kName, "__MSG_name__");
439 manifest.SetString(keys::kDescription, "__MSG_description__");
440 manifest.SetString(keys::kOmniboxKeyword, "__MSG_omnibox_keyword__");
441
442 std::string error;
443 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
444
445 EXPECT_TRUE(
446 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
447
448 std::string result;
449 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
450 EXPECT_EQ("name", result);
451
452 ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
453 EXPECT_EQ("description", result);
454
455 ASSERT_TRUE(manifest.GetString(keys::kOmniboxKeyword, &result));
456 EXPECT_EQ("omnibox keyword", result);
457
458 EXPECT_TRUE(error.empty());
459 }
460
461 TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionFileHandlerTitle) {
462 base::DictionaryValue manifest;
463 manifest.SetString(keys::kName, "__MSG_name__");
464 manifest.SetString(keys::kDescription, "__MSG_description__");
465 base::ListValue* handlers = new base::ListValue();
466 manifest.Set(keys::kFileBrowserHandlers, handlers);
467 base::DictionaryValue* handler = new base::DictionaryValue();
468 handlers->Append(handler);
469 handler->SetString(keys::kPageActionDefaultTitle,
470 "__MSG_file_handler_title__");
471
472 std::string error;
473 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
474
475 EXPECT_TRUE(
476 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
477
478 std::string result;
479 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
480 EXPECT_EQ("name", result);
481
482 ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
483 EXPECT_EQ("description", result);
484
485 ASSERT_TRUE(handler->GetString(keys::kPageActionDefaultTitle, &result));
486 EXPECT_EQ("file handler title", result);
487
488 EXPECT_TRUE(error.empty());
489 }
490
491 TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionCommandDescription) {
492 base::DictionaryValue manifest;
493 manifest.SetString(keys::kName, "__MSG_name__");
494 manifest.SetString(keys::kDescription, "__MSG_description__");
495 base::DictionaryValue* commands = new base::DictionaryValue();
496 std::string commands_title(keys::kCommands);
497 manifest.Set(commands_title, commands);
498
499 base::DictionaryValue* first_command = new base::DictionaryValue();
500 commands->Set("first_command", first_command);
501 first_command->SetString(keys::kDescription,
502 "__MSG_first_command_description__");
503
504 base::DictionaryValue* second_command = new base::DictionaryValue();
505 commands->Set("second_command", second_command);
506 second_command->SetString(keys::kDescription,
507 "__MSG_second_command_description__");
508
509 std::string error;
510 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
511
512 EXPECT_TRUE(
513 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
514
515 std::string result;
516 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
517 EXPECT_EQ("name", result);
518
519 ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
520 EXPECT_EQ("description", result);
521
522 ASSERT_TRUE(manifest.GetString("commands.first_command.description",
523 &result));
524 EXPECT_EQ("first command", result);
525
526 ASSERT_TRUE(manifest.GetString("commands.second_command.description",
527 &result));
528 EXPECT_EQ("second command", result);
529
530 EXPECT_TRUE(error.empty());
531 }
532
533 TEST(ExtensionL10nUtil, LocalizeManifestWithShortName) {
534 base::DictionaryValue manifest;
535 manifest.SetString(keys::kName, "extension name");
536 manifest.SetString(keys::kShortName, "__MSG_short_name__");
537
538 std::string error;
539 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
540
541 EXPECT_TRUE(
542 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
543 EXPECT_TRUE(error.empty());
544
545 std::string result;
546 ASSERT_TRUE(manifest.GetString(keys::kShortName, &result));
547 EXPECT_EQ("short_name", result);
548 }
549
550 TEST(ExtensionL10nUtil, LocalizeManifestWithBadShortName) {
551 base::DictionaryValue manifest;
552 manifest.SetString(keys::kName, "extension name");
553 manifest.SetString(keys::kShortName, "__MSG_short_name_bad__");
554
555 std::string error;
556 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
557
558 EXPECT_FALSE(
559 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
560 EXPECT_FALSE(error.empty());
561
562 std::string result;
563 ASSERT_TRUE(manifest.GetString(keys::kShortName, &result));
564 EXPECT_EQ("__MSG_short_name_bad__", result);
565 }
566
567 TEST(ExtensionL10nUtil, LocalizeManifestWithSearchProviderMsgs) {
568 base::DictionaryValue manifest;
569 manifest.SetString(keys::kName, "__MSG_name__");
570 manifest.SetString(keys::kDescription, "__MSG_description__");
571
572 base::DictionaryValue* search_provider = new base::DictionaryValue;
573 search_provider->SetString("name", "__MSG_country__");
574 search_provider->SetString("keyword", "__MSG_omnibox_keyword__");
575 search_provider->SetString("search_url", "http://www.foo.__MSG_country__");
576 search_provider->SetString("favicon_url", "http://www.foo.__MSG_country__");
577 search_provider->SetString("suggest_url", "http://www.foo.__MSG_country__");
578 manifest.Set(keys::kOverrideSearchProvider, search_provider);
579
580 manifest.SetString(keys::kOverrideHomepage, "http://www.foo.__MSG_country__");
581
582 base::ListValue* startup_pages = new base::ListValue;
583 startup_pages->AppendString("http://www.foo.__MSG_country__");
584 manifest.Set(keys::kOverrideStartupPage, startup_pages);
585
586 std::string error;
587 scoped_ptr<MessageBundle> messages(CreateManifestBundle());
588
589 EXPECT_TRUE(
590 extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
591
592 std::string result;
593 ASSERT_TRUE(manifest.GetString(keys::kName, &result));
594 EXPECT_EQ("name", result);
595
596 ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
597 EXPECT_EQ("description", result);
598
599 std::string key_prefix(keys::kOverrideSearchProvider);
600 key_prefix += '.';
601 ASSERT_TRUE(manifest.GetString(key_prefix + "name", &result));
602 EXPECT_EQ("de", result);
603
604 ASSERT_TRUE(manifest.GetString(key_prefix + "keyword", &result));
605 EXPECT_EQ("omnibox keyword", result);
606
607 ASSERT_TRUE(manifest.GetString(key_prefix + "search_url", &result));
608 EXPECT_EQ("http://www.foo.de", result);
609
610 ASSERT_TRUE(manifest.GetString(key_prefix + "favicon_url", &result));
611 EXPECT_EQ("http://www.foo.de", result);
612
613 ASSERT_TRUE(manifest.GetString(key_prefix + "suggest_url", &result));
614 EXPECT_EQ("http://www.foo.de", result);
615
616 ASSERT_TRUE(manifest.GetString(keys::kOverrideHomepage, &result));
617 EXPECT_EQ("http://www.foo.de", result);
618
619 ASSERT_TRUE(manifest.GetList(keys::kOverrideStartupPage, &startup_pages));
620 ASSERT_TRUE(startup_pages->GetString(0, &result));
621 EXPECT_EQ("http://www.foo.de", result);
622
623 EXPECT_TRUE(error.empty());
624 }
625
626 // Try with NULL manifest.
627 TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithNullManifest) {
628 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(NULL));
629 }
630
631 // Try with default and current locales missing.
632 TEST(ExtensionL10nUtil, ShouldRelocalizeManifestEmptyManifest) {
633 base::DictionaryValue manifest;
634 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
635 }
636
637 // Try with missing current_locale.
638 TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithDefaultLocale) {
639 base::DictionaryValue manifest;
640 manifest.SetString(keys::kDefaultLocale, "en_US");
641 EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
642 }
643
644 // Try with missing default_locale.
645 TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithCurrentLocale) {
646 base::DictionaryValue manifest;
647 manifest.SetString(keys::kCurrentLocale,
648 extension_l10n_util::CurrentLocaleOrDefault());
649 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
650 }
651
652 // Try with all data present, but with same current_locale as system locale.
653 TEST(ExtensionL10nUtil, ShouldRelocalizeManifestSameCurrentLocale) {
654 base::DictionaryValue manifest;
655 manifest.SetString(keys::kDefaultLocale, "en_US");
656 manifest.SetString(keys::kCurrentLocale,
657 extension_l10n_util::CurrentLocaleOrDefault());
658 EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
659 }
660
661 // Try with all data present, but with different current_locale.
662 TEST(ExtensionL10nUtil, ShouldRelocalizeManifestDifferentCurrentLocale) {
663 base::DictionaryValue manifest;
664 manifest.SetString(keys::kDefaultLocale, "en_US");
665 manifest.SetString(keys::kCurrentLocale, "sr");
666 EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
667 }
668
669 TEST(ExtensionL10nUtil, GetAllFallbackLocales) {
670 std::vector<std::string> fallback_locales;
671 extension_l10n_util::GetAllFallbackLocales("en_US", "all", &fallback_locales);
672 ASSERT_EQ(3U, fallback_locales.size());
673
674 CHECK_EQ("en_US", fallback_locales[0]);
675 CHECK_EQ("en", fallback_locales[1]);
676 CHECK_EQ("all", fallback_locales[2]);
677 }
678
679 } // namespace
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension_l10n_util.cc ('k') | chrome/common/extensions/manifest_tests/extension_manifest_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698