extension_l10n_util_unittest.cc revision 8ae428e0fb7feea16d79853f29447469a93bedff
18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Use of this source code is governed by a BSD-style license that can be
38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// found in the LICENSE file.
48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "app/l10n_util.h"
68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_path.h"
78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_util.h"
88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/linked_ptr.h"
98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/path_service.h"
108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/scoped_ptr.h"
118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/scoped_temp_dir.h"
128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/values.h"
138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/chrome_paths.h"
148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension.h"
158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_constants.h"
168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_l10n_util.h"
178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_message_bundle.h"
188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace errors = extension_manifest_errors;
218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace keys = extension_manifest_keys;
228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace {
248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
258ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, GetValidLocalesEmptyLocaleFolder) {
268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir temp;
278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(temp.CreateUniqueTempDir());
288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath src_path = temp.path().Append(Extension::kLocaleFolder);
308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path));
318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> locales;
348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension_l10n_util::GetValidLocales(src_path,
358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                    &locales,
368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                    &error));
378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(locales.empty());
398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
418ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, GetValidLocalesWithValidLocaleNoMessagesFile) {
428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir temp;
438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(temp.CreateUniqueTempDir());
448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath src_path = temp.path().Append(Extension::kLocaleFolder);
468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path));
478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path.AppendASCII("sr")));
488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> locales;
518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension_l10n_util::GetValidLocales(src_path,
528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                    &locales,
538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                    &error));
548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(locales.empty());
568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
588ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, GetValidLocalesWithUnsupportedLocale) {
598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir temp;
608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(temp.CreateUniqueTempDir());
618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath src_path = temp.path().Append(Extension::kLocaleFolder);
638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path));
648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Supported locale.
658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath locale_1 = src_path.AppendASCII("sr");
668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(locale_1));
678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string data("whatever");
688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::WriteFile(
698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      locale_1.Append(Extension::kMessagesFilename),
708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      data.c_str(), data.length()));
718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // Unsupported locale.
728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path.AppendASCII("xxx_yyy")));
738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> locales;
768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension_l10n_util::GetValidLocales(src_path,
778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                   &locales,
788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                   &error));
798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(locales.empty());
818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(locales.find("sr") != locales.end());
828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(locales.find("xxx_yyy") != locales.end());
838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
858ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, GetValidLocalesWithValidLocalesAndMessagesFile) {
868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath install_dir;
878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  install_dir = install_dir.AppendASCII("extensions")
898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("good")
908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("Extensions")
918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("1.0.0.0")
938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .Append(Extension::kLocaleFolder);
948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> locales;
978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension_l10n_util::GetValidLocales(install_dir,
988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                   &locales,
998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                   &error));
1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(3U, locales.size());
1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(locales.find("sr") != locales.end());
1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(locales.find("en") != locales.end());
1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(locales.find("en_US") != locales.end());
1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1068ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LoadMessageCatalogsValidFallback) {
1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath install_dir;
1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir));
1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  install_dir = install_dir.AppendASCII("extensions")
1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("good")
1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("Extensions")
1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj")
1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .AppendASCII("1.0.0.0")
1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      .Append(Extension::kLocaleFolder);
1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> locales;
1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension_l10n_util::GetValidLocales(install_dir,
1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                   &locales,
1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                   &error));
1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> bundle(
1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LoadMessageCatalogs(
1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen          install_dir, "sr", "en_US", locales, &error));
1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_FALSE(NULL == bundle.get());
1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(error.empty());
1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("Color", bundle->GetL10nMessage("color"));
1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("Not in the US or GB.", bundle->GetL10nMessage("not_in_US_or_GB"));
1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1318ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LoadMessageCatalogsMissingFiles) {
1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir temp;
1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(temp.CreateUniqueTempDir());
1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath src_path = temp.path().Append(Extension::kLocaleFolder);
1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path));
1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> valid_locales;
1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid_locales.insert("sr");
1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid_locales.insert("en");
1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs(src_path,
1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                               "en",
1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                               "sr",
1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                               valid_locales,
1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                               &error));
1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(error.empty());
1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1508ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LoadMessageCatalogsBadJSONFormat) {
1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir temp;
1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(temp.CreateUniqueTempDir());
1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath src_path = temp.path().Append(Extension::kLocaleFolder);
1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path));
1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath locale = src_path.AppendASCII("sr");
1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(locale));
1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string data = "{ \"name\":";
1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(
1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      file_util::WriteFile(locale.Append(Extension::kMessagesFilename),
1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                           data.c_str(), data.length()));
1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> valid_locales;
1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid_locales.insert("sr");
1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid_locales.insert("en_US");
1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(NULL == extension_l10n_util::LoadMessageCatalogs(src_path,
1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                              "en_US",
1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                              "sr",
1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                              valid_locales,
1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                                              &error));
1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("Line: 1, column: 10, Syntax error.", error);
1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1778ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LoadMessageCatalogsDuplicateKeys) {
1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ScopedTempDir temp;
1798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(temp.CreateUniqueTempDir());
1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath src_path = temp.path().Append(Extension::kLocaleFolder);
1828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(src_path));
1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath locale_1 = src_path.AppendASCII("en");
1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(locale_1));
1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string data =
1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    "{ \"name\": { \"message\": \"something\" }, "
1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    "\"name\": { \"message\": \"something else\" } }";
1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(
1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      file_util::WriteFile(locale_1.Append(Extension::kMessagesFilename),
1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                           data.c_str(), data.length()));
1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  FilePath locale_2 = src_path.AppendASCII("sr");
1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(file_util::CreateDirectory(locale_2));
1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(
1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      file_util::WriteFile(locale_2.Append(Extension::kMessagesFilename),
1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                           data.c_str(), data.length()));
2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::set<std::string> valid_locales;
2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid_locales.insert("sr");
2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  valid_locales.insert("en");
2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // JSON parser hides duplicates. We are going to get only one key/value
2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  // pair at the end.
2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> message_bundle(
2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LoadMessageCatalogs(src_path,
2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                               "en",
2108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                               "sr",
2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                               valid_locales,
2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                                               &error));
2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(NULL != message_bundle.get());
2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(error.empty());
2158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
2168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2178ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, GetParentLocales) {
2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::vector<std::string> locales;
2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  const std::string top_locale("sr_Cyrl_RS");
2208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  extension_l10n_util::GetParentLocales(top_locale, &locales);
2218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_EQ(3U, locales.size());
2238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("sr_Cyrl_RS", locales[0]);
2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("sr_Cyrl", locales[1]);
2258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("sr", locales[2]);
2268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Caller owns the returned object.
2298ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenExtensionMessageBundle* CreateManifestBundle() {
2308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  linked_ptr<DictionaryValue> catalog(new DictionaryValue);
2318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue* name_tree = new DictionaryValue();
2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  name_tree->SetString("message", "name");
2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  catalog->Set("name", name_tree);
2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue* description_tree = new DictionaryValue();
2378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  description_tree->SetString("message", "description");
2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  catalog->Set("description", description_tree);
2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue* action_title_tree = new DictionaryValue();
2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action_title_tree->SetString("message", "action title");
2428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  catalog->Set("title", action_title_tree);
2438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::vector<linked_ptr<DictionaryValue> > catalogs;
2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  catalogs.push_back(catalog);
2468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
2488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionMessageBundle* bundle =
2498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    ExtensionMessageBundle::Create(catalogs, &error);
2508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(NULL != bundle);
2518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(error.empty());
2528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  return bundle;
2548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
2558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2568ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LocalizeEmptyManifest) {
2578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
2588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
2598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> messages(CreateManifestBundle());
2608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(
2628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
2638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ(errors::kInvalidName, error);
2648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2668ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LocalizeManifestWithoutNameMsgAndEmptyDescription) {
2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
2688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kName, "no __MSG");
2698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
2708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> messages(CreateManifestBundle());
2718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(
2738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
2748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string result;
2768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("no __MSG", result);
2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(manifest.HasKey(keys::kDescription));
2808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(error.empty());
2828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
2838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2848ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LocalizeManifestWithNameMsgAndEmptyDescription) {
2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
2868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kName, "__MSG_name__");
2878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
2888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> messages(CreateManifestBundle());
2898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(
2918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
2928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string result;
2948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
2958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("name", result);
2968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(manifest.HasKey(keys::kDescription));
2988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
2998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(error.empty());
3008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3028ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LocalizeManifestWithBadNameMsg) {
3038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
3048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kName, "__MSG_name_is_bad__");
3058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kDescription, "__MSG_description__");
3068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
3078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> messages(CreateManifestBundle());
3088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(
3108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string result;
3138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
3148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("__MSG_name_is_bad__", result);
3158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
3178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("__MSG_description__", result);
3188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("Variable __MSG_name_is_bad__ used but not defined.", error);
3208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3228ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, LocalizeManifestWithNameDescriptionDefaultTitleMsgs) {
3238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
3248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kName, "__MSG_name__");
3258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kDescription, "__MSG_description__");
3268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string action_title(keys::kBrowserAction);
3278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action_title.append(".");
3288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  action_title.append(keys::kPageActionDefaultTitle);
3298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(action_title, "__MSG_title__");
3308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string error;
3328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  scoped_ptr<ExtensionMessageBundle> messages(CreateManifestBundle());
3338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(
3358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen      extension_l10n_util::LocalizeManifest(*messages, &manifest, &error));
3368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  std::string result;
3388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(keys::kName, &result));
3398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("name", result);
3408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(keys::kDescription, &result));
3428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("description", result);
3438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ASSERT_TRUE(manifest.GetString(action_title, &result));
3458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_EQ("action title", result);
3468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(error.empty());
3488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Try with NULL manifest.
3518ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithNullManifest) {
3528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionInfo info(NULL, "", FilePath(), Extension::LOAD);
3538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(info));
3558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Try with default and current locales missing.
3588ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, ShouldRelocalizeManifestEmptyManifest) {
3598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
3608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionInfo info(&manifest, "", FilePath(), Extension::LOAD);
3618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(info));
3638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Try with missing current_locale.
3668ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithDefaultLocale) {
3678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
3688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kDefaultLocale, "en_US");
3698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionInfo info(&manifest, "", FilePath(), Extension::LOAD);
3718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(info));
3738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Try with missing default_locale.
3768ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, ShouldRelocalizeManifestWithCurrentLocale) {
3778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
3788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kCurrentLocale,
3798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                     extension_l10n_util::CurrentLocaleOrDefault());
3808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionInfo info(&manifest, "", FilePath(), Extension::LOAD);
3828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(info));
3848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Try with all data present, but with same current_locale as system locale.
3878ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, ShouldRelocalizeManifestSameCurrentLocale) {
3888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
3898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kDefaultLocale, "en_US");
3908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kCurrentLocale,
3918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen                     extension_l10n_util::CurrentLocaleOrDefault());
3928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionInfo info(&manifest, "", FilePath(), Extension::LOAD);
3948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_FALSE(extension_l10n_util::ShouldRelocalizeManifest(info));
3968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
3978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
3988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Try with all data present, but with different current_locale.
3998ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionL10nUtil, ShouldRelocalizeManifestDifferentCurrentLocale) {
4008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  DictionaryValue manifest;
4018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kDefaultLocale, "en_US");
4028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  manifest.SetString(keys::kCurrentLocale, "sr");
4038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  ExtensionInfo info(&manifest, "", FilePath(), Extension::LOAD);
4058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen  EXPECT_TRUE(extension_l10n_util::ShouldRelocalizeManifest(info));
4078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}
4088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
4098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}  // namespace
410