| Index: chrome/browser/chromeos/customization_document_browsertest.cc
|
| diff --git a/chrome/browser/chromeos/customization_document_browsertest.cc b/chrome/browser/chromeos/customization_document_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a3d56819f1238e1864cc2b92890aa2fa5633ec57
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/customization_document_browsertest.cc
|
| @@ -0,0 +1,255 @@
|
| +// Copyright 2014 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/bind.h"
|
| +#include "base/command_line.h"
|
| +#include "base/strings/string_split.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "base/threading/thread_restrictions.h"
|
| +#include "chrome/browser/chromeos/base/locale_util.h"
|
| +#include "chrome/browser/chromeos/customization_document.h"
|
| +#include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
|
| +#include "chrome/test/base/in_process_browser_test.h"
|
| +#include "chromeos/system/fake_statistics_provider.h"
|
| +#include "chromeos/system/statistics_provider.h"
|
| +#include "content/public/test/test_utils.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +
|
| +using chromeos::locale_util::SwitchLanguageCallback;
|
| +using chromeos::locale_util::LanguageSwitchResult;
|
| +
|
| +namespace chromeos {
|
| +
|
| +namespace {
|
| +
|
| +class LanguageSwitchedWaiter {
|
| + public:
|
| + explicit LanguageSwitchedWaiter(SwitchLanguageCallback callback)
|
| + : callback_(callback),
|
| + finished_(false),
|
| + runner_(new content::MessageLoopRunner) {}
|
| +
|
| + void ExitMessageLoop(const LanguageSwitchResult& result) {
|
| + finished_ = true;
|
| + runner_->Quit();
|
| + callback_.Run(result);
|
| + }
|
| +
|
| + void Wait() {
|
| + if (finished_)
|
| + return;
|
| + runner_->Run();
|
| + }
|
| +
|
| + SwitchLanguageCallback Callback() {
|
| + return SwitchLanguageCallback(base::Bind(
|
| + &LanguageSwitchedWaiter::ExitMessageLoop, base::Unretained(this)));
|
| + }
|
| +
|
| + private:
|
| + SwitchLanguageCallback callback_;
|
| + bool finished_;
|
| + scoped_refptr<content::MessageLoopRunner> runner_;
|
| + DISALLOW_COPY_AND_ASSIGN(LanguageSwitchedWaiter);
|
| +};
|
| +
|
| +const struct {
|
| + const char* locale_alias;
|
| + const char* locale_name;
|
| +} locale_aliases[] = {{"en-AU", "en-GB"},
|
| + {"en-CA", "en-GB"},
|
| + {"en-NZ", "en-GB"},
|
| + {"en-ZA", "en-GB"},
|
| + {"fr-CA", "fr"},
|
| + {"no", "nb"},
|
| + {"iw", "he"}};
|
| +
|
| +// Several language IDs are actually aliases to another IDs, so real language
|
| +// ID is reported as "loaded" when alias is requested.
|
| +std::string GetExpectedLanguage(const std::string& required) {
|
| + std::string expected = required;
|
| +
|
| + for (size_t i = 0; i < arraysize(locale_aliases); ++i) {
|
| + if (required != locale_aliases[i].locale_alias)
|
| + continue;
|
| +
|
| + expected = locale_aliases[i].locale_name;
|
| + break;
|
| + }
|
| +
|
| + return expected;
|
| +}
|
| +
|
| +void VerifyLanguageSwitched(const LanguageSwitchResult& result) {
|
| + EXPECT_TRUE(result.success) << "SwitchLanguage failed: required='"
|
| + << result.requested_locale << "', actual='"
|
| + << result.loaded_locale
|
| + << "', success=" << result.success;
|
| + EXPECT_EQ(GetExpectedLanguage(result.requested_locale), result.loaded_locale)
|
| + << "SwitchLanguage failed: required='" << result.requested_locale
|
| + << "', actual='" << result.loaded_locale
|
| + << "', success=" << result.success;
|
| +}
|
| +
|
| +std::string Print(const std::vector<std::string>& locales) {
|
| + std::string result("{");
|
| + for (size_t i = 0; i < locales.size(); ++i) {
|
| + if (i != 0) {
|
| + result += ", ";
|
| + }
|
| + result += "'";
|
| + result += locales[i];
|
| + result += "'";
|
| + }
|
| + result += "}";
|
| + return result;
|
| +}
|
| +
|
| +const char* kVPDInitialLocales[] = {
|
| + "ar",
|
| + "ar,bg",
|
| + "ar,bg,bn",
|
| + "ar,bg,bn,ca",
|
| + "ar,bg,bn,ca,cs,da,de,el,en-AU,en-CA,en-GB,en-NZ,en-US,en-ZA,es,es-419,et,"
|
| + "fa,fi,fil,fr,fr-CA,gu,he,hi,hr,hu,id,it,ja,kn,ko,lt,lv,ml,mr,ms,nl,nb,pl,"
|
| + "pt-BR,pt-PT,ro,ru,sk,sl,sr,sv,ta,te,th,tr,vi,zh-CN,zh-TW",
|
| +};
|
| +
|
| +const std::vector<std::string> languages_available = {
|
| + "ar",
|
| + "bg",
|
| + "bn",
|
| + "ca",
|
| + "cs",
|
| + "da",
|
| + "de",
|
| + "el",
|
| + "en-AU",
|
| + "en-CA",
|
| + "en-GB",
|
| + "en-NZ",
|
| + "en-US",
|
| + "en-ZA",
|
| + "es",
|
| + "es-419",
|
| + "et",
|
| + "fa",
|
| + "fi",
|
| + "fil",
|
| + "fr",
|
| + "fr-CA",
|
| + "gu",
|
| + "he",
|
| + "hi",
|
| + "hr",
|
| + "hu",
|
| + "id",
|
| + "it",
|
| + "ja",
|
| + "kn",
|
| + "ko",
|
| + "lt",
|
| + "lv",
|
| + "ml",
|
| + "mr",
|
| + "ms",
|
| + "nl",
|
| + "nb",
|
| + "pl",
|
| + "pt-BR",
|
| + "pt-PT",
|
| + "ro",
|
| + "ru",
|
| + "sk",
|
| + "sl",
|
| + "sr",
|
| + "sv",
|
| + "ta",
|
| + "te",
|
| + "th",
|
| + "tr",
|
| + "vi",
|
| + "zh-CN",
|
| + "zh-TW"
|
| +};
|
| +
|
| +} // anonymous namespace
|
| +
|
| +typedef InProcessBrowserTest CustomizationLocaleTest;
|
| +
|
| +IN_PROC_BROWSER_TEST_F(CustomizationLocaleTest, CheckAvailableLocales) {
|
| + for (size_t i = 0; i < languages_available.size(); ++i) {
|
| + LanguageSwitchedWaiter waiter(base::Bind(&VerifyLanguageSwitched));
|
| + locale_util::SwitchLanguage(languages_available[i], true, true,
|
| + waiter.Callback());
|
| + waiter.Wait();
|
| + {
|
| + std::string resolved_locale;
|
| + base::ThreadRestrictions::ScopedAllowIO allow_io;
|
| + l10n_util::CheckAndResolveLocale(languages_available[i],
|
| + &resolved_locale);
|
| + EXPECT_EQ(GetExpectedLanguage(languages_available[i]), resolved_locale)
|
| + << "CheckAndResolveLocale() failed for language='"
|
| + << languages_available[i] << "'";
|
| + }
|
| + }
|
| +}
|
| +
|
| +class CustomizationVPDTest : public InProcessBrowserTest,
|
| + public testing::WithParamInterface<const char*> {
|
| + public:
|
| + CustomizationVPDTest()
|
| + : statistics_provider_(new system::FakeStatisticsProvider()) {
|
| + // Set the instance returned by GetInstance() for testing.
|
| + system::StatisticsProvider::SetTestProvider(statistics_provider_.get());
|
| + statistics_provider_->SetMachineStatistic("initial_locale", GetParam());
|
| + statistics_provider_->SetMachineStatistic("keyboard_layout", "");
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<system::FakeStatisticsProvider> statistics_provider_;
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_P(CustomizationVPDTest, GetUILanguageList) {
|
| + std::vector<std::string> locales;
|
| + base::SplitString(GetParam(), ',', &locales);
|
| +
|
| + for (std::string& l : locales) {
|
| + base::TrimString(l, " ", &l);
|
| + }
|
| + EXPECT_EQ(locales,
|
| + StartupCustomizationDocument::GetInstance()->configured_locales())
|
| + << "Test failed for initial_locale='" << GetParam()
|
| + << "', locales=" << Print(locales);
|
| +
|
| + scoped_ptr<base::ListValue> ui_language_list = GetUILanguageList(NULL, "");
|
| + EXPECT_GE(ui_language_list->GetSize(), locales.size())
|
| + << "Test failed for initial_locale='" << GetParam() << "'";
|
| +
|
| + for (size_t i = 0; i < ui_language_list->GetSize(); ++i) {
|
| + base::DictionaryValue* language_info = NULL;
|
| + ASSERT_TRUE(ui_language_list->GetDictionary(i, &language_info))
|
| + << "Test failed for initial_locale='" << GetParam() << "', i=" << i;
|
| +
|
| + std::string value;
|
| + ASSERT_TRUE(language_info->GetString("value", &value))
|
| + << "Test failed for initial_locale='" << GetParam() << "', i=" << i;
|
| +
|
| + if (i < locales.size()) {
|
| + EXPECT_EQ(locales[i], value) << "Test failed for initial_locale='"
|
| + << GetParam() << "', i=" << i;
|
| + } else {
|
| + EXPECT_EQ(kMostRelevantLanguagesDivider, value)
|
| + << "Test failed for initial_locale='" << GetParam() << "', i=" << i;
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +INSTANTIATE_TEST_CASE_P(StringSequence,
|
| + CustomizationVPDTest,
|
| + testing::ValuesIn(kVPDInitialLocales));
|
| +
|
| +} // namespace chromeos
|
|
|