1/*
2 * Copyright (C) 2024 HiHope Open Source Organization.
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 <cerrno>
17#include <cstdio>
18#include <cstdlib>
19#include <csignal>
20#include <string>
21#include <vector>
22#include <fcntl.h>
23#include <unistd.h>
24#include <malloc.h>
25#include <poll.h>
26#include <arpa/inet.h>
27#include <gtest/gtest.h>
28#include <netinet/in.h>
29#include <sys/stat.h>
30#include <sys/mman.h>
31#include <sys/wait.h>
32#include <sys/socket.h>
33#include <sys/syscall.h>
34#include <sys/timerfd.h>
35#include <sys/types.h>
36#include "securec.h"
37
38using namespace testing::ext;
39
40static const int DELAY_TIME = 10 * 1000;
41
42class HatsWait4Test : public testing::Test {
43public:
44    static void SetUpTestCase();
45    static void TearDownTestCase();
46    void SetUp();
47    void TearDown();
48private:
49};
50void HatsWait4Test::SetUp()
51{
52}
53
54void HatsWait4Test::TearDown()
55{
56}
57
58void HatsWait4Test::SetUpTestCase()
59{
60}
61
62void HatsWait4Test::TearDownTestCase()
63{
64}
65
66/*
67 * @tc.number : SUB_KERNEL_SYSCALL_WAIT4_0100
68 * @tc.name   : Wait4Failed_0001
69 * @tc.desc   : Wait4 wait continued failed.
70 * @tc.size   : MediumTest
71 * @tc.type   : Function
72 * @tc.level  : Level 2
73 */
74HWTEST_F(HatsWait4Test, Wait4Failed_0001, Function | MediumTest | Level2)
75{
76    int ret;
77    pid_t childPid = -1;
78
79    sigset_t sigMask;
80    ret = sigemptyset(&sigMask);
81    EXPECT_TRUE(ret >= 0);
82    ret = sigaddset(&sigMask, SIGCHLD);
83    EXPECT_TRUE(ret >= 0);
84
85    struct sigaction sa;
86    sa.sa_sigaction = nullptr;
87    sa.sa_flags = SA_SIGINFO;
88    ret = sigemptyset(&sa.sa_mask);
89    EXPECT_TRUE(ret >= 0);
90    ret = sigaction(SIGCHLD, &sa, nullptr);
91    EXPECT_EQ(ret, 0);
92
93    int wstatus = 0;
94    int options = WCONTINUED;
95    int retPid = wait4(childPid, &wstatus, options, nullptr);
96    EXPECT_EQ(retPid, -1);
97}
98
99/*
100 * @tc.number : SUB_KERNEL_SYSCALL_WAIT4_0200
101 * @tc.name   : Wait4ChildProcessSuccess_0002
102 * @tc.desc   : wait4 child process and WIFEXITED success.
103 * @tc.size   : MediumTest
104 * @tc.type   : Function
105 * @tc.level  : Level 1
106 */
107HWTEST_F(HatsWait4Test, Wait4ChildProcessSuccess_0002, Function | MediumTest | Level1)
108{
109    pid_t pid = fork();
110    if (pid == 0) {
111        printf("Child process (PID: %d) is running...\n", getpid());
112        usleep(DELAY_TIME);
113        exit(0);
114    }
115    int status;
116    struct rusage usage;
117    pid_t tpid = wait4(pid, &status, 0, &usage);
118    EXPECT_TRUE(tpid > 0);
119    EXPECT_EQ(WIFEXITED(status), 1);
120    EXPECT_EQ(WEXITSTATUS(status), 0);
121    EXPECT_EQ(WIFSIGNALED(status), 0);
122    EXPECT_EQ(WTERMSIG(status), 0);
123    EXPECT_EQ(WCOREDUMP(status), 0);
124    EXPECT_EQ(WIFSTOPPED(status), 0);
125    EXPECT_EQ(WSTOPSIG(status), 0);
126    EXPECT_EQ(WIFCONTINUED(status), 0);
127}
128