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