15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class that over-writes the system locale only in a scope. To emulate the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified environment on Linux, this class over-writes a LC_ALL environment 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// variable when creating a LocaleTest object and restore it with the original 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value when deleting the object. (This environment variable may affect other 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests and we have to restore it regardless of the results of LocaleTests.) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedLocale { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedLocale(const char* locale) : locale_(locale) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_locale_ = getenv("LC_ALL"); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* chrome_locale; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* system_locale; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } kLocales[] = { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "da", "da_DK.UTF-8" }, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "he", "he_IL.UTF-8" }, 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) { "zh-TW", "zh_TW.UTF-8" } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found_locale = false; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kLocales); ++i) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kLocales[i].chrome_locale == locale) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found_locale = true; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setenv("LC_ALL", kLocales[i].system_locale, 1); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(found_locale); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedLocale() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_locale_) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->SetVar("LC_ALL", old_locale_); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env->UnSetVar("LC_ALL"); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& locale() { return locale_; } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* old_locale_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A base class for tests used in this file. This class over-writes the system 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locale and run Chrome with a '--lang' option. To add a new LocaleTest, add a 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class derived from this class and call the constructor with the locale name 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used by Chrome. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocaleTestBase : public InProcessBrowserTest { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit LocaleTestBase(const char* locale) : locale_(locale) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kLang, locale_.locale()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedLocale locale_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test classes that run Chrome on the Danish locale, the Hebrew locale, and 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Traditional-Chinese locale, respectively. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocaleTestDanish : public LocaleTestBase { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocaleTestDanish() : LocaleTestBase("da") { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocaleTestHebrew : public LocaleTestBase { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocaleTestHebrew() : LocaleTestBase("he") { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocaleTestTraditionalChinese : public LocaleTestBase { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocaleTestTraditionalChinese() : LocaleTestBase("zh-TW") { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Start Chrome and shut it down on the Danish locale, the Hebrew locale, and 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Traditional-Chinese locale, respectively. These tests do not need any 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code here because they just verify we can start Chrome and shut it down 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cleanly on these locales. 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocaleTestDanish, TestStart) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocaleTestHebrew, TestStart) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocaleTestTraditionalChinese, TestStart) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 114