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