Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/command_line.h"
      6 #include "base/environment.h"
      7 #include "build/build_config.h"
      8 #include "chrome/test/base/in_process_browser_test.h"
      9 #include "ui/base/ui_base_switches.h"
     10 
     11 namespace {
     12 
     13 // A class that over-writes the system locale only in a scope. To emulate the
     14 // specified environment on Linux, this class over-writes a LC_ALL environment
     15 // variable when creating a LocaleTest object and restore it with the original
     16 // value when deleting the object. (This environment variable may affect other
     17 // tests and we have to restore it regardless of the results of LocaleTests.)
     18 class ScopedLocale {
     19  public:
     20   explicit ScopedLocale(const char* locale) : locale_(locale) {
     21 #if defined(OS_LINUX)
     22     old_locale_ = getenv("LC_ALL");
     23 
     24     static const struct {
     25       const char* chrome_locale;
     26       const char* system_locale;
     27     } kLocales[] = {
     28       { "da", "da_DK.UTF-8" },
     29       { "he", "he_IL.UTF-8" },
     30       { "zh-TW", "zh_TW.UTF-8" }
     31     };
     32     bool found_locale = false;
     33     for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kLocales); ++i) {
     34       if (kLocales[i].chrome_locale == locale) {
     35         found_locale = true;
     36         setenv("LC_ALL", kLocales[i].system_locale, 1);
     37       }
     38     }
     39     DCHECK(found_locale);
     40 #endif
     41   }
     42 
     43   ~ScopedLocale() {
     44 #if defined(OS_LINUX)
     45     scoped_ptr<base::Environment> env(base::Environment::Create());
     46     if (old_locale_) {
     47       env->SetVar("LC_ALL", old_locale_);
     48     } else {
     49       env->UnSetVar("LC_ALL");
     50     }
     51 #endif
     52   }
     53 
     54   const std::string& locale() { return locale_; }
     55 
     56  private:
     57   std::string locale_;
     58 #if defined(OS_LINUX)
     59   const char* old_locale_;
     60 #endif
     61 };
     62 
     63 // A base class for tests used in this file. This class over-writes the system
     64 // locale and run Chrome with a '--lang' option. To add a new LocaleTest, add a
     65 // class derived from this class and call the constructor with the locale name
     66 // used by Chrome.
     67 class LocaleTestBase : public InProcessBrowserTest {
     68  public:
     69   explicit LocaleTestBase(const char* locale) : locale_(locale) {
     70   }
     71 
     72   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
     73     command_line->AppendSwitchASCII(switches::kLang, locale_.locale());
     74   }
     75 
     76  protected:
     77   ScopedLocale locale_;
     78 };
     79 
     80 // Test classes that run Chrome on the Danish locale, the Hebrew locale, and
     81 // the Traditional-Chinese locale, respectively.
     82 class LocaleTestDanish : public LocaleTestBase {
     83  public:
     84   LocaleTestDanish() : LocaleTestBase("da") {
     85   }
     86 };
     87 
     88 class LocaleTestHebrew : public LocaleTestBase {
     89  public:
     90   LocaleTestHebrew() : LocaleTestBase("he") {
     91   }
     92 };
     93 
     94 class LocaleTestTraditionalChinese : public LocaleTestBase {
     95  public:
     96   LocaleTestTraditionalChinese() : LocaleTestBase("zh-TW") {
     97   }
     98 };
     99 
    100 }  // namespace
    101 
    102 // Start Chrome and shut it down on the Danish locale, the Hebrew locale, and
    103 // the Traditional-Chinese locale, respectively. These tests do not need any
    104 // code here because they just verify we can start Chrome and shut it down
    105 // cleanly on these locales.
    106 IN_PROC_BROWSER_TEST_F(LocaleTestDanish, TestStart) {
    107 }
    108 
    109 IN_PROC_BROWSER_TEST_F(LocaleTestHebrew, TestStart) {
    110 }
    111 
    112 IN_PROC_BROWSER_TEST_F(LocaleTestTraditionalChinese, TestStart) {
    113 }
    114