• 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 "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