1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <sstream>
17 #include <string>
18 #include "file_ex.h"
19 #include "gtest/gtest.h"
20 #include "language/language_ui.h"
21
22 using namespace testing::ext;
23 using namespace Updater;
24 using namespace Lang;
25 using namespace std::string_literals;
26
27 namespace UpdaterUt {
28 constexpr auto LOCALE_FILE = "/data/updater/ui/locale";
29 constexpr std::array STR_FILES {"/data/updater/ui/l0.json", "/data/updater/ui/l1.json", "/data/updater/ui/l2.json"};
30 constexpr auto KEY_EMPTY_JSON = "/data/updater/ui/keyEmpty.json";
31 constexpr auto STR_NO_EXIST_JSON = "/data/updater/ui/strNotExist.json";
32 constexpr auto ALL_CORRECT_JSON = "/data/updater/ui/correct_all.json";
33 // only correct for one language
34 constexpr std::array CORRECT_JSONS {
35 std::make_tuple(Language::CHINESE, "zh", "/data/updater/ui/correct_zh.json"),
36 std::make_tuple(Language::SPANISH, "es", "/data/updater/ui/correct_es.json"),
37 std::make_tuple(Language::ENGLISH, "en", "/data/updater/ui/correct_en.json")
38 };
39 constexpr std::array LANG_ARRAY { Language::CHINESE, Language::ENGLISH, Language::SPANISH };
40 constexpr std::array LANG_MAP {
41 std::pair {Language::CHINESE, "zh"},
42 std::pair {Language::ENGLISH, "en"},
43 std::pair {Language::SPANISH, "es"}
44 };
GetStrForLang(Language language)45 constexpr auto GetStrForLang(Language language)
46 {
47 for (auto [lang, localeStr] : LANG_MAP) {
48 if (lang == language) {
49 return localeStr;
50 }
51 }
52 return "";
53 }
54 static_assert(GetStrForLang(Language::CHINESE), "zh");
55 static_assert(GetStrForLang(Language::ENGLISH), "en");
56 static_assert(GetStrForLang(Language::SPANISH), "es");
57
58 class UpdaterUiLangUnitTest : public testing::Test {
59 public:
SetUpTestCase(void)60 static void SetUpTestCase(void) {}
TearDownTestCase(void)61 static void TearDownTestCase(void) {}
SetUp()62 void SetUp() override {}
TearDown()63 void TearDown() override
64 {
65 unlink(LOCALE_FILE);
66 }
67 };
68
GetTestJson(LangResource & langRes)69 std::string GetTestJson(LangResource &langRes)
70 {
71 std::stringstream ss;
72 ss << R"({"locale":{"localeFile" : ")"s;
73 ss << langRes.localeFile << R"(", "res" : [)";
74 for (auto &res : langRes.res) {
75 ss << R"({"path" : ")";
76 ss << res.path;
77 ss << R"(", "level" :)";
78 ss << res.level;
79 ss << R"(},)";
80 }
81 if (!langRes.res.empty()) {
82 ss.seekp(-1, std::ios_base::end);
83 }
84 ss << "]}}";
85 LOG(INFO) << ss.str();
86 return ss.str();
87 }
88
89 HWTEST_F(UpdaterUiLangUnitTest, testLoadLangRes, TestSize.Level0)
90 {
91 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {}), false);
92 LangResource langRes {};
93 langRes.localeFile = LOCALE_FILE;
94 langRes.res = std::vector<Res> {{"invalidPath", -1}};
95
96 // level invalid, too small
97 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
98
99 langRes.res = std::vector<Res> {{"invalidPath", 3}};
100 // level invalid, too big
101 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
102
103 langRes.res = std::vector<Res> {{"invalidPath", 0}};
104 // locale file not existed
105 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
106 }
107
108 HWTEST_F(UpdaterUiLangUnitTest, testParseLanguage, TestSize.Level0)
109 {
110 LangResource langRes {};
111 langRes.localeFile = LOCALE_FILE;
112 langRes.res = std::vector<Res> {{"invalidPath", 0}};
113 // set langRes.localeFile
114 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
115 EXPECT_EQ(LanguageUI::GetInstance().ParseLanguage(), Language::ENGLISH);
116
117 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "en"), true);
118 EXPECT_EQ(LanguageUI::GetInstance().ParseLanguage(), Language::ENGLISH);
119
120 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "zh"), true);
121 EXPECT_EQ(LanguageUI::GetInstance().ParseLanguage(), Language::CHINESE);
122
123 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "es"), true);
124 EXPECT_EQ(LanguageUI::GetInstance().ParseLanguage(), Language::SPANISH);
125
126 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "invalid"), true);
127 EXPECT_EQ(LanguageUI::GetInstance().ParseLanguage(), Language::ENGLISH);
128 }
129
130 HWTEST_F(UpdaterUiLangUnitTest, testParseLangIfZh, TestSize.Level0)
131 {
132 std::string globalLang {};
133
134 globalLang = "zh";
135 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
136
137 globalLang = "zh-CN";
138 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
139
140 globalLang = "zh_CN";
141 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
142
143 globalLang = "zh-US";
144 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::ENGLISH);
145
146 globalLang = "zh-Hans-CN";
147 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
148
149 globalLang = "zh-Hans_CN";
150 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
151
152 globalLang = "zh-Hans-US";
153 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::ENGLISH);
154
155 globalLang = "zh-Hans";
156 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::ENGLISH);
157
158 globalLang = "zh-CN-Hans";
159 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
160
161 // abnormal situations, globalLang doesn't start with "zh"
162 globalLang = "";
163 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
164
165 globalLang = "z";
166 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
167
168 globalLang = "en";
169 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
170
171 globalLang = "-CN";
172 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
173
174 globalLang = "-U";
175 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::ENGLISH);
176
177 globalLang = "en-Latn-US";
178 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::ENGLISH);
179
180 globalLang = "en-Latn-CN";
181 EXPECT_EQ(LanguageUI::GetInstance().ParseLangIfZh(globalLang), Language::CHINESE);
182 }
183
184 HWTEST_F(UpdaterUiLangUnitTest, testInit01, TestSize.Level0)
185 {
186 LangResource langRes {};
187 langRes.localeFile = LOCALE_FILE;
188 langRes.res = std::vector<Res> {{"invalidPath", 0}};
189 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
190 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::CHINESE), false);
191 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::ENGLISH), false);
192 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::SPANISH), false);
193 }
194
195 HWTEST_F(UpdaterUiLangUnitTest, testInit02, TestSize.Level0)
196 {
197 LangResource langRes {};
198 langRes.localeFile = LOCALE_FILE;
199 langRes.res = std::vector<Res> {{KEY_EMPTY_JSON, 0}};
200 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
201 EXPECT_EQ(OHOS::FileExists(KEY_EMPTY_JSON), true) << KEY_EMPTY_JSON << " not exist";
202 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::CHINESE), false);
203 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::ENGLISH), false);
204 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::SPANISH), false);
205 }
206
207 HWTEST_F(UpdaterUiLangUnitTest, testInit03, TestSize.Level0)
208 {
209 LangResource langRes {};
210 langRes.localeFile = LOCALE_FILE;
211 langRes.res = std::vector<Res> {{STR_NO_EXIST_JSON, 0}};
212 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), false);
213 EXPECT_EQ(OHOS::FileExists(STR_NO_EXIST_JSON), true) << STR_NO_EXIST_JSON << " not exist";
214 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::CHINESE), false);
215 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::ENGLISH), false);
216 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::SPANISH), false);
217 }
218
219 HWTEST_F(UpdaterUiLangUnitTest, testInit04, TestSize.Level0)
220 {
221 LangResource langRes {};
222 langRes.localeFile = LOCALE_FILE;
223 langRes.res = std::vector<Res> {{ALL_CORRECT_JSON, 0}};
224 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
225 EXPECT_EQ(OHOS::FileExists(ALL_CORRECT_JSON), true) << ALL_CORRECT_JSON << " not exist";
226 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::CHINESE), true);
227 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::ENGLISH), true);
228 EXPECT_EQ(LanguageUI::GetInstance().Init(Language::SPANISH), true);
229
230 for (auto [langType, locale, filePath] : CORRECT_JSONS) {
231 langRes.res = std::vector<Res> {{filePath, 0}};
232 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, GetStrForLang(langType)), true);
233 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
234 EXPECT_EQ(OHOS::FileExists(filePath), true) << filePath << " not exist";
235 for (auto lang : LANG_ARRAY) {
236 EXPECT_EQ(LanguageUI::GetInstance().Init(lang), lang == langType);
237 }
238 }
239 }
240
241 HWTEST_F(UpdaterUiLangUnitTest, testTranslate01, TestSize.Level0)
242 {
243 LangResource langRes {};
244 langRes.localeFile = LOCALE_FILE;
245 langRes.res = std::vector<Res> {{STR_FILES[0], 0}};
246
247 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "en"), true);
248 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
249 EXPECT_EQ(LanguageUI::GetInstance().Translate("REBOOT_DEVICE"), "reboot devices");
250 EXPECT_EQ(LanguageUI::GetInstance().Translate("SHUTDOWN_DEVICE"), "shutdown device");
251 EXPECT_EQ(LanguageUI::GetInstance().Translate("FACTORY_RESET"), "factory reset");
252 EXPECT_EQ(LanguageUI::GetInstance().Translate("NOT_EXIST_KEY"), "");
253
254 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "zh"), true);
255 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
256 EXPECT_EQ(LanguageUI::GetInstance().Translate("REBOOT_DEVICE"), "重启设备");
257 EXPECT_EQ(LanguageUI::GetInstance().Translate("SHUTDOWN_DEVICE"), "关闭设备");
258 EXPECT_EQ(LanguageUI::GetInstance().Translate("FACTORY_RESET"), "清除用户数据");
259 EXPECT_EQ(LanguageUI::GetInstance().Translate("NOT_EXIST_KEY"), "");
260 }
261
262 HWTEST_F(UpdaterUiLangUnitTest, testTranslate02, TestSize.Level1)
263 {
264 LangResource langRes {};
265 langRes.localeFile = LOCALE_FILE;
266 langRes.res = std::vector<Res> {{STR_FILES[0], 0}, {STR_FILES[1], 1}};
267
268 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "en"), true);
269 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
270 EXPECT_EQ(LanguageUI::GetInstance().Translate("REBOOT_DEVICE"), "reboot devices");
271 EXPECT_EQ(LanguageUI::GetInstance().Translate("SHUTDOWN_DEVICE"), "shutdown device");
272 EXPECT_EQ(LanguageUI::GetInstance().Translate("FACTORY_RESET"), "factory reset");
273 EXPECT_EQ(LanguageUI::GetInstance().Translate("SDCARD_UPDATE"), "update from sdcard");
274 EXPECT_EQ(LanguageUI::GetInstance().Translate("NOT_EXIST_KEY"), "default text");
275
276 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "zh"), true);
277 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
278 EXPECT_EQ(LanguageUI::GetInstance().Translate("REBOOT_DEVICE"), "重启设备");
279 EXPECT_EQ(LanguageUI::GetInstance().Translate("SHUTDOWN_DEVICE"), "关闭设备");
280 EXPECT_EQ(LanguageUI::GetInstance().Translate("FACTORY_RESET"), "清除用户数据");
281 EXPECT_EQ(LanguageUI::GetInstance().Translate("SDCARD_UPDATE"), "SD卡升级");
282 EXPECT_EQ(LanguageUI::GetInstance().Translate("NOT_EXIST_KEY"), "默认文字");
283 }
284
285 HWTEST_F(UpdaterUiLangUnitTest, testTranslate03, TestSize.Level1)
286 {
287 LangResource langRes {};
288 langRes.localeFile = LOCALE_FILE;
289 langRes.res = std::vector<Res> {{STR_FILES[0], 0}, {STR_FILES[1], 1}, {STR_FILES[2], 2}};
290
291 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "en"), true);
292 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
293 EXPECT_EQ(LanguageUI::GetInstance().Translate("REBOOT_DEVICE"), "reboot devices");
294 EXPECT_EQ(LanguageUI::GetInstance().Translate("SHUTDOWN_DEVICE"), "shutdown");
295 EXPECT_EQ(LanguageUI::GetInstance().Translate("FACTORY_RESET"), "factory reset");
296 EXPECT_EQ(LanguageUI::GetInstance().Translate("SDCARD_UPDATE"), "sdcard update");
297 EXPECT_EQ(LanguageUI::GetInstance().Translate("NOT_EXIST_KEY"), "default");
298
299 EXPECT_EQ(OHOS::SaveStringToFile(LOCALE_FILE, "zh"), true);
300 EXPECT_EQ(LanguageUI::GetInstance().LoadLangRes(JsonNode {GetTestJson(langRes)}), true);
301 EXPECT_EQ(LanguageUI::GetInstance().Translate("REBOOT_DEVICE"), "重启设备");
302 EXPECT_EQ(LanguageUI::GetInstance().Translate("SHUTDOWN_DEVICE"), "关机");
303 EXPECT_EQ(LanguageUI::GetInstance().Translate("FACTORY_RESET"), "恢复出厂设置");
304 EXPECT_EQ(LanguageUI::GetInstance().Translate("SDCARD_UPDATE"), "SD卡升级");
305 EXPECT_EQ(LanguageUI::GetInstance().Translate("NOT_EXIST_KEY"), "默认");
306 }
307 }
308