• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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