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