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 "nativetoken_oper_test.h"
17 #include <fcntl.h>
18 #include <poll.h>
19 #include <pthread.h>
20 #include "securec.h"
21 #include "nativetoken.h"
22 #include "nativetoken_json_oper.h"
23 #include "nativetoken_kit.h"
24 #include "cJSON.h"
25
26 using namespace testing::ext;
27 using namespace OHOS::Security;
28
SetUpTestCase()29 void TokenOperTest::SetUpTestCase()
30 {
31 GetHandle();
32 }
33
TearDownTestCase()34 void TokenOperTest::TearDownTestCase()
35 {}
36
SetUp()37 void TokenOperTest::SetUp()
38 {}
39
TearDown()40 void TokenOperTest::TearDown()
41 {}
42 static const int32_t VALID_TIME = 100;
43 static const int32_t DEFAULT_TIME = -1;
44 extern int g_getArrayItemTime;
45 extern int g_getObjectItem;
46 extern NativeTokenList *g_tokenListHead;
47
SetTimes(void)48 static void SetTimes(void)
49 {
50 g_getArrayItemTime = VALID_TIME;
51 g_getObjectItem = VALID_TIME;
52 g_isStringTime = VALID_TIME;
53 g_replaceItemInObjectTime = VALID_TIME;
54 g_createNumberTime = VALID_TIME;
55 g_createArrayTime = VALID_TIME;
56 g_createStringTime = VALID_TIME;
57 g_addItemToArray = VALID_TIME;
58 g_addItemToObject = VALID_TIME;
59 g_createObject = VALID_TIME;
60 g_parse = VALID_TIME;
61 g_getArraySize = VALID_TIME;
62 g_printUnformatted = VALID_TIME;
63 }
64
65 /**
66 * @tc.name: UpdateGoalItemFromRecord001
67 * @tc.desc: UpdateGoalItemFromRecord abnormal.
68 * @tc.type: FUNC
69 * @tc.require:
70 */
71 HWTEST_F(TokenOperTest, UpdateGoalItemFromRecord001, TestSize.Level1)
72 {
73 SetTimes();
74 NativeTokenList tokenNode;
75 std::string stringJson1 = R"()"\
76 R"({"processName":"process5","APL":3,"version":1,"tokenId":678065606,"tokenAttr":0,)"\
77 R"("dcaps":["AT_CAP","ST_CAP"], "permissions":[], "nativeAcls":[]})";
78
79 cJSON* jsonRoot = cJSON_Parse(stringJson1.c_str());
80 g_getArrayItemTime = DEFAULT_TIME;
81 g_getObjectItem = DEFAULT_TIME;
82
83 // cJSON_GetArrayItem failed
84 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
85
86 // processNameJson == NULL
87 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
88
89 cJSON_Delete(jsonRoot);
90 }
91
92 /**
93 * @tc.name: UpdateItemcontent001
94 * @tc.desc: UpdateItemcontent abnormal.
95 * @tc.type: FUNC
96 * @tc.require:
97 */
98 HWTEST_F(TokenOperTest, UpdateItemcontent001, TestSize.Level1)
99 {
100 SetTimes();
101 g_createNumberTime = DEFAULT_TIME;
102 g_replaceItemInObjectTime = DEFAULT_TIME;
103 NativeTokenList tokenNode;
104 (void)strcpy_s(tokenNode.processName, MAX_PROCESS_NAME_LEN + 1, "process5");
105
106 std::string stringJson1 = R"([)"\
107 R"({"processName":"process5","APL":3,"version":1,"tokenId":678065606,"tokenAttr":0,)"\
108 R"("dcaps":["AT_CAP","ST_CAP"], "permissions":[], "nativeAcls":[]}])";
109
110 cJSON* jsonRoot = cJSON_Parse(stringJson1.c_str());
111
112 // cJSON_CreateNumber failed 248 line
113 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
114
115 // cJSON_ReplaceItemInObject failed 251 line
116 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
117
118 cJSON_Delete(jsonRoot);
119 }
120
121 /**
122 * @tc.name: UpdateItemcontent002
123 * @tc.desc: UpdateItemcontent abnormal in UpdateStrArrayType.
124 * @tc.type: FUNC
125 * @tc.require:
126 */
127 HWTEST_F(TokenOperTest, UpdateItemcontent002, TestSize.Level1)
128 {
129 SetTimes();
130 NativeTokenList tokenNode;
131 (void)strcpy_s(tokenNode.processName, MAX_PROCESS_NAME_LEN + 1, "process5");
132 tokenNode.apl = 1;
133 tokenNode.dcapsNum = 1;
134 tokenNode.aclsNum = 0;
135 tokenNode.permsNum = 0;
136
137 std::string stringJson1 = R"([)"\
138 R"({"processName":"process5","APL":3,"version":1,"tokenId":678065606,"tokenAttr":0,)"\
139 R"("dcaps":["AT_CAP","ST_CAP"], "permissions":[], "nativeAcls":[]}])";
140
141 cJSON* jsonRoot = cJSON_Parse(stringJson1.c_str());
142
143 g_createArrayTime = DEFAULT_TIME;
144 // cJSON_CreateArray failed 209 line
145 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
146
147 // cJSON_CreateString failed 215 line
148 g_createStringTime = DEFAULT_TIME;
149 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
150 cJSON_Delete(jsonRoot);
151 }
152
153 /**
154 * @tc.name: UpdateItemcontent003
155 * @tc.desc: UpdateItemcontent abnormal in UpdateStrArrayType.
156 * @tc.type: FUNC
157 * @tc.require:
158 */
159 HWTEST_F(TokenOperTest, UpdateItemcontent003, TestSize.Level1)
160 {
161 SetTimes();
162 NativeTokenList tokenNode;
163 (void)strcpy_s(tokenNode.processName, MAX_PROCESS_NAME_LEN + 1, "process5");
164 tokenNode.apl = 1;
165 tokenNode.dcapsNum = 1;
166 tokenNode.dcaps[0] = static_cast<char *>(malloc(sizeof(char) * MAX_DCAP_LEN));
167 EXPECT_NE(tokenNode.dcaps[0], nullptr);
168 (void)strcpy_s(tokenNode.dcaps[0], MAX_DCAP_LEN, "x");
169 tokenNode.aclsNum = 0;
170 tokenNode.permsNum = 0;
171
172 std::string stringJson1 = R"([)"\
173 R"({"processName":"process5","APL":3,"version":1,"tokenId":678065606,"tokenAttr":0,)"\
174 R"("dcaps":["AT_CAP","ST_CAP"], "permissions":[], "nativeAcls":[]}])";
175
176 cJSON* jsonRoot = cJSON_Parse(stringJson1.c_str());
177
178 // cJSON_AddItemToArray failed 221
179 g_addItemToArray = DEFAULT_TIME;
180 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
181
182 // cJSON_GetObjectItem failed 228
183 g_getObjectItem = 8; // 8 times
184 EXPECT_EQ(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
185
186 // cJSON_AddItemToObject failed
187 g_getObjectItem = 8; // 8 times
188 g_addItemToObject = DEFAULT_TIME;
189 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
190
191 // cJSON_AddItemToObject failed 229 line
192 g_replaceItemInObjectTime = 8; // 8 times
193 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, jsonRoot), 0);
194
195 cJSON_Delete(jsonRoot);
196 free(tokenNode.dcaps[0]);
197 }
198
199 /**
200 * @tc.name: UpdateItemcontent003
201 * @tc.desc: UpdateItemcontent abnormal in UpdateStrArrayType.
202 * @tc.type: FUNC
203 * @tc.require:
204 */
205 HWTEST_F(TokenOperTest, UpdateItemcontent004, TestSize.Level1)
206 {
207 SetTimes();
208 NativeTokenList tokenNode;
209 (void)strcpy_s(tokenNode.processName, MAX_PROCESS_NAME_LEN + 1, "process5");
210 tokenNode.apl = 1;
211 tokenNode.dcapsNum = 1;
212 tokenNode.dcaps[0] = static_cast<char *>(malloc(sizeof(char) * MAX_DCAP_LEN));
213 EXPECT_NE(tokenNode.dcaps[0], nullptr);
214 (void)strcpy_s(tokenNode.dcaps[0], MAX_DCAP_LEN, "x");
215 tokenNode.aclsNum = 0;
216 tokenNode.permsNum = 0;
217
218 std::string stringJson1 = R"([)"\
219 R"({"processName":"process5","APL":3,"version":1,"tokenId":678065606,"tokenAttr":0,)"\
220 R"("dcaps":["AT_CAP","ST_CAP"], "permissions":[], "nativeAcls":[]}])";
221
222 cJSON* json = cJSON_Parse(stringJson1.c_str());
223 EXPECT_EQ(UpdateGoalItemFromRecord(&tokenNode, json), 0);
224
225 // perms update failed
226 tokenNode.permsNum = 1;
227 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, json), 0);
228
229 // perms update failed
230 tokenNode.aclsNum = 1;
231 tokenNode.perms[0] = static_cast<char *>(malloc(sizeof(char) * MAX_PERM_LEN));
232 EXPECT_NE(tokenNode.perms[0], nullptr);
233 (void)strcpy_s(tokenNode.perms[0], MAX_PERM_LEN, "x");
234 EXPECT_NE(UpdateGoalItemFromRecord(&tokenNode, json), 0);
235
236 cJSON_Delete(json);
237 free(tokenNode.dcaps[0]);
238 free(tokenNode.perms[0]);
239 }
240
241 /**
242 * @tc.name: CreateNativeTokenJsonObject001
243 * @tc.desc: CreateNativeTokenJsonObject ABNORMAL.
244 * @tc.type: FUNC
245 * @tc.require:
246 */
247 HWTEST_F(TokenOperTest, CreateNativeTokenJsonObject001, TestSize.Level1)
248 {
249 SetTimes();
250 NativeTokenList tokenNode;
251
252 // cJSON_CreateObject failed 194 line
253 g_createObject = DEFAULT_TIME;
254 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
255
256 // cJSON_CreateString failed 143 line
257 g_createStringTime = DEFAULT_TIME;
258 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
259
260 (void)strcpy_s(tokenNode.processName, MAX_PROCESS_NAME_LEN + 1, "process5");
261 tokenNode.apl = 1;
262 tokenNode.dcapsNum = 1;
263 tokenNode.dcaps[0] = static_cast<char *>(malloc(sizeof(char) * MAX_DCAP_LEN));
264 EXPECT_NE(tokenNode.dcaps[0], nullptr);
265 (void)strcpy_s(tokenNode.dcaps[0], MAX_DCAP_LEN, "x");
266 tokenNode.aclsNum = 0;
267 tokenNode.permsNum = 0;
268
269 // cJSON_AddItemToObject failed 144 line
270 g_addItemToObject = DEFAULT_TIME;
271 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
272
273 // cJSON_CreateNumber failed 150
274 g_createNumberTime = DEFAULT_TIME;
275 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
276
277 // cJSON_AddItemToObject failed 151
278 g_addItemToObject = 8; // 8 times
279 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
280
281 // cJSON_CreateNumber failed 157
282 g_createNumberTime = 8; // 8 times
283 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
284
285 // cJSON_AddItemToObject failed 158
286 g_addItemToObject = 17; // 17 times
287 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
288
289 // cJSON_CreateNumber failed 164
290 g_createNumberTime = 17; // 17 times
291 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
292
293 // cJSON_AddItemToObject failed 165
294 g_addItemToObject = 26; // 26 times
295 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
296
297 // cJSON_CreateNumber failed 171
298 g_createNumberTime = 26; // 26 times
299 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
300
301 // cJSON_AddItemToObject failed 172
302 g_addItemToObject = 35; // 35 times
303 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
304
305 free(tokenNode.dcaps[0]);
306 }
307
308 /**
309 * @tc.name: CreateNativeTokenJsonObject002
310 * @tc.desc: CreateNativeTokenJsonObject abnormal for AddStrArrayInfo.
311 * @tc.type: FUNC
312 * @tc.require:
313 */
314 HWTEST_F(TokenOperTest, CreateNativeTokenJsonObject002, TestSize.Level1)
315 {
316 SetTimes();
317 NativeTokenList tokenNode;
318
319 (void)strcpy_s(tokenNode.processName, MAX_PROCESS_NAME_LEN + 1, "process5");
320 tokenNode.apl = 1;
321 tokenNode.dcapsNum = 1;
322 tokenNode.dcaps[0] = static_cast<char *>(malloc(sizeof(char) * MAX_DCAP_LEN));
323 EXPECT_NE(tokenNode.dcaps[0], nullptr);
324 (void)strcpy_s(tokenNode.dcaps[0], MAX_DCAP_LEN, "y");
325 tokenNode.aclsNum = 0;
326 tokenNode.permsNum = 0;
327
328 // AddStrArrayInfo cJSON_CreateArray failed 119
329 g_createArrayTime = DEFAULT_TIME;
330 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
331
332 // AddStrArrayInfo cJSON_CreateString failed 125
333 g_createStringTime = 8; // 8 times
334 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
335
336 // AddStrArrayInfo cJSON_AddItemToArray failed 126
337 g_addItemToArray = DEFAULT_TIME;
338 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
339
340 // cJSON_AddItemToObject failed 172
341 g_addItemToObject = 44; // 44 times
342 EXPECT_EQ(CreateNativeTokenJsonObject(&tokenNode), nullptr);
343 free(tokenNode.dcaps[0]);
344 }
345
346 /**
347 * @tc.name: GetNativeTokenFromJson001
348 * @tc.desc: GetNativeTokenFromJson successfully.
349 * @tc.type: FUNC
350 * @tc.require:
351 */
352 HWTEST_F(TokenOperTest, GetNativeTokenFromJson001, TestSize.Level1)
353 {
354 SetTimes();
355
356 g_parse = DEFAULT_TIME;
357 AtlibInit();
358 EXPECT_EQ(g_tokenListHead, nullptr);
359
360 g_getArrayItemTime = DEFAULT_TIME;
361 AtlibInit();
362 EXPECT_EQ(g_tokenListHead, nullptr);
363
364 g_getArraySize = DEFAULT_TIME;
365 AtlibInit();
366 EXPECT_EQ(g_tokenListHead, nullptr);
367
368 g_getArraySize = 8; // 8 times
369 AtlibInit();
370 EXPECT_EQ(g_tokenListHead, nullptr);
371
372 g_getArraySize = 17; // 17 times
373 AtlibInit();
374 EXPECT_EQ(g_tokenListHead, nullptr);
375 }
376
Start(const char * processName)377 static int32_t Start(const char *processName)
378 {
379 const char **dcapList = new (std::nothrow) const char *[2];
380 if (dcapList == nullptr) {
381 return 0;
382 }
383 dcapList[0] = "AT_CAP";
384 dcapList[1] = "ST_CAP";
385 uint64_t tokenId;
386 const char **permList = new (std::nothrow) const char *[2];
387 if (permList == nullptr) {
388 return 0;
389 }
390 permList[0] = "ohos.permission.test1";
391 permList[1] = "ohos.permission.test2";
392 const char **acls = new (std::nothrow) const char *[1];
393 if (acls == nullptr) {
394 return 0;
395 }
396 acls[0] = "ohos.permission.test1";
397 NativeTokenInfoParams infoInstance = {
398 .dcapsNum = 2,
399 .permsNum = 2,
400 .aclsNum = 1,
401 .dcaps = dcapList,
402 .perms = permList,
403 .acls = acls,
404 .processName = processName,
405 .aplStr = "system_basic",
406 };
407 tokenId = GetAccessTokenId(&infoInstance);
408 delete[] dcapList;
409 delete[] permList;
410 delete[] acls;
411 return tokenId;
412 }
413
414 /**
415 * @tc.name: GetInfoArrFromJson001
416 * @tc.desc: GetInfoArrFromJson successfully.
417 * @tc.type: FUNC
418 * @tc.require:
419 */
420 HWTEST_F(TokenOperTest, GetInfoArrFromJson001, TestSize.Level1)
421 {
422 SetTimes();
423
424 NativeTokenInfoParams tokenInfo;
425 g_parse = DEFAULT_TIME;
426 EXPECT_EQ(GetAccessTokenId(&tokenInfo), 0);
427
428 // UpdateInfoInCfgFile failed for SaveTokenIdToCfg
429 // tokenNode->dcapsNum != dcapNumIn branch
430 g_parse = 8; // 8 times
431 EXPECT_EQ(Start("foundation"), 0);
432
433 g_printUnformatted = DEFAULT_TIME;
434 EXPECT_NE(Start("process1"), 0);
435
436 // CreateNativeTokenJsonObject failed 385 line
437 EXPECT_NE(Start("processUnique"), 0);
438
439 EXPECT_NE(Start("processUnique1"), 0);
440 }
441