1/*
2 * Copyright (c) 2023 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 <gtest/gtest.h>
17#include "accesstoken_kit.h"
18#include "i18n_service_ability_client.h"
19#include "locale_config.h"
20#include "nativetoken_kit.h"
21#include "preferred_language.h"
22#include "token_setproc.h"
23#include "i18n_service_test.h"
24
25using testing::ext::TestSize;
26using namespace std;
27namespace OHOS {
28namespace Global {
29namespace I18n {
30static const uint64_t SELF_TOKEN_ID = GetSelfTokenID();
31static constexpr int32_t I18N_UID = 3013;
32static constexpr int32_t ROOT_UID = 0;
33
34class I18nServiceTest : public testing::Test {
35public:
36    static void SetUpTestCase(void);
37    static void TearDownTestCase(void);
38    void SetUp();
39    void TearDown();
40};
41
42void I18nServiceTest::SetUpTestCase(void)
43{}
44
45void I18nServiceTest::TearDownTestCase(void)
46{}
47
48void I18nServiceTest::SetUp(void)
49{}
50
51void I18nServiceTest::TearDown(void)
52{}
53
54void RemoveNativeTokenTypeAndPermissions()
55{
56    SetSelfTokenID(SELF_TOKEN_ID);
57    seteuid(ROOT_UID);
58    OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
59    seteuid(I18N_UID);
60}
61
62void AddNativeTokenTypeAndPermissions()
63{
64    const char* permissions[] = {
65        "ohos.permission.UPDATE_CONFIGURATION"
66    };
67    NativeTokenInfoParams infoInstance = {
68        .dcapsNum = 0,
69        .permsNum = sizeof(permissions) / sizeof(permissions[0]),
70        .aclsNum = 0,
71        .dcaps = nullptr,
72        .perms = permissions,
73        .acls = nullptr,
74        .aplStr = "system_basic",
75    };
76    infoInstance.processName = "I18nServiceTest";
77    SetSelfTokenID(GetAccessTokenId(&infoInstance));
78    seteuid(ROOT_UID);
79    int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
80    printf("ReloadNativeTokenInfo result is %d. \n", ret);
81    seteuid(I18N_UID);
82}
83
84void InitTestEnvironment()
85{
86    LocaleConfig::SetSystemLanguage("zh-Hans");
87    LocaleConfig::SetSystemRegion("CN");
88    LocaleConfig::SetSystemLocale("zh-Hans-CN");
89    LocaleConfig::Set24HourClock("true");
90    std::vector<std::string> preferredLanguageList = PreferredLanguage::GetPreferredLanguageList();
91    if (preferredLanguageList.size() > 1) {
92        for (size_t i = preferredLanguageList.size(); i > 1; --i) {
93            PreferredLanguage::RemovePreferredLanguage(i);
94        }
95    }
96    RemoveNativeTokenTypeAndPermissions();
97}
98
99/**
100 * @tc.name: I18nServiceFuncTest001
101 * @tc.desc: Test I18nServiceAbilityClient SetSystemLanguage: no permission case
102 * @tc.type: FUNC
103 */
104HWTEST_F(I18nServiceTest, I18nServiceFuncTest001, TestSize.Level1)
105{
106    InitTestEnvironment();
107    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage("en");
108    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
109}
110
111/**
112 * @tc.name: I18nServiceFuncTest002
113 * @tc.desc: Test I18nServiceAbilityClient SetSystemLanguage
114 * @tc.type: FUNC
115 */
116HWTEST_F(I18nServiceTest, I18nServiceFuncTest002, TestSize.Level1)
117{
118    InitTestEnvironment();
119    AddNativeTokenTypeAndPermissions();
120    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage("en");
121    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
122}
123
124/**
125 * @tc.name: I18nServiceFuncTest003
126 * @tc.desc: Test I18nServiceAbilityClient SetSystemLanguage: invalid language tag
127 * @tc.type: FUNC
128 */
129HWTEST_F(I18nServiceTest, I18nServiceFuncTest003, TestSize.Level1)
130{
131    InitTestEnvironment();
132    AddNativeTokenTypeAndPermissions();
133    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage("fake_language_tag");
134    EXPECT_EQ(err, I18nErrorCode::INVALID_LANGUAGE_TAG);
135}
136
137/**
138 * @tc.name: I18nServiceFuncTest004
139 * @tc.desc: Test I18nServiceAbilityClient SetSystemRegion: no permission case.
140 * @tc.type: FUNC
141 */
142HWTEST_F(I18nServiceTest, I18nServiceFuncTest004, TestSize.Level1)
143{
144    InitTestEnvironment();
145    I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion("US");
146    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
147}
148
149/**
150 * @tc.name: I18nServiceFuncTest005
151 * @tc.desc: Test I18nServiceAbilityClient SetSystemRegion
152 * @tc.type: FUNC
153 */
154HWTEST_F(I18nServiceTest, I18nServiceFuncTest005, TestSize.Level1)
155{
156    InitTestEnvironment();
157    AddNativeTokenTypeAndPermissions();
158    I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion("US");
159    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
160}
161
162/**
163 * @tc.name: I18nServiceFuncTest006
164 * @tc.desc: Test I18nServiceAbilityClient SetSystemRegion: invalid region tag.
165 * @tc.type: FUNC
166 */
167HWTEST_F(I18nServiceTest, I18nServiceFuncTest006, TestSize.Level1)
168{
169    InitTestEnvironment();
170    AddNativeTokenTypeAndPermissions();
171    I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion("fake_region_tag");
172    EXPECT_EQ(err, I18nErrorCode::INVALID_REGION_TAG);
173}
174
175/**
176 * @tc.name: I18nServiceFuncTest007
177 * @tc.desc: Test I18nServiceAbilityClient SetSystemLocale: no permission case.
178 * @tc.type: FUNC
179 */
180HWTEST_F(I18nServiceTest, I18nServiceFuncTest007, TestSize.Level1)
181{
182    InitTestEnvironment();
183    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLocale("en-US");
184    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
185}
186
187/**
188 * @tc.name: I18nServiceFuncTest008
189 * @tc.desc: Test I18nServiceAbilityClient SetSystemLocale
190 * @tc.type: FUNC
191 */
192HWTEST_F(I18nServiceTest, I18nServiceFuncTest008, TestSize.Level1)
193{
194    InitTestEnvironment();
195    AddNativeTokenTypeAndPermissions();
196    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLocale("en-US");
197    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
198    err = I18nServiceAbilityClient::SetSystemLocale("en-XA");
199    LocaleConfig::GetDisplayLanguage("zh", "en-US", true);
200}
201
202/**
203 * @tc.name: I18nServiceFuncTest009
204 * @tc.desc: Test I18nServiceAbilityClient SetSystemLocale: invalid locale tag.
205 * @tc.type: FUNC
206 */
207HWTEST_F(I18nServiceTest, I18nServiceFuncTest009, TestSize.Level1)
208{
209    InitTestEnvironment();
210    AddNativeTokenTypeAndPermissions();
211    I18nErrorCode err = I18nServiceAbilityClient::SetSystemRegion("fake_locale_tag");
212    EXPECT_EQ(err, I18nErrorCode::INVALID_REGION_TAG);
213}
214
215/**
216 * @tc.name: I18nServiceFuncTest010
217 * @tc.desc: Test I18nServiceAbilityClient Set24HourClock: no permission.
218 * @tc.type: FUNC
219 */
220HWTEST_F(I18nServiceTest, I18nServiceFuncTest010, TestSize.Level1)
221{
222    InitTestEnvironment();
223    I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock("false");
224    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
225}
226
227/**
228 * @tc.name: I18nServiceFuncTest011
229 * @tc.desc: Test I18nServiceAbilityClient Set24HourClock: set 24 hour clock to false.
230 * @tc.type: FUNC
231 */
232HWTEST_F(I18nServiceTest, I18nServiceFuncTest011, TestSize.Level1)
233{
234    InitTestEnvironment();
235    AddNativeTokenTypeAndPermissions();
236    I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock("false");
237    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
238}
239
240/**
241 * @tc.name: I18nServiceFuncTest012
242 * @tc.desc: Test I18nServiceAbilityClient Set24HourClock: set 24 hour clock to true.
243 * @tc.type: FUNC
244 */
245HWTEST_F(I18nServiceTest, I18nServiceFuncTest012, TestSize.Level1)
246{
247    InitTestEnvironment();
248    AddNativeTokenTypeAndPermissions();
249    I18nErrorCode err = I18nServiceAbilityClient::Set24HourClock("true");
250    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
251}
252
253/**
254 * @tc.name: I18nServiceFuncTest013
255 * @tc.desc: Test I18nServiceAbilityClient SetUsingLocalDigit: test no permission case.
256 * @tc.type: FUNC
257 */
258HWTEST_F(I18nServiceTest, I18nServiceFuncTest013, TestSize.Level1)
259{
260    InitTestEnvironment();
261    I18nErrorCode err = I18nServiceAbilityClient::SetUsingLocalDigit(true);
262    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
263}
264
265/**
266 * @tc.name: I18nServiceFuncTest014
267 * @tc.desc: Test I18nServiceAbilityClient SetUsingLocalDigit: test no local digit language.
268 * @tc.type: FUNC
269 */
270HWTEST_F(I18nServiceTest, I18nServiceFuncTest014, TestSize.Level1)
271{
272    InitTestEnvironment();
273    AddNativeTokenTypeAndPermissions();
274    I18nErrorCode err = I18nServiceAbilityClient::SetUsingLocalDigit(true);
275    EXPECT_EQ(err, I18nErrorCode::UPDATE_LOCAL_DIGIT_FAILED);
276}
277
278/**
279 * @tc.name: I18nServiceFuncTest015
280 * @tc.desc: Test I18nServiceAbilityClient SetUsingLocalDigit test set local digit to true
281 * @tc.type: FUNC
282 */
283HWTEST_F(I18nServiceTest, I18nServiceFuncTest015, TestSize.Level1)
284{
285    InitTestEnvironment();
286    AddNativeTokenTypeAndPermissions();
287    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage("ar");
288    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
289    err = I18nServiceAbilityClient::SetUsingLocalDigit(true);
290    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
291}
292
293/**
294 * @tc.name: I18nServiceFuncTest016
295 * @tc.desc: Test I18nServiceAbilityClient SetUsingLocalDigit test set local digit to false
296 * @tc.type: FUNC
297 */
298HWTEST_F(I18nServiceTest, I18nServiceFuncTest016, TestSize.Level1)
299{
300    InitTestEnvironment();
301    AddNativeTokenTypeAndPermissions();
302    I18nErrorCode err = I18nServiceAbilityClient::SetSystemLanguage("ar");
303    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
304    err = I18nServiceAbilityClient::SetUsingLocalDigit(false);
305    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
306}
307
308/**
309 * @tc.name: I18nServiceFuncTest017
310 * @tc.desc: Test I18nServiceAbilityClient AddPreferredLanguage: test no permission case
311 * @tc.type: FUNC
312 */
313HWTEST_F(I18nServiceTest, I18nServiceFuncTest017, TestSize.Level1)
314{
315    InitTestEnvironment();
316    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("ar", 0);
317    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
318}
319
320/**
321 * @tc.name: I18nServiceFuncTest018
322 * @tc.desc: Test I18nServiceAbilityClient AddPreferredLanguage: test add language to preferred language list header.
323 * @tc.type: FUNC
324 */
325HWTEST_F(I18nServiceTest, I18nServiceFuncTest018, TestSize.Level1)
326{
327    InitTestEnvironment();
328    AddNativeTokenTypeAndPermissions();
329    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("ar", 0);
330    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
331}
332
333/**
334 * @tc.name: I18nServiceFuncTest019
335 * @tc.desc: Test I18nServiceAbilityClient AddPreferredLanguage: test add language to preferred language list tailor.
336 * @tc.type: FUNC
337 */
338HWTEST_F(I18nServiceTest, I18nServiceFuncTest019, TestSize.Level1)
339{
340    InitTestEnvironment();
341    AddNativeTokenTypeAndPermissions();
342    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 1);
343    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
344}
345
346/**
347 * @tc.name: I18nServiceFuncTest020
348 * @tc.desc: Test I18nServiceAbilityClient AddPreferredLanguage: test add language to negative index.
349 * @tc.type: FUNC
350 */
351HWTEST_F(I18nServiceTest, I18nServiceFuncTest020, TestSize.Level1)
352{
353    InitTestEnvironment();
354    AddNativeTokenTypeAndPermissions();
355    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", -10);
356    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
357}
358
359/**
360 * @tc.name: I18nServiceFuncTest021
361 * @tc.desc: Test I18nServiceAbilityClient AddPreferredLanguage: test add language to large index.
362 * @tc.type: FUNC
363 */
364HWTEST_F(I18nServiceTest, I18nServiceFuncTest021, TestSize.Level1)
365{
366    InitTestEnvironment();
367    AddNativeTokenTypeAndPermissions();
368    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 10);
369    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
370}
371
372/**
373 * @tc.name: I18nServiceFuncTest022
374 * @tc.desc: Test I18nServiceAbilityClient AddPreferredLanguage: test add invalid language tag.
375 * @tc.type: FUNC
376 */
377HWTEST_F(I18nServiceTest, I18nServiceFuncTest022, TestSize.Level1)
378{
379    InitTestEnvironment();
380    AddNativeTokenTypeAndPermissions();
381    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 1);
382    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
383}
384
385/**
386 * @tc.name: I18nServiceFuncTest023
387 * @tc.desc: Test I18nServiceAbilityClient RemovePreferredLanguage: test no permission case.
388 * @tc.type: FUNC
389 */
390HWTEST_F(I18nServiceTest, I18nServiceFuncTest023, TestSize.Level1)
391{
392    InitTestEnvironment();
393    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", -1);
394    EXPECT_EQ(err, I18nErrorCode::NO_PERMISSION);
395}
396
397/**
398 * @tc.name: I18nServiceFuncTest024
399 * @tc.desc: Test I18nServiceAbilityClient RemovePreferredLanguage: remove when preferred language list size is 1.
400 * @tc.type: FUNC
401 */
402HWTEST_F(I18nServiceTest, I18nServiceFuncTest024, TestSize.Level1)
403{
404    InitTestEnvironment();
405    AddNativeTokenTypeAndPermissions();
406    I18nErrorCode err = I18nServiceAbilityClient::RemovePreferredLanguage(0);
407    EXPECT_EQ(err, I18nErrorCode::REMOVE_PREFERRED_LANGUAGE_FAILED);
408}
409
410/**
411 * @tc.name: I18nServiceFuncTest025
412 * @tc.desc: Test I18nServiceAbilityClient RemovePreferredLanguage: remove large index.
413 * @tc.type: FUNC
414 */
415HWTEST_F(I18nServiceTest, I18nServiceFuncTest025, TestSize.Level1)
416{
417    InitTestEnvironment();
418    AddNativeTokenTypeAndPermissions();
419    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 0);
420    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
421    err = I18nServiceAbilityClient::RemovePreferredLanguage(10);
422    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
423}
424
425/**
426 * @tc.name: I18nServiceFuncTest026
427 * @tc.desc: Test I18nServiceAbilityClient RemovePreferredLanguage: remove first preferred language.
428 * @tc.type: FUNC
429 */
430HWTEST_F(I18nServiceTest, I18nServiceFuncTest026, TestSize.Level1)
431{
432    InitTestEnvironment();
433    AddNativeTokenTypeAndPermissions();
434    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 0);
435    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
436    err = I18nServiceAbilityClient::RemovePreferredLanguage(0);
437    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
438}
439
440/**
441 * @tc.name: I18nServiceFuncTest027
442 * @tc.desc: Test I18nServiceAbilityClient RemovePreferredLanguage: remove last preferred language.
443 * @tc.type: FUNC
444 */
445HWTEST_F(I18nServiceTest, I18nServiceFuncTest027, TestSize.Level1)
446{
447    InitTestEnvironment();
448    AddNativeTokenTypeAndPermissions();
449    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 0);
450    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
451    err = I18nServiceAbilityClient::RemovePreferredLanguage(1);
452    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
453}
454
455/**
456 * @tc.name: I18nServiceFuncTest028
457 * @tc.desc: Test I18nServiceAbilityClient RemovePreferredLanguage: remove negative index.
458 * @tc.type: FUNC
459 */
460HWTEST_F(I18nServiceTest, I18nServiceFuncTest028, TestSize.Level1)
461{
462    InitTestEnvironment();
463    AddNativeTokenTypeAndPermissions();
464    I18nErrorCode err = I18nServiceAbilityClient::AddPreferredLanguage("fr", 0);
465    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
466    err = I18nServiceAbilityClient::RemovePreferredLanguage(-1);
467    EXPECT_EQ(err, I18nErrorCode::SUCCESS);
468}
469} // namespace I18n
470} // namespace Global
471} // namespace OHOS