1 /*
2  * Copyright (c) 2021 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 <unistd.h>
17 #include <string.h>
18 #include <locale.h>
19 #include <search.h>
20 #include <err.h>
21 #include <regex.h>
22 #include <sys/types.h>
23 #include <sys/utsname.h>
24 #include "gtest/gtest.h"
25 #include "log.h"
26 #include "utils.h"
27 #include "KernelConstants.h"
28 
29 #define SYS_TEST_FILE_01 "/storage/data/systest01.txt"
30 using namespace testing::ext;
31 
32 class SysApiTest : public testing::Test {
33 protected:
34     // SetUpTestCase: Testsuit setup, run before 1st testcase
SetUpTestCase(void)35     static void SetUpTestCase(void)
36     {
37         LOG("setup ok\n");
38     }
39     // TearDownTestCase: Testsuit teardown, run after last testcase
TearDownTestCase(void)40     static void TearDownTestCase(void)
41     {
42         unsetenv("PATH");
43         unsetenv("HOME");
44         LOG("teardown ok\n");
45     }
46 };
47 
48 /**
49 * @tc.number     SUB_KERNEL_SYS_GETENV_0100
50 * @tc.name       test getenv
51 * @tc.desc       [C- SOFTWARE -0200]
52 */
HWTEST_F(SysApiTest, testGetenv, Function | MediumTest | Level2)53 HWTEST_F(SysApiTest, testGetenv, Function | MediumTest | Level2)
54 {
55     EXPECT_STREQ(getenv("HOME"), nullptr) << "Getenv HOME error!";
56     EXPECT_STREQ(getenv("ROOT"), nullptr) << "Getenv HOME error!";
57 
58     ASSERT_EQ(setenv("PATH", "/bin", 1), 0) << "setenv PATH fail!";
59     EXPECT_STREQ(getenv("PATH"), "/bin") << "secure_get PATH env error!";
60 
61     setenv("PATH", "/usr/bin", 0);
62     EXPECT_STREQ(getenv("PATH"), "/bin") << "setenv PATH error!";
63     unsetenv("PATH");
64 }
65 
66 /**
67 * @tc.number     SUB_KERNEL_SYS_SECURE_GETENV_0100
68 * @tc.name       test secure_getenv
69 * @tc.desc       [C- SOFTWARE -0200]
70 */
HWTEST_F(SysApiTest, testSecureGetenv, Function | MediumTest | Level2)71 HWTEST_F(SysApiTest, testSecureGetenv, Function | MediumTest | Level2)
72 {
73     EXPECT_STREQ(secure_getenv("HOME"), NULL) << "Secure_getenv HOME error!";
74     EXPECT_STREQ(secure_getenv("ROOT"), NULL) << "Secure_getenv HOME error!";
75 
76     ASSERT_EQ(setenv("PATH", "", 1), 0) << "setenv PATH fail!";
77     EXPECT_STREQ(secure_getenv("PATH"), "") << "secure_getenv PATH error!";
78 
79     setenv("PATH", "/usr/bin", 0);
80     EXPECT_STREQ(secure_getenv("PATH"), "") << "setenv PATH error!";
81     unsetenv("PATH");
82 }
83 
84 /**
85 * @tc.number     SUB_KERNEL_SYS_SETENV_0100
86 * @tc.name       test setenv
87 * @tc.desc       [C- SOFTWARE -0200]
88 */
HWTEST_F(SysApiTest, testSetenv, Function | MediumTest | Level2)89 HWTEST_F(SysApiTest, testSetenv, Function | MediumTest | Level2)
90 {
91     ASSERT_EQ(setenv("", "/bin", 1), -1) << "envname error ";
92     ASSERT_EQ(setenv("HOME", "/bin", 1), 0) << "setenv fail!";
93     EXPECT_STREQ(secure_getenv("HOME"), "/bin") << "getenv fail !";
94     int pid;
95     pid = fork();
96     if (pid == 0) {
97         if (strcmp(secure_getenv("HOME"), "/bin") == 0) {
98             exit(0);
99         } else {
100             LOG("child process home env is different from parent !");
101             exit(1);
102         }
103     } else {
104             WaitProcExitedOK(pid);
105     }
106 }
107 
108 /**
109 * @tc.number    SUB_KERNEL_SYS_SETENV_0200
110 * @tc.name      test setenv in child process
111 * @tc.desc      [C- SOFTWARE -0200]
112 */
HWTEST_F(SysApiTest, testSetenvInChild, Function | MediumTest | Level3)113 HWTEST_F(SysApiTest, testSetenvInChild, Function | MediumTest | Level3)
114 {
115     setenv("HOME", "", 1);
116     int pid;
117     pid = fork();
118     if (pid == 0) {
119         setenv("HOME", "/usr/bin", 1);
120         if (strcmp(secure_getenv("HOME"), "/usr/bin") == 0) {
121             exit(0);
122         } else {
123             LOG("child process getenv error!");
124             exit(1);
125         }
126     } else {
127         WaitProcExitedOK(pid);
128         EXPECT_STREQ(secure_getenv("HOME"), "") << "parent env has changed by child process !";
129     }
130     unsetenv("HOME");
131 }
132 
133 /**
134 * @tc.number     SUB_KERNEL_SYS_PUTENV_0100
135 * @tc.name       test putenv
136 * @tc.desc       [C- SOFTWARE -0200]
137 */
HWTEST_F(SysApiTest, testPutenv, Function | MediumTest | Level2)138 HWTEST_F(SysApiTest, testPutenv, Function | MediumTest | Level2)
139 {
140     ASSERT_EQ(putenv((char *)"PATH=/bin"), 0) << "putenv PATH fail!";
141     EXPECT_STREQ(secure_getenv("PATH"), "/bin") << "getenv fail !";
142     unsetenv("PATH");
143 }
144 
145 /**
146 * @tc.number     SUB_KERNEL_SYS_PUTENV_0200
147 * @tc.name       test putenv in parent and child process
148 * @tc.desc       [C- SOFTWARE -0200]
149 */
HWTEST_F(SysApiTest, testPutenvInProcess, Function | MediumTest | Level3)150 HWTEST_F(SysApiTest, testPutenvInProcess, Function | MediumTest | Level3)
151 {
152     ASSERT_EQ(putenv((char *)"HOME=/bin"), 0) << "putenv PATH fail!";
153     int pid;
154     pid = fork();
155     if (pid == 0) {
156         int rt = 0;
157         if (strcmp(secure_getenv("HOME"), "/bin") != 0) {
158             rt = 1;
159             LOG("child process PATH env are different from parent process!");
160         }
161         if (putenv((char *)"PATH=/bin") != 0) {
162             rt = 1;
163             LOG("putenv PATH fail in child process!");
164         }
165         exit(rt);
166     } else {
167         WaitProcExitedOK(pid);
168         EXPECT_STRNE(secure_getenv("PATH"), "/bin") << "parent env has changed by child process !";
169     }
170     unsetenv("HOME");
171     unsetenv("PATH");
172 }
173 
174 /**
175 * @tc.number    SUB_KERNEL_SYS_UNSETENV_0100
176 * @tc.name      test unsetenv
177 * @tc.desc      [C- SOFTWARE -0200]
178 */
HWTEST_F(SysApiTest, testUnsetenv, Function | MediumTest | Level2)179 HWTEST_F(SysApiTest, testUnsetenv, Function | MediumTest | Level2)
180 {
181     setenv("HOME", "/bin", 1);
182     ASSERT_EQ(unsetenv("HOME"), 0) << "delete home env error !";
183     LOG("after Unsetenv homePath=%s", secure_getenv("HOME"));
184     EXPECT_STREQ(secure_getenv("HOME"), NULL) << "home env is not null !";
185 
186     ASSERT_EQ(unsetenv("ABC"), 0) << "unsetenv other env error !";
187 }
188 
CompareInt(const void *a, const void *b)189 int CompareInt(const void *a, const void *b)
190 {
191     return (*(int*)a - *(int*)b);
192 }
193 /**
194 * @tc.number    SUB_KERNEL_SYS_QSORT_0100
195 * @tc.name      test qsort int
196 * @tc.desc      [C- SOFTWARE -0200]
197 */
HWTEST_F(SysApiTest, testQsort, Function | MediumTest | Level1)198 HWTEST_F(SysApiTest, testQsort, Function | MediumTest | Level1)
199 {
200     int iArray[] = { -99, 0, 65537, 100, 15, 6000 };
201     int iArrayOk[] = { -99, 0, 15, 100, 6000, 65537 };
202     qsort(iArray, 6, sizeof(int), CompareInt);
203     for (int i = 0; i < 6; i++){
204         EXPECT_EQ(iArray[i], iArrayOk[i]) << "int qsort error!";
205     }
206 }
207 
CompareChar(const void *a, const void *b)208 int CompareChar(const void *a, const void *b)
209 {
210     return strcmp((char *)a, (char *)b);
211 }
212 /**
213 * @tc.number    SUB_KERNEL_SYS_QSORT_0200
214 * @tc.name      test qsort char
215 * @tc.desc      [C- SOFTWARE -0200]
216 */
HWTEST_F(SysApiTest, testQsortChar, Function | MediumTest | Level1)217 HWTEST_F(SysApiTest, testQsortChar, Function | MediumTest | Level1)
218 {
219     char cArray[] = { 'z', 's', 'a', 'j', 'p', 'o' };
220     char cArrayOk[] = { 'a', 'j', 'o', 'p', 's', 'z' };
221     qsort(cArray, 6, sizeof(char), CompareChar);
222     EXPECT_EQ(strncmp(cArray, cArrayOk, sizeof(cArray)), 0) << "char qsort error!";
223 }
224 
CompareFloat(const void *a, const void *b)225 int CompareFloat(const void *a, const void *b)
226 {
227     float fa = *(float *)a;
228     float fb = *(float *)b;
229     return (fa > fb) ? 1 : -1;
230 }
231 /**
232 * @tc.number    SUB_KERNEL_SYS_QSORT_0300
233 * @tc.name      test qsort float
234 * @tc.desc      [C- SOFTWARE -0200]
235 */
HWTEST_F(SysApiTest, testQsortFloat, Function | MediumTest | Level2)236 HWTEST_F(SysApiTest, testQsortFloat, Function | MediumTest | Level2)
237 {
238     float fArray[] = { 1.2f, 10.5f, 3.8f, 99.7f, 0.8f, 6000.0f };
239     float fArrayOk[] = { 0.8f, 1.2f, 3.8f, 10.5f, 99.7f, 6000.0f };
240     qsort(fArray, 6, sizeof(float), CompareFloat);
241     for (int i = 0; i < 6; i++) {
242         EXPECT_FLOAT_EQ(fArray[i], fArrayOk[i]) << "float qsort error!";
243     }
244 }
245 
CompareDouble(const void *a, const void *b)246 int CompareDouble(const void *a, const void *b)
247 {
248     double fa = *(double *)a;
249     double fb = *(double *)b;
250     return (fa > fb) ? 1 : -1;
251 }
252 /**
253 * @tc.number    SUB_KERNEL_SYS_QSORT_0400
254 * @tc.name      test qsort double
255 * @tc.desc      [C- SOFTWARE -0200]
256 */
HWTEST_F(SysApiTest, testQsortDouble, Function | MediumTest | Level2)257 HWTEST_F(SysApiTest, testQsortDouble, Function | MediumTest | Level2)
258 {
259     double fArray[] = { 1.78, 1.09, 1.63, -1.11, 1.99, 1.30 };
260     double fArrayOk[] = { -1.11, 1.09, 1.30, 1.63, 1.78, 1.99 };
261     qsort(fArray, 6, sizeof(double), CompareDouble);
262     for (int i = 0; i < 6; i++) {
263         EXPECT_DOUBLE_EQ(fArray[i], fArrayOk[i]) << "double qsort error!";
264     }
265 }
266 
TestRegcomp(int flag, const char *pattern, const char *buf, const char *resOk)267 void TestRegcomp(int flag, const char *pattern, const char *buf, const char *resOk)
268 {
269     regmatch_t pmatch[1];
270     const size_t nmatch = 1;
271     regex_t reg;
272     char res[64];
273     int j = 0;
274     regcomp(&reg, pattern, flag);
275     int status = regexec(&reg, buf, nmatch, pmatch, 0);
276     EXPECT_EQ(status, 0) << "extended flag error !";
277     if (status == REG_NOMATCH) {
278         LOG("no match");
279     } else if (status == 0) {
280         LOG("Match:");
281         for (int i = pmatch[0].rm_so; i < pmatch[0].rm_eo; i++) {
282             putchar(buf[i]);
283             res[j] = buf[i];
284             j++;
285         }
286         res[j] = 0;
287         LOG("\n");
288     }
289     EXPECT_STREQ(res, resOk) << "match result error !";
290     regfree(&reg);
291 }
292 
293 /**
294 * @tc.number    SUB_KERNEL_SYS_REGCOMP_0100
295 * @tc.name      test regcomp cflags = Extended
296 * @tc.desc      [C- SOFTWARE -0200]
297 */
HWTEST_F(SysApiTest, testRegcompExtended, Function | MediumTest | Level2)298 HWTEST_F(SysApiTest, testRegcompExtended, Function | MediumTest | Level2)
299 {
300     TestRegcomp(REG_EXTENDED, "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*.\\w+([-.]\\w+)*$",
301                 "harmony20000925@abcdef.com", "harmony20000925@abcdef.com");
302 }
303 
304 /**
305 * @tc.number    SUB_KERNEL_SYS_REGCOMP_0200
306 * @tc.name      test regcomp cflags = ICASE
307 * @tc.desc      [C- SOFTWARE -0200]
308 */
HWTEST_F(SysApiTest, testRegcompIcase, Function | MediumTest | Level2)309 HWTEST_F(SysApiTest, testRegcompIcase, Function | MediumTest | Level2)
310 {
311     TestRegcomp(REG_ICASE, "HARMONY[1-9]",
312             "harmony20000925@abcdef.com", "harmony2");
313 }
314 
315 /**
316 * @tc.number    SUB_KERNEL_SYS_REGCOMP_0300
317 * @tc.name      test regcomp cflags = NEWLINE
318 * @tc.desc      [C- SOFTWARE -0200]
319 */
HWTEST_F(SysApiTest, testRegcompNewline, Function | MediumTest | Level2)320 HWTEST_F(SysApiTest, testRegcompNewline, Function | MediumTest | Level2)
321 {
322     TestRegcomp(REG_EXTENDED|REG_NEWLINE, "^addr=([^&]*)",
323             "testohos&sex=girl&age=18\r\naddr=bantian&hobby=movie", "addr=bantian");
324 }
325 
326 /**
327 * @tc.number    SUB_KERNEL_SYS_REGCOMP_0400
328 * @tc.name      test regcomp cflags = NOSUB
329 * @tc.desc      [C- SOFTWARE -0200]
330 */
HWTEST_F(SysApiTest, testRegcompNosub, Function | MediumTest | Level3)331 HWTEST_F(SysApiTest, testRegcompNosub, Function | MediumTest | Level3)
332 {
333     int cflags = REG_ICASE|REG_NOSUB;
334     regex_t reg;
335     const char* buf = "harmony20000925@abcdef.com";
336     const char* pattern2 = "HARMONY[1-9]";
337     regcomp(&reg, pattern2, cflags);
338     int status = regexec(&reg, buf, (size_t)0, nullptr, 0);
339     EXPECT_EQ(status, 0) << "nosub flag error !";
340     regfree(&reg);
341 }
342 
343 /**
344 * @tc.number    SUB_KERNEL_SYS_REGERROR_0100
345 * @tc.name      test regerror from regcomp
346 * @tc.desc      [C- SOFTWARE -0200]
347 */
HWTEST_F(SysApiTest, testRegerrorComp, Function | MediumTest | Level2)348 HWTEST_F(SysApiTest, testRegerrorComp, Function | MediumTest | Level2)
349 {
350     regex_t reg;
351     const char* pattern2 = "^[a-zA-Z0-9]*@[a-zA-Z0-9-_.]*[.]*?";
352     int status = regcomp(&reg, pattern2, REG_EXTENDED);
353     char emsg[1024] = {0};
354     size_t len = regerror(status, nullptr, emsg, sizeof(emsg));
355     EXPECT_TRUE(len == 24) << "len return error !";
356     len = len < sizeof(emsg) ? len : sizeof(emsg) - 1;
357     emsg[len] = '\0';
358     LOG("status = %d; ErrMsg: %s", status, emsg);
359     EXPECT_STREQ("Invalid character range", emsg) << "get regerror message error !";
360 }
361 
362 /**
363 * @tc.number    SUB_KERNEL_SYS_REGERROR_0200
364 * @tc.name      test regerror from regexec
365 * @tc.desc      [C- SOFTWARE -0200]
366 */
367 HWTEST_F(SysApiTest, testRegerrorExec, Function | MediumTest | Level2)
368 {
369     regex_t reg;
370     const char* buf = "harmony20000925@abcdef.com";
371     const char* pattern2 = "HARMONY[1-9]";
372     regcomp(&reg, pattern2, REG_EXTENDED);
373     int status = regexec(&reg, buf, (size_t) 0, nullptr, 0);
374     char emsg[1024] = {0};
375     size_t len = regerror(status, &reg, emsg, sizeof(emsg));
376     EXPECT_TRUE(len == 9) << "len return error !";
377     len = len < sizeof(emsg) ? len : sizeof(emsg) - 1;
378     emsg[len] = '\0';
379     LOG("ErrMsg: %s", emsg);
380     EXPECT_STREQ("No match", emsg) << "get regerror message error !";
381 }
382 
383 /**
384 * @tc.number    SUB_KERNEL_SYS_STRERROR_0100
385 * @tc.name      test strerror
386 * @tc.desc      [C- SOFTWARE -0200]
387 */
388 HWTEST_F(SysApiTest, testStrerror, Function | MediumTest | Level1)
389 {
390     for (int i = 0; i < 15; i++) {
391         LOG("%d : %s", i, strerror(i));
392     }
393     EXPECT_STREQ("No error information", strerror(-1)) << "get strerror error!";
394     EXPECT_STREQ("No error information", strerror(0)) << "get strerror error!";
395     EXPECT_STREQ("No such file or directory", strerror(2)) << "get strerror error!";
396     EXPECT_STREQ("No child process", strerror(10)) << "get strerror error!";
397     EXPECT_STREQ("No error information", strerror(65536)) << "get strerror error!";
398 }
399 
400 /**
401 * @tc.number    SUB_KERNEL_SYS_STRERROR_L_0100
402 * @tc.name      test strerror_l
403 * @tc.desc      [C- SOFTWARE -0200]
404 */
405 HWTEST_F(SysApiTest, testStrerror_l, Function | MediumTest | Level2)
406 {
407     int errnum = 2;
408     locale_t locale = newlocale(LC_ALL, "", (locale_t)0);
409     char *errorStr = strerror_l(errnum, locale);
410     LOG("Error: %s", errorStr);
411     EXPECT_STREQ("No such file or directory", errorStr) << "get strerror error!";
412 }
413 
414 /**
415 * @tc.number    SUB_KERNEL_SYS_STRERROR_R_0100
416 * @tc.name      test strerror_r
417 * @tc.desc      [C- SOFTWARE -0200]
418 */
419 HWTEST_F(SysApiTest, testStrerror_r, Function | MediumTest | Level2)
420 {
421     int rt;
422     int errnum = 2;
423     char buf[8];
424     rt = strerror_r(errnum, buf, 8);
425     EXPECT_EQ(rt, ERANGE) << "strerror_r return error!";
426     EXPECT_STREQ(buf, "No such") << "get strerror_r error!";
427     char buf2[256];
428     rt = strerror_r(errnum, buf2, 256);
429     EXPECT_EQ(rt, 0) << "strerror_r return error!";
430     EXPECT_STREQ(buf2, "No such file or directory") << "get strerror_r error!";
431     for (int i = 0; i < 256; i++) {
432         buf2[i] = 0;
433     }
434     rt = strerror_r(errnum, buf2, 0);
435     EXPECT_EQ(rt, ERANGE) << "strerror_r return error!";
436     EXPECT_STREQ(buf2, "") << "get strerror_r error!";
437 }
438 
439 /**
440 * @tc.number    SUB_KERNEL_SYS_UNAME_0100
441 * @tc.name      test uname
442 * @tc.desc      [C- SOFTWARE -0200]
443 */
444 HWTEST_F(SysApiTest, testUname, Function | MediumTest | Level1)
445 {
446     struct utsname sysInfo = {0};
447     int rtVal = uname(&sysInfo);
448     ASSERT_NE(-1, rtVal) << "ErrInfo: get uname error !";
449     EXPECT_STREQ(sysInfo.sysname, SYSINFO_SYSNAME) << "sysname error!";
450     LOG("    system name  : %s", sysInfo.sysname);
451     LOG("    node name    : %s", sysInfo.nodename);
452     LOG("    release      : %s", sysInfo.release);
453     LOG("    version      : %s", sysInfo.version);
454 }
455 
456 /**
457 * @tc.number    SUB_KERNEL_SYS_UNAME_0200
458 * @tc.name      uname error test
459 * @tc.desc      [C- SOFTWARE -0200]
460 */
461 HWTEST_F(SysApiTest, testUnameNull, Function | MediumTest | Level3)
462 {
463     int i = uname(nullptr);
464     ASSERT_EQ(i, -1) << "Null param return error";
465 }
466 
467 struct Myque {
468     struct Myque *next;
469     struct Myque *prev;
470     char *name;
471 };
472 int CountQue(Myque *head)
473 {
474     Myque *first = head;
475     int i = 0;
476     do {
477         LOG("name=%s", head->name);
478         head = head->next;
479         i++;
480     } while (head != first);
481     LOG("Myque num = %d", i);
482     return i;
483 }
484 /**
485 * @tc.number    SUB_KERNEL_SYS_Remque_0100
486 * @tc.name      test remque
487 * @tc.desc      [C- SOFTWARE -0200]
488 */
489 HWTEST_F(SysApiTest, testRemque, Function | MediumTest | Level2)
490 {
491     struct Myque element1 = {0}, element2 = {0}, element3 = {0};
492     element1.name = (char*)"n1";
493     element2.name = (char*)"n2";
494     element3.name = (char*)"n3";
495     insque(&element1, &element1);
496     insque(&element2, &element1);
497     insque(&element3, &element2);
498     EXPECT_EQ(CountQue(&element1), 3) << "queue num error !";
499     EXPECT_TRUE(element1.next == &element2) << "queue num error !";
500 
501     remque(&element2);
502     EXPECT_EQ(CountQue(&element1), 2) << "queue num error !";
503     EXPECT_TRUE(element1.next == &element3) << "queue num error !";
504 
505     remque(&element3);
506     EXPECT_EQ(CountQue(&element1), 1) << "queue num error !";
507     EXPECT_TRUE(element1.next == &element1) << "queue num error !";
508 
509     remque(&element1);
510     EXPECT_EQ(CountQue(&element1), 1) << "queue num error !";
511     EXPECT_TRUE(element1.next == &element1) << "queue num error !";
512 }
513 
514 /**
515 * @tc.number    SUB_KERNEL_SYS_SEED48_0100
516 * @tc.name      test seed48
517 * @tc.desc      [C- SOFTWARE -0200]
518 */
519 HWTEST_F(SysApiTest, testSeed48, Function | MediumTest | Level2)
520 {
521     unsigned short seed[3] = {1, 10, 100};
522     unsigned short *res = seed48(seed);
523     res = seed48(seed);
524     for (int i = 0; i < 3; i++) {
525         EXPECT_EQ(res[i], seed[i]) << "seed48 test error!";
526     }
527     long d;
528     for (int i = 0; i < 10; i++) {
529         seed48(seed);
530         d = lrand48();
531         EXPECT_EQ(d, 1542287255) << "seed48 test error!";
532     }
533 }
534 
535 
536 void VerrLog(const char *format, ...)
537 {
538     va_list args;
539     va_start(args, format);
540     verr(0, format, args);
541     va_end(args);
542 }
543 void VerrxLog(const char *format, ...)
544 {
545     va_list args;
546     va_start(args, format);
547     verrx(0, format, args);
548     va_end(args);
549 }
550 void CheckStdPrint(const char *res)
551 {
552     FILE *fp1 = fopen(SYS_TEST_FILE_01, "r");
553 
554     ASSERT_FALSE(fp1 == nullptr) << "fopen fail, errno = " << errno;
555     char str[100] = {0};
556     char *gStr = fgets(str, sizeof(str), fp1);
557     printf("gStr = %s\n", gStr);
558     EXPECT_STREQ(gStr, str);
559     EXPECT_STREQ(str, res);
560     fclose(fp1);
561 }
562 /**
563 * @tc.number    SUB_KERNEL_SYS_Verr_0100
564 * @tc.name      test verr
565 * @tc.desc      [C- SOFTWARE -0200]
566 */
567 HWTEST_F(SysApiTest, testVerr, Function | MediumTest | Level2)
568 {
569     int pid = fork();
570     if (pid == 0) {
571         FILE *fp = freopen(SYS_TEST_FILE_01, "w", stderr);
572         if (fp == nullptr) {
573             LOG("freopen fail, errno = %d", errno);
574             exit(1);
575         }
576         errno = 2;
577         VerrLog("argument for %s ", "verr");
578         fclose(fp);
579         exit(0);
580     } else {
581         WaitProcExitedOK(pid);
582         CheckStdPrint("ActsSysApiTest.bin: argument for verr : No such file or directory\n");
583     }
584     remove(SYS_TEST_FILE_01);
585 }
586 
587 /**
588 * @tc.number    SUB_KERNEL_SYS_Verr_0200
589 * @tc.name      test verr null
590 * @tc.desc      [C- SOFTWARE -0200]
591 */
592 HWTEST_F(SysApiTest, testVerrNull, Function | MediumTest | Level2)
593 {
594     int pid = fork();
595     if (pid == 0) {
596         FILE *fp = freopen(SYS_TEST_FILE_01, "w", stderr);
597         if (fp == nullptr) {
598             LOG("freopen fail, errno = %d", errno);
599             exit(1);
600         }
601         errno = 2;
602         VerrLog(nullptr, "verr");
603         fclose(fp);
604         exit(0);
605     } else {
606         WaitProcExitedOK(pid);
607         CheckStdPrint("ActsSysApiTest.bin: No such file or directory\n");
608     }
609     remove(SYS_TEST_FILE_01);
610 }
611 
612 /**
613 * @tc.number    SUB_KERNEL_SYS_Verrx_0100
614 * @tc.name      test verrx
615 * @tc.desc      [C- SOFTWARE -0200]
616 */
617 HWTEST_F(SysApiTest, testVerrx, Function | MediumTest | Level2)
618 {
619     int pid = fork();
620     if (pid == 0) {
621         FILE *fp = freopen(SYS_TEST_FILE_01, "w", stderr);
622         if (fp == nullptr) {
623             LOG("freopen fail, errno = %d", errno);
624             exit(1);
625         }
626         errno = 2;
627         VerrxLog("argument for %s ", "verrx");
628         fclose(fp);
629         exit(0);
630     } else {
631         WaitProcExitedOK(pid);
632         CheckStdPrint("ActsSysApiTest.bin: argument for verrx \n");
633     }
634     remove(SYS_TEST_FILE_01);
635 }
636 
637 /**
638 * @tc.number    SUB_KERNEL_SYS_Verrx_0200
639 * @tc.name      test verrx null
640 * @tc.desc      [C- SOFTWARE -0200]
641 */
642 HWTEST_F(SysApiTest, testVerrxNull, Function | MediumTest | Level2)
643 {
644     int pid = fork();
645     if (pid == 0) {
646         FILE *fp = freopen(SYS_TEST_FILE_01, "w", stderr);
647         if (fp == nullptr) {
648             LOG("freopen fail, errno = %d", errno);
649             exit(1);
650         }
651         errno = 2;
652         VerrxLog(nullptr, "verrx");
653         fclose(fp);
654         exit(0);
655     } else {
656         WaitProcExitedOK(pid);
657         CheckStdPrint("ActsSysApiTest.bin: \n");
658     }
659     remove(SYS_TEST_FILE_01);
660 }