1 // Copyright 2014 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.
6 #include "base/command_line.h"
7 #include "base/strings/string_split.h"
8 #include "base/strings/string_util.h"
9 #include "base/threading/thread_restrictions.h"
10 #include "chrome/browser/chromeos/base/locale_util.h"
11 #include "chrome/browser/chromeos/customization/customization_document.h"
12 #include "chrome/browser/ui/webui/chromeos/login/l10n_util.h"
13 #include "chrome/test/base/in_process_browser_test.h"
14 #include "chromeos/system/fake_statistics_provider.h"
15 #include "chromeos/system/statistics_provider.h"
16 #include "content/public/test/test_utils.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "ui/base/l10n/l10n_util.h"
20 using chromeos::locale_util::SwitchLanguageCallback
;
21 using chromeos::locale_util::LanguageSwitchResult
;
27 class LanguageSwitchedWaiter
{
29 explicit LanguageSwitchedWaiter(SwitchLanguageCallback callback
)
30 : callback_(callback
),
32 runner_(new content::MessageLoopRunner
) {}
34 void ExitMessageLoop(const LanguageSwitchResult
& result
) {
37 callback_
.Run(result
);
46 SwitchLanguageCallback
Callback() {
47 return SwitchLanguageCallback(base::Bind(
48 &LanguageSwitchedWaiter::ExitMessageLoop
, base::Unretained(this)));
52 SwitchLanguageCallback callback_
;
54 scoped_refptr
<content::MessageLoopRunner
> runner_
;
55 DISALLOW_COPY_AND_ASSIGN(LanguageSwitchedWaiter
);
59 const char* locale_alias
;
60 const char* locale_name
;
61 } locale_aliases
[] = {{"en-AU", "en-GB"},
69 // Several language IDs are actually aliases to another IDs, so real language
70 // ID is reported as "loaded" when alias is requested.
71 std::string
GetExpectedLanguage(const std::string
& required
) {
72 std::string expected
= required
;
74 for (size_t i
= 0; i
< arraysize(locale_aliases
); ++i
) {
75 if (required
!= locale_aliases
[i
].locale_alias
)
78 expected
= locale_aliases
[i
].locale_name
;
85 void VerifyLanguageSwitched(const LanguageSwitchResult
& result
) {
86 EXPECT_TRUE(result
.success
) << "SwitchLanguage failed: required='"
87 << result
.requested_locale
<< "', actual='"
88 << result
.loaded_locale
89 << "', success=" << result
.success
;
90 EXPECT_EQ(GetExpectedLanguage(result
.requested_locale
), result
.loaded_locale
)
91 << "SwitchLanguage failed: required='" << result
.requested_locale
92 << "', actual='" << result
.loaded_locale
93 << "', success=" << result
.success
;
96 std::string
Print(const std::vector
<std::string
>& locales
) {
97 std::string
result("{");
98 for (size_t i
= 0; i
< locales
.size(); ++i
) {
103 result
+= locales
[i
];
110 const char* kVPDInitialLocales
[] = {
115 "ar,bg,bn,ca,cs,da,de,el,en-AU,en-CA,en-GB,en-NZ,en-US,en-ZA,es,es-419,et,"
116 "fa,fi,fil,fr,fr-CA,gu,he,hi,hr,hu,id,it,ja,kn,ko,lt,lv,ml,mr,ms,nl,nb,pl,"
117 "pt-BR,pt-PT,ro,ru,sk,sl,sr,sv,ta,te,th,tr,vi,zh-CN,zh-TW",
120 const std::vector
<std::string
> languages_available
= {
178 } // anonymous namespace
180 typedef InProcessBrowserTest CustomizationLocaleTest
;
182 IN_PROC_BROWSER_TEST_F(CustomizationLocaleTest
, CheckAvailableLocales
) {
183 for (size_t i
= 0; i
< languages_available
.size(); ++i
) {
184 LanguageSwitchedWaiter
waiter(base::Bind(&VerifyLanguageSwitched
));
185 locale_util::SwitchLanguage(languages_available
[i
], true, true,
189 std::string resolved_locale
;
190 base::ThreadRestrictions::ScopedAllowIO allow_io
;
191 l10n_util::CheckAndResolveLocale(languages_available
[i
],
193 EXPECT_EQ(GetExpectedLanguage(languages_available
[i
]), resolved_locale
)
194 << "CheckAndResolveLocale() failed for language='"
195 << languages_available
[i
] << "'";
200 class CustomizationVPDTest
: public InProcessBrowserTest
,
201 public testing::WithParamInterface
<const char*> {
203 CustomizationVPDTest()
204 : statistics_provider_(new system::FakeStatisticsProvider()) {
205 // Set the instance returned by GetInstance() for testing.
206 system::StatisticsProvider::SetTestProvider(statistics_provider_
.get());
207 statistics_provider_
->SetMachineStatistic("initial_locale", GetParam());
208 statistics_provider_
->SetMachineStatistic("keyboard_layout", "");
212 scoped_ptr
<system::FakeStatisticsProvider
> statistics_provider_
;
215 IN_PROC_BROWSER_TEST_P(CustomizationVPDTest
, GetUILanguageList
) {
216 std::vector
<std::string
> locales
;
217 base::SplitString(GetParam(), ',', &locales
);
219 for (std::string
& l
: locales
) {
220 base::TrimString(l
, " ", &l
);
223 StartupCustomizationDocument::GetInstance()->configured_locales())
224 << "Test failed for initial_locale='" << GetParam()
225 << "', locales=" << Print(locales
);
227 scoped_ptr
<base::ListValue
> ui_language_list
= GetUILanguageList(NULL
, "");
228 EXPECT_GE(ui_language_list
->GetSize(), locales
.size())
229 << "Test failed for initial_locale='" << GetParam() << "'";
231 for (size_t i
= 0; i
< ui_language_list
->GetSize(); ++i
) {
232 base::DictionaryValue
* language_info
= NULL
;
233 ASSERT_TRUE(ui_language_list
->GetDictionary(i
, &language_info
))
234 << "Test failed for initial_locale='" << GetParam() << "', i=" << i
;
237 ASSERT_TRUE(language_info
->GetString("value", &value
))
238 << "Test failed for initial_locale='" << GetParam() << "', i=" << i
;
240 if (i
< locales
.size()) {
241 EXPECT_EQ(locales
[i
], value
) << "Test failed for initial_locale='"
242 << GetParam() << "', i=" << i
;
244 EXPECT_EQ(kMostRelevantLanguagesDivider
, value
)
245 << "Test failed for initial_locale='" << GetParam() << "', i=" << i
;
251 INSTANTIATE_TEST_CASE_P(StringSequence
,
252 CustomizationVPDTest
,
253 testing::ValuesIn(kVPDInitialLocales
));
255 } // namespace chromeos