1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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 "chrome/common/extensions/extension_message_bundle.h" 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <string> 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <vector> 98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/i18n/rtl.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/linked_ptr.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/string_util.h" 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/utf_string_conversions.h" 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/values.h" 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_constants.h" 178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_error_utils.h" 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_l10n_util.h" 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "testing/gtest/include/gtest/gtest.h" 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace errors = extension_manifest_errors; 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionMessageBundleTest : public testing::Test { 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen protected: 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen enum BadDictionary { 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen INVALID_NAME, 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen NAME_NOT_A_TREE, 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EMPTY_NAME_TREE, 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen MISSING_MESSAGE, 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen PLACEHOLDER_NOT_A_TREE, 318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EMPTY_PLACEHOLDER_TREE, 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CONTENT_MISSING, 338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen MESSAGE_PLACEHOLDER_DOESNT_MATCH, 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Helper method for dictionary building. 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetDictionary(const std::string& name, 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* subtree, 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* target) { 408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen target->Set(name, static_cast<Value*>(subtree)); 418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void CreateContentTree(const std::string& name, 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& content, 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* dict) { 468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* content_tree = new DictionaryValue; 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen content_tree->SetString(ExtensionMessageBundle::kContentKey, content); 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetDictionary(name, content_tree, dict); 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void CreatePlaceholdersTree(DictionaryValue* dict) { 528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* placeholders_tree = new DictionaryValue; 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateContentTree("a", "A", placeholders_tree); 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateContentTree("b", "B", placeholders_tree); 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateContentTree("c", "C", placeholders_tree); 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetDictionary(ExtensionMessageBundle::kPlaceholdersKey, 578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen placeholders_tree, 588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict); 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void CreateMessageTree(const std::string& name, 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string& message, 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool create_placeholder_subtree, 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* dict) { 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* message_tree = new DictionaryValue; 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (create_placeholder_subtree) 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreatePlaceholdersTree(message_tree); 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen message_tree->SetString(ExtensionMessageBundle::kMessageKey, message); 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetDictionary(name, message_tree, dict); 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Caller owns the memory. 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* CreateGoodDictionary() { 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* dict = new DictionaryValue; 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageTree("n1", "message1 $a$ $b$", true, dict); 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageTree("n2", "message2 $c$", true, dict); 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageTree("n3", "message3", false, dict); 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return dict; 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Caller owns the memory. 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* CreateBadDictionary(enum BadDictionary what_is_bad) { 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* dict = CreateGoodDictionary(); 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Now remove/break things. 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen switch (what_is_bad) { 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case INVALID_NAME: 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageTree("n 5", "nevermind", false, dict); 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case NAME_NOT_A_TREE: 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict->SetString("n4", "whatever"); 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case EMPTY_NAME_TREE: { 938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* empty_tree = new DictionaryValue; 948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetDictionary("n4", empty_tree, dict); 958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case MISSING_MESSAGE: 988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict->Remove("n1.message", NULL); 998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case PLACEHOLDER_NOT_A_TREE: 1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict->SetString("n1.placeholders", "whatever"); 1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case EMPTY_PLACEHOLDER_TREE: { 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* empty_tree = new DictionaryValue; 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetDictionary("n1.placeholders", empty_tree, dict); 1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case CONTENT_MISSING: 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict->Remove("n1.placeholders.a.content", NULL); 1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen case MESSAGE_PLACEHOLDER_DOESNT_MATCH: 1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* value; 1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict->Remove("n1.placeholders.a", NULL); 1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen dict->GetDictionary("n1.placeholders", &value); 1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateContentTree("x", "X", value); 1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen break; 1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return dict; 1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen unsigned int ReservedMessagesCount() { 1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Update when adding new reserved messages. 1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return 5U; 1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void CheckReservedMessages(ExtensionMessageBundle* handler) { 1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string ui_locale = extension_l10n_util::CurrentLocaleOrDefault(); 1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(ui_locale, 1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler->GetL10nMessage(ExtensionMessageBundle::kUILocaleKey)); 1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string text_dir = "ltr"; 1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (base::i18n::GetTextDirectionForLocale(ui_locale.c_str()) == 1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen base::i18n::RIGHT_TO_LEFT) 1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen text_dir = "rtl"; 1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(text_dir, handler->GetL10nMessage( 1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiDirectionKey)); 1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool AppendReservedMessages(const std::string& application_locale) { 1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string error; 1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return handler_->AppendReservedMessagesForLocale( 1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen application_locale, &error); 1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string CreateMessageBundle() { 1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string error; 1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return error; 1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void ClearDictionary() { 1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_->dictionary_.clear(); 1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<ExtensionMessageBundle> handler_; 1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::vector<linked_ptr<DictionaryValue> > catalogs_; 1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1628ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, ReservedMessagesCount) { 1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_EQ(5U, ReservedMessagesCount()); 1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1668ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, InitEmptyDictionaries) { 1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageBundle(); 1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() != NULL); 1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(0U + ReservedMessagesCount(), handler_->size()); 1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CheckReservedMessages(handler_.get()); 1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1738ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, InitGoodDefaultDict) { 1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_.push_back(linked_ptr<DictionaryValue>(CreateGoodDictionary())); 1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageBundle(); 1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() != NULL); 1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(3U + ReservedMessagesCount(), handler_->size()); 1798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message1 A B", handler_->GetL10nMessage("n1")); 1818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message2 C", handler_->GetL10nMessage("n2")); 1828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message3", handler_->GetL10nMessage("n3")); 1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CheckReservedMessages(handler_.get()); 1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1868ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, InitAppDictConsultedFirst) { 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_.push_back(linked_ptr<DictionaryValue>(CreateGoodDictionary())); 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_.push_back(linked_ptr<DictionaryValue>(CreateGoodDictionary())); 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* app_dict = catalogs_[0].get(); 1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Flip placeholders in message of n1 tree. 1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen app_dict->SetString("n1.message", "message1 $b$ $a$"); 1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Remove one message from app dict. 1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen app_dict->Remove("n2", NULL); 1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Replace n3 with N3. 1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen app_dict->Remove("n3", NULL); 1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageTree("N3", "message3_app_dict", false, app_dict); 1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageBundle(); 2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() != NULL); 2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(3U + ReservedMessagesCount(), handler_->size()); 2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message1 B A", handler_->GetL10nMessage("n1")); 2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message2 C", handler_->GetL10nMessage("n2")); 2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message3_app_dict", handler_->GetL10nMessage("n3")); 2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CheckReservedMessages(handler_.get()); 2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2108ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, InitBadAppDict) { 2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_.push_back( 2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen linked_ptr<DictionaryValue>(CreateBadDictionary(INVALID_NAME))); 2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_.push_back(linked_ptr<DictionaryValue>(CreateGoodDictionary())); 2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string error = CreateMessageBundle(); 2168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("Name of a key \"n 5\" is invalid. Only ASCII [a-z], " 2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "[A-Z], [0-9] and \"_\" are allowed.", error); 2208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(NAME_NOT_A_TREE)); 2228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("Not a valid tree for key n4.", error); 2258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(EMPTY_NAME_TREE)); 2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("There is no \"message\" element for key n4.", error); 2308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(MISSING_MESSAGE)); 2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("There is no \"message\" element for key n1.", error); 2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(PLACEHOLDER_NOT_A_TREE)); 2378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("Not a valid \"placeholders\" element for key n1.", error); 2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(EMPTY_PLACEHOLDER_TREE)); 2428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("Variable $a$ used but not defined.", error); 2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(CONTENT_MISSING)); 2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("Invalid \"content\" element for key n1.", error); 2508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_[0].reset(CreateBadDictionary(MESSAGE_PLACEHOLDER_DOESNT_MATCH)); 2528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_.reset(ExtensionMessageBundle::Create(catalogs_, &error)); 2538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("Variable $a$ used but not defined.", error); 2558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2578ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, ReservedMessagesOverrideDeveloperMessages) { 2588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen catalogs_.push_back(linked_ptr<DictionaryValue>(CreateGoodDictionary())); 2598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen DictionaryValue* dict = catalogs_[0].get(); 2618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageTree(ExtensionMessageBundle::kUILocaleKey, "x", false, dict); 2628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string error = CreateMessageBundle(); 2648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(handler_.get() == NULL); 2668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string expected_error = ExtensionErrorUtils::FormatErrorMessage( 2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen errors::kReservedMessageFound, ExtensionMessageBundle::kUILocaleKey); 2688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(expected_error, error); 2698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2718ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, AppendReservedMessagesForLTR) { 2728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageBundle(); 2738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(handler_.get() != NULL); 2758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ClearDictionary(); 2768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(AppendReservedMessages("en_US")); 2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("en_US", 2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_->GetL10nMessage(ExtensionMessageBundle::kUILocaleKey)); 2808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("ltr", handler_->GetL10nMessage( 2818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiDirectionKey)); 2828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("rtl", handler_->GetL10nMessage( 2838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiReversedDirectionKey)); 2848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("left", handler_->GetL10nMessage( 2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiStartEdgeKey)); 2868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("right", handler_->GetL10nMessage( 2878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiEndEdgeKey)); 2888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 2898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2908ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, AppendReservedMessagesForRTL) { 2918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen CreateMessageBundle(); 2928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(handler_.get() != NULL); 2948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ClearDictionary(); 2958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(AppendReservedMessages("he")); 2968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("he", 2988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen handler_->GetL10nMessage(ExtensionMessageBundle::kUILocaleKey)); 2998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("rtl", handler_->GetL10nMessage( 3008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiDirectionKey)); 3018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("ltr", handler_->GetL10nMessage( 3028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiReversedDirectionKey)); 3038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("right", handler_->GetL10nMessage( 3048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiStartEdgeKey)); 3058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("left", handler_->GetL10nMessage( 3068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::kBidiEndEdgeKey)); 3078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3098ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionMessageBundleTest, IsValidNameCheckValidCharacters) { 3108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(ExtensionMessageBundle::IsValidName(std::string("a__BV_9"))); 3118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(ExtensionMessageBundle::IsValidName(std::string("@@a__BV_9"))); 3128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(ExtensionMessageBundle::IsValidName(std::string("$a__BV_9$"))); 3138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(ExtensionMessageBundle::IsValidName(std::string("a-BV-9"))); 3148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(ExtensionMessageBundle::IsValidName(std::string("a#BV!9"))); 3158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(ExtensionMessageBundle::IsValidName(std::string("a<b"))); 3168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstruct ReplaceVariables { 3198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* original; 3208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* result; 3218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* error; 3228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* begin_delimiter; 3238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* end_delimiter; 3248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool pass; 3258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 3268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3278ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(ExtensionMessageBundle, ReplaceMessagesInText) { 3288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* kMessageBegin = ExtensionMessageBundle::kMessageBegin; 3298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* kMessageEnd = ExtensionMessageBundle::kMessageEnd; 3308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* kPlaceholderBegin = ExtensionMessageBundle::kPlaceholderBegin; 3318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const char* kPlaceholderEnd = ExtensionMessageBundle::kPlaceholderEnd; 3328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static ReplaceVariables test_cases[] = { 3348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Message replacement. 3358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is __MSG_siMPle__ message", "This is simple message", 3368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is __MSG_", "This is __MSG_", 3388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is __MSG__simple__ message", "This is __MSG__simple__ message", 3408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "Variable __MSG__simple__ used but not defined.", 3418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen kMessageBegin, kMessageEnd, false }, 3428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "__MSG_LoNg__", "A pretty long replacement", 3438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "A __MSG_SimpLE__MSG_ a", "A simpleMSG_ a", 3458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "A __MSG_simple__MSG_long__", "A simpleMSG_long__", 3478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "A __MSG_simple____MSG_long__", "A simpleA pretty long replacement", 3498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "__MSG_d1g1ts_are_ok__", "I are d1g1t", 3518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kMessageBegin, kMessageEnd, true }, 3528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Placeholder replacement. 3538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is $sImpLe$ message", "This is simple message", 3548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is $", "This is $", 3568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is $$sIMPle$ message", "This is $simple message", 3588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "$LONG_V$", "A pretty long replacement", 3608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "A $simple$$ a", "A simple$ a", 3628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "A $simple$long_v$", "A simplelong_v$", 3648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "A $simple$$long_v$", "A simpleA pretty long replacement", 3668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is $bad name$", "This is $bad name$", 3688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "", kPlaceholderBegin, kPlaceholderEnd, true }, 3698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen { "This is $missing$", "This is $missing$", 3708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "Variable $missing$ used but not defined.", 3718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen kPlaceholderBegin, kPlaceholderEnd, false }, 3728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 3738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::SubstitutionMap messages; 3758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen messages.insert(std::make_pair("simple", "simple")); 3768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen messages.insert(std::make_pair("long", "A pretty long replacement")); 3778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen messages.insert(std::make_pair("long_v", "A pretty long replacement")); 3788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen messages.insert(std::make_pair("bad name", "Doesn't matter")); 3798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen messages.insert(std::make_pair("d1g1ts_are_ok", "I are d1g1t")); 3808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen for (size_t i = 0; i < arraysize(test_cases); ++i) { 3828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string text = test_cases[i].original; 3838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string error; 3848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(test_cases[i].pass, 3858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionMessageBundle::ReplaceVariables(messages, 3868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen test_cases[i].begin_delimiter, 3878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen test_cases[i].end_delimiter, 3888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen &text, 3898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen &error)); 3908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(test_cases[i].result, text); 3918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 3928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 3938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 3948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen/////////////////////////////////////////////////////////////////////////////// 3958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// 3968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Renderer helper functions test. 3978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// 3988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen/////////////////////////////////////////////////////////////////////////////// 3998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4008ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(GetExtensionToL10nMessagesMapTest, ReturnsTheSameObject) { 4018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionToL10nMessagesMap* map1 = GetExtensionToL10nMessagesMap(); 4028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(NULL != map1); 4038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionToL10nMessagesMap* map2 = GetExtensionToL10nMessagesMap(); 4058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_EQ(map1, map2); 4068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 4078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4088ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(GetExtensionToL10nMessagesMapTest, ReturnsNullForUnknownExtensionId) { 4098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string extension_id("some_unique_12334212314234_id"); 4108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen L10nMessagesMap* map = GetL10nMessagesMap(extension_id); 4118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(NULL == map); 4128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 4138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4148ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST(GetExtensionToL10nMessagesMapTest, ReturnsMapForKnownExtensionId) { 4158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const std::string extension_id("some_unique_121212121212121_id"); 4168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Store a map for given id. 4178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen L10nMessagesMap messages; 4188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen messages.insert(std::make_pair("message_name", "message_value")); 4198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen (*GetExtensionToL10nMessagesMap())[extension_id] = messages; 4208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 4218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen L10nMessagesMap* map = GetL10nMessagesMap(extension_id); 4228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(NULL != map); 4238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(1U, map->size()); 4248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ("message_value", (*map)["message_name"]); 4258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 426