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