// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/command_line.h" #include "base/environment.h" #include "build/build_config.h" #include "chrome/test/base/in_process_browser_test.h" #include "ui/base/ui_base_switches.h" namespace { // A class that over-writes the system locale only in a scope. To emulate the // specified environment on Linux, this class over-writes a LC_ALL environment // variable when creating a LocaleTest object and restore it with the original // value when deleting the object. (This environment variable may affect other // tests and we have to restore it regardless of the results of LocaleTests.) class ScopedLocale { public: explicit ScopedLocale(const char* locale) : locale_(locale) { #if defined(OS_LINUX) old_locale_ = getenv("LC_ALL"); static const struct { const char* chrome_locale; const char* system_locale; } kLocales[] = { { "da", "da_DK.UTF-8" }, { "he", "he_IL.UTF-8" }, { "zh-TW", "zh_TW.UTF-8" } }; bool found_locale = false; for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kLocales); ++i) { if (kLocales[i].chrome_locale == locale) { found_locale = true; setenv("LC_ALL", kLocales[i].system_locale, 1); } } DCHECK(found_locale); #endif } ~ScopedLocale() { #if defined(OS_LINUX) scoped_ptr<base::Environment> env(base::Environment::Create()); if (old_locale_) { env->SetVar("LC_ALL", old_locale_); } else { env->UnSetVar("LC_ALL"); } #endif } const std::string& locale() { return locale_; } private: std::string locale_; #if defined(OS_LINUX) const char* old_locale_; #endif }; // A base class for tests used in this file. This class over-writes the system // locale and run Chrome with a '--lang' option. To add a new LocaleTest, add a // class derived from this class and call the constructor with the locale name // used by Chrome. class LocaleTestBase : public InProcessBrowserTest { public: explicit LocaleTestBase(const char* locale) : locale_(locale) { } virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { command_line->AppendSwitchASCII(switches::kLang, locale_.locale()); } protected: ScopedLocale locale_; }; // Test classes that run Chrome on the Danish locale, the Hebrew locale, and // the Traditional-Chinese locale, respectively. class LocaleTestDanish : public LocaleTestBase { public: LocaleTestDanish() : LocaleTestBase("da") { } }; class LocaleTestHebrew : public LocaleTestBase { public: LocaleTestHebrew() : LocaleTestBase("he") { } }; class LocaleTestTraditionalChinese : public LocaleTestBase { public: LocaleTestTraditionalChinese() : LocaleTestBase("zh-TW") { } }; } // namespace // Start Chrome and shut it down on the Danish locale, the Hebrew locale, and // the Traditional-Chinese locale, respectively. These tests do not need any // code here because they just verify we can start Chrome and shut it down // cleanly on these locales. IN_PROC_BROWSER_TEST_F(LocaleTestDanish, TestStart) { } IN_PROC_BROWSER_TEST_F(LocaleTestHebrew, TestStart) { } IN_PROC_BROWSER_TEST_F(LocaleTestTraditionalChinese, TestStart) { }