1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_l10n_util.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/error_utils.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_paths.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/manifest_constants.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/message_bundle.h"
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace errors = manifest_errors;
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace keys = manifest_keys;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST(ExtensionL10nUtil, ValidateLocalesWithBadLocale) {
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::ScopedTempDir temp;
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath locale = src_path.AppendASCII("ms");
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(locale));
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath messages_file = locale.Append(kMessagesFilename);
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::string data = "{ \"name\":";
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::WriteFile(messages_file, data.c_str(), data.length()));
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::DictionaryValue manifest;
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  manifest.SetString(keys::kDefaultLocale, "en");
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::string error;
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(extension_l10n_util::ValidateExtensionLocales(
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      temp.path(), &manifest, &error));
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_THAT(
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      error,
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      testing::HasSubstr(base::UTF16ToUTF8(messages_file.LossyDisplayName())));
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesEmptyLocaleFolder) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> locales;
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      extension_l10n_util::GetValidLocales(src_path, &locales, &error));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(locales.empty());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesWithValidLocaleNoMessagesFile) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path));
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path.AppendASCII("sr")));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> locales;
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      extension_l10n_util::GetValidLocales(src_path, &locales, &error));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(locales.empty());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesWithUnsupportedLocale) {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Supported locale.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath locale_1 = src_path.AppendASCII("sr");
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(locale_1));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data("whatever");
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::WriteFile(
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      locale_1.Append(kMessagesFilename), data.c_str(), data.length()));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unsupported locale.
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path.AppendASCII("xxx_yyy")));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> locales;
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(extension_l10n_util::GetValidLocales(src_path, &locales, &error));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(locales.empty());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(locales.find("sr") != locales.end());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(locales.find("xxx_yyy") != locales.end());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetValidLocalesWithValidLocalesAndMessagesFile) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_dir;
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &install_dir));
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  install_dir =
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      install_dir.AppendASCII("extension_with_locales").Append(kLocaleFolder);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> locales;
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      extension_l10n_util::GetValidLocales(install_dir, &locales, &error));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, locales.size());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(locales.find("sr") != locales.end());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(locales.find("en") != locales.end());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(locales.find("en_US") != locales.end());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsValidFallback) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_dir;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &install_dir));
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  install_dir =
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      install_dir.AppendASCII("extension_with_locales").Append(kLocaleFolder);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> locales;
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      extension_l10n_util::GetValidLocales(install_dir, &locales, &error));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> bundle(extension_l10n_util::LoadMessageCatalogs(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      install_dir, "sr", "en_US", locales, &error));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(NULL == bundle.get());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Color", bundle->GetL10nMessage("color"));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Not in the US or GB.", bundle->GetL10nMessage("not_in_US_or_GB"));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsMissingFiles) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> valid_locales;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_locales.insert("sr");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_locales.insert("en");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs(
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          src_path, "en", "sr", valid_locales, &error));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(error.empty());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsBadJSONFormat) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath locale = src_path.AppendASCII("sr");
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(locale));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data = "{ \"name\":";
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::FilePath messages_file = locale.Append(kMessagesFilename);
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::WriteFile(messages_file, data.c_str(), data.length()));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> valid_locales;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_locales.insert("sr");
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_locales.insert("en_US");
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs(
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                          src_path, "en_US", "sr", valid_locales, &error));
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ErrorUtils::FormatErrorMessage(
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                errors::kLocalesInvalidLocale,
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                base::UTF16ToUTF8(messages_file.LossyDisplayName()),
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                "Line: 1, column: 10, Unexpected token."),
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            error);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LoadMessageCatalogsDuplicateKeys) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(temp.CreateUniqueTempDir());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_path = temp.path().Append(kLocaleFolder);
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(src_path));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath locale_1 = src_path.AppendASCII("en");
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(locale_1));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data =
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "{ \"name\": { \"message\": \"something\" }, "
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "\"name\": { \"message\": \"something else\" } }";
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(base::WriteFile(
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      locale_1.Append(kMessagesFilename), data.c_str(), data.length()));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath locale_2 = src_path.AppendASCII("sr");
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(locale_2));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(base::WriteFile(
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      locale_2.Append(kMessagesFilename), data.c_str(), data.length()));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> valid_locales;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_locales.insert("sr");
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  valid_locales.insert("en");
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JSON parser hides duplicates. We are going to get only one key/value
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pair at the end.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> message_bundle(
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      extension_l10n_util::LoadMessageCatalogs(
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          src_path, "en", "sr", valid_locales, &error));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != message_bundle.get());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller owns the returned object.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageBundle* CreateManifestBundle() {
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  linked_ptr<base::DictionaryValue> catalog(new base::DictionaryValue);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* name_tree = new base::DictionaryValue();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name_tree->SetString("message", "name");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("name", name_tree);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue* short_name_tree = new base::DictionaryValue();
2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  short_name_tree->SetString("message", "short_name");
2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  catalog->Set("short_name", short_name_tree);
2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* description_tree = new base::DictionaryValue();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  description_tree->SetString("message", "description");
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("description", description_tree);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* action_title_tree = new base::DictionaryValue();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_title_tree->SetString("message", "action title");
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("title", action_title_tree);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* omnibox_keyword_tree = new base::DictionaryValue();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  omnibox_keyword_tree->SetString("message", "omnibox keyword");
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("omnibox_keyword", omnibox_keyword_tree);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* file_handler_title_tree = new base::DictionaryValue();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_handler_title_tree->SetString("message", "file handler title");
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("file_handler_title", file_handler_title_tree);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* launch_local_path_tree = new base::DictionaryValue();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launch_local_path_tree->SetString("message", "main.html");
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("launch_local_path", launch_local_path_tree);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* launch_web_url_tree = new base::DictionaryValue();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launch_web_url_tree->SetString("message", "http://www.google.com/");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalog->Set("launch_web_url", launch_web_url_tree);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* first_command_description_tree =
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new base::DictionaryValue();
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  first_command_description_tree->SetString("message", "first command");
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  catalog->Set("first_command_description", first_command_description_tree);
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue* second_command_description_tree =
2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new base::DictionaryValue();
2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  second_command_description_tree->SetString("message", "second command");
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  catalog->Set("second_command_description", second_command_description_tree);
2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::DictionaryValue* url_country_tree = new base::DictionaryValue();
2681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  url_country_tree->SetString("message", "de");
2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  catalog->Set("country", url_country_tree);
2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<linked_ptr<base::DictionaryValue> > catalogs;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  catalogs.push_back(catalog);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageBundle* bundle = MessageBundle::Create(catalogs, &error);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bundle);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bundle;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeEmptyManifest) {
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(errors::kInvalidName), error);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithoutNameMsgAndEmptyDescription) {
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "no __MSG");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("no __MSG", result);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manifest.HasKey(keys::kDescription));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameMsgAndEmptyDescription) {
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name__");
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name", result);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manifest.HasKey(keys::kDescription));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithLocalLaunchURL) {
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "name");
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kLaunchLocalPath, "__MSG_launch_local_path__");
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kLaunchLocalPath, &result));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("main.html", result);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithHostedLaunchURL) {
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "name");
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kLaunchWebURL, "__MSG_launch_web_url__");
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kLaunchWebURL, &result));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://www.google.com/", result);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithBadNameMsg) {
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name_is_bad__");
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDescription, "__MSG_description__");
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("__MSG_name_is_bad__", result);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("__MSG_description__", result);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Variable __MSG_name_is_bad__ used but not defined.", error);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionDefaultTitleMsgs) {
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name__");
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDescription, "__MSG_description__");
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string action_title(keys::kBrowserAction);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_title.append(".");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  action_title.append(keys::kPageActionDefaultTitle);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(action_title, "__MSG_title__");
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name", result);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("description", result);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(action_title, &result));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("action title", result);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionOmniboxMsgs) {
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name__");
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDescription, "__MSG_description__");
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kOmniboxKeyword, "__MSG_omnibox_keyword__");
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name", result);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("description", result);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kOmniboxKeyword, &result));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("omnibox keyword", result);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionFileHandlerTitle) {
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name__");
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDescription, "__MSG_description__");
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::ListValue* handlers = new base::ListValue();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.Set(keys::kFileBrowserHandlers, handlers);
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* handler = new base::DictionaryValue();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handlers->Append(handler);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler->SetString(keys::kPageActionDefaultTitle,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "__MSG_file_handler_title__");
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name", result);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("description", result);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(handler->GetString(keys::kPageActionDefaultTitle, &result));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("file handler title", result);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(error.empty());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionCommandDescription) {
4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::DictionaryValue manifest;
4673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name__");
4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  manifest.SetString(keys::kDescription, "__MSG_description__");
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* commands = new base::DictionaryValue();
4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string commands_title(keys::kCommands);
4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  manifest.Set(commands_title, commands);
4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* first_command = new base::DictionaryValue();
4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  commands->Set("first_command", first_command);
4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  first_command->SetString(keys::kDescription,
4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           "__MSG_first_command_description__");
4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* second_command = new base::DictionaryValue();
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  commands->Set("second_command", second_command);
4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  second_command->SetString(keys::kDescription,
4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            "__MSG_second_command_description__");
4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string error;
4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
4853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(
4873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string result;
4903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("name", result);
4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("description", result);
4953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(
497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manifest.GetString("commands.first_command.description", &result));
4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("first command", result);
4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(
501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      manifest.GetString("commands.second_command.description", &result));
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("second command", result);
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(error.empty());
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithShortName) {
5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue manifest;
5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  manifest.SetString(keys::kName, "extension name");
5108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  manifest.SetString(keys::kShortName, "__MSG_short_name__");
5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string error;
5138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(
5168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(error.empty());
5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string result;
5208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kShortName, &result));
5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("short_name", result);
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithBadShortName) {
5258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::DictionaryValue manifest;
5268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  manifest.SetString(keys::kName, "extension name");
5278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  manifest.SetString(keys::kShortName, "__MSG_short_name_bad__");
5288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string error;
5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(
5338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
5348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(error.empty());
5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string result;
5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kShortName, &result));
5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("__MSG_short_name_bad__", result);
5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(ExtensionL10nUtil, LocalizeManifestWithSearchProviderMsgs) {
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::DictionaryValue manifest;
5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manifest.SetString(keys::kName, "__MSG_name__");
5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manifest.SetString(keys::kDescription, "__MSG_description__");
5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::DictionaryValue* search_provider = new base::DictionaryValue;
5471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  search_provider->SetString("name", "__MSG_country__");
5481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  search_provider->SetString("keyword", "__MSG_omnibox_keyword__");
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  search_provider->SetString("search_url", "http://www.foo.__MSG_country__");
5501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  search_provider->SetString("favicon_url", "http://www.foo.__MSG_country__");
5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  search_provider->SetString("suggest_url", "http://www.foo.__MSG_country__");
552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  manifest.Set(keys::kOverrideSearchProvider, search_provider);
553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  manifest.SetString(keys::kOverrideHomepage, "http://www.foo.__MSG_country__");
555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::ListValue* startup_pages = new base::ListValue;
557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  startup_pages->AppendString("http://www.foo.__MSG_country__");
558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  manifest.Set(keys::kOverrideStartupPage, startup_pages);
5591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string error;
5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<MessageBundle> messages(CreateManifestBundle());
5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::string result;
5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("name", result);
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("description", result);
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string key_prefix(keys::kOverrideSearchProvider);
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  key_prefix += '.';
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(key_prefix + "name", &result));
5761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("de", result);
5771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(key_prefix + "keyword", &result));
5791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("omnibox keyword", result);
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(key_prefix + "search_url", &result));
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("http://www.foo.de", result);
5831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(key_prefix + "favicon_url", &result));
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("http://www.foo.de", result);
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(manifest.GetString(key_prefix + "suggest_url", &result));
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ("http://www.foo.de", result);
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
590effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(manifest.GetString(keys::kOverrideHomepage, &result));
591effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ("http://www.foo.de", result);
592effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
593effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(manifest.GetList(keys::kOverrideStartupPage, &startup_pages));
594effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(startup_pages->GetString(0, &result));
595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ("http://www.foo.de", result);
596effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(error.empty());
5981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with NULL manifest.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithNullManifest) {
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(NULL));
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with default and current locales missing.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestEmptyManifest) {
6077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with missing current_locale.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithDefaultLocale) {
6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDefaultLocale, "en_US");
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with missing default_locale.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithCurrentLocale) {
6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kCurrentLocale,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     extension_l10n_util::CurrentLocaleOrDefault());
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with all data present, but with same current_locale as system locale.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestSameCurrentLocale) {
6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDefaultLocale, "en_US");
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kCurrentLocale,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     extension_l10n_util::CurrentLocaleOrDefault());
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Try with all data present, but with different current_locale.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, ShouldRelocalizeManifestDifferentCurrentLocale) {
6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue manifest;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kDefaultLocale, "en_US");
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest.SetString(keys::kCurrentLocale, "sr");
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(&manifest));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ExtensionL10nUtil, GetAllFallbackLocales) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> fallback_locales;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_l10n_util::GetAllFallbackLocales("en_US", "all", &fallback_locales);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, fallback_locales.size());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ("en_US", fallback_locales[0]);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ("en", fallback_locales[1]);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_EQ("all", fallback_locales[2]);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace extensions
655