• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <errno.h>
17 #include <gtest/gtest.h>
18 #include "log.h"
19 #include "utils.h"
20 #include "libfs.h"
21 #include "KernelConstants.h"
22 
23 using namespace testing::ext;
24 
25 #define RES_DIR_DYLOAD RES_DIR_KERNEL "dyload/"
26 
27 class ExecApiTest : public testing::Test {
28 };
29 
30 /**
31  * @tc.number   SUB_KERNEL_DL_API_EXECL_0100
32  * @tc.name     execl api test
33  * @tc.desc     [C- SOFTWARE -0200]
34  */
35 HWTEST_F(ExecApiTest, testExecl, Function | MediumTest | Level1)
36 {
37     char* resELF = RES_DIR_DYLOAD "executor2";
38 
39     pid_t pid = fork();
40     ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
41     if (pid == 0) { // child
42         int rt = execl(resELF, "1", "!@#$%^&*()_+", NULL);
43         if (rt == -1) {
44             PANIC("execl failed, errno=%d\n", errno);
45         }
46         exit(0);
47     }
48     // parent
49     WaitProcExitedOK(pid);
50 }
51 
52 /**
53  * @tc.number   SUB_KERNEL_DL_API_EXECLP_0100
54  * @tc.name     execlp api test
55  * @tc.desc     [C- SOFTWARE -0200]
56  */
57 HWTEST_F(ExecApiTest, testExeclp, Function | MediumTest | Level1)
58 {
59     pid_t pid = fork();
60     ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
61     if (pid == 0) { // child
62         putenv("PATH=" RES_DIR_DYLOAD);
63         int rt = execlp("executor2", "1", "!@#$%^&*()_+", NULL);
64         if (rt == -1) {
65             PANIC("execlp failed, errno=%d\n", errno);
66         }
67         LOG("Error, should never get here.");
68         exit(1);
69     }
70     // parent
71     WaitProcExitedOK(pid);
72 }
73 
74 /**
75  * @tc.number   SUB_KERNEL_DL_API_EXECLE_0100
76  * @tc.name     execle api test
77  * @tc.desc     [C- SOFTWARE -0200]
78  */
79 HWTEST_F(ExecApiTest, testExecle, Function | MediumTest | Level1)
80 {
81     char* resELF = RES_DIR_DYLOAD "executor1";
82     putenv("NAME=Alice");
83 
84     pid_t pid = fork();
85     ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
86     if (pid == 0) { // child
87         char *env[] = {"NAME=Bob", NULL};
88         int rt = execle(resELF, "executor1", "-n", "NAME", "-v", "Bob", NULL, env);
89         if (rt == -1) {
90             PANIC("execle failed, errno=%d\n", errno);
91         }
92         LOG("Error, should never get here.");
93         exit(1);
94     }
95     // parent
96     WaitProcExitedOK(pid);
97 }
98 
99 /**
100  * @tc.number   SUB_KERNEL_DL_API_EXECV_0100
101  * @tc.name     execv api test
102  * @tc.desc     [C- SOFTWARE -0200]
103  */
104 HWTEST_F(ExecApiTest, testExecv, Function | MediumTest | Level1)
105 {
106     char* resELF = RES_DIR_DYLOAD "executor1";
107 
108     pid_t pid = fork();
109     ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
110     if (pid == 0) { // child
111         putenv("NAME=Alice");
112         char *arg[] = {"executor1", "-n", "NAME", "-v", "Alice", NULL};
113         int rt = execv(resELF, arg);
114         if (rt == -1) {
115             PANIC("execv failed, errno=%d\n", errno);
116         }
117         LOG("Error, should never get here.");
118         exit(1);
119     }
120     // parent
121     WaitProcExitedOK(pid);
122 }
123 
124 /**
125  * @tc.number   SUB_KERNEL_DL_API_EXECVP_0100
126  * @tc.name     execvp api test
127  * @tc.desc     [C- SOFTWARE -0200]
128  */
129 HWTEST_F(ExecApiTest, testExecvp, Function | MediumTest | Level1)
130 {
131     putenv("NAME=Alice");
132 
133     pid_t pid = fork();
134     ASSERT_TRUE(pid >= 0) << "======== Fork Error! =========";
135     if (pid == 0) { // child
136         putenv("PATH=" RES_DIR_DYLOAD);
137 
138         char *arg[] = {"executor1", "-n", "NAME", "-v", "Alice", NULL};
139         int rt = execvp("executor1", arg);
140         if (rt == -1) {
141             PANIC("execvp failed, errno=%d\n", errno);
142         }
143         LOG("Error, should never get here.");
144         exit(1);
145     }
146     // parent
147     WaitProcExitedOK(pid);
148 }