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 <sys/select.h>
21 #include <string>
22 #include <vector>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include <malloc.h>
26 #include <arpa/inet.h>
27 #include <gtest/gtest.h>
28 #include <netinet/in.h>
29 #include <sys/stat.h>
30 #include <sys/socket.h>
31 #include <sys/syscall.h>
32 #include <sys/timerfd.h>
33 #include <sys/types.h>
34 #include "securec.h"
35
36 using namespace testing::ext;
37
38 class HatsPselectTest : public testing::Test {
39 public:
40 static void SetUpTestCase();
41 static void TearDownTestCase();
42 void SetUp();
43 void TearDown();
44 private:
45 };
SetUp()46 void HatsPselectTest::SetUp()
47 {
48 }
49
TearDown()50 void HatsPselectTest::TearDown()
51 {
52 }
53
SetUpTestCase()54 void HatsPselectTest::SetUpTestCase()
55 {
56 }
57
TearDownTestCase()58 void HatsPselectTest::TearDownTestCase()
59 {
60 }
61
62 /*
63 * @tc.number : SUB_KERNEL_SYSCALL_PSELECT_0100
64 * @tc.name : PselectSuccess_0001
65 * @tc.desc : Pselect monitors multiple file descriptors successfully.
66 * @tc.size : MediumTest
67 * @tc.type : Function
68 * @tc.level : Level 1
69 */
70 HWTEST_F(HatsPselectTest, PselectSuccess_0001, Function | MediumTest | Level1)
71 {
72 int ret;
73 int numFds = 2;
74 fd_set readFds, writeFds;
75 FD_ZERO(&readFds);
76 FD_ZERO(&writeFds);
77
78 FD_SET(0, &readFds);
79 FD_SET(1, &writeFds);
80
81 timespec timeout;
82 timeout.tv_sec = 0;
83 timeout.tv_nsec = 800 * 1000 * 1000;
84
85 sigset_t sigMask;
86 ret = sigemptyset(&sigMask);
87 EXPECT_TRUE(ret >= 0);
88
89 int retNum = pselect(numFds + 1, &readFds, &writeFds, nullptr, &timeout, &sigMask);
90 EXPECT_TRUE(retNum > 0);
91 }
92
93 /*
94 * @tc.number : SUB_KERNEL_SYSCALL_PSELECT_0200
95 * @tc.name : PselectTimeoutFailed_0002
96 * @tc.desc : Pselect return 0 for no data ready within the timeout period.
97 * @tc.size : MediumTest
98 * @tc.type : Function
99 * @tc.level : Level 2
100 */
101 HWTEST_F(HatsPselectTest, PselectTimeoutFailed_0002, Function | MediumTest | Level2)
102 {
103 fd_set readFds;
104 FD_ZERO(&readFds);
105
106 timespec timeout = {0, 0};
107
108 int invalidFdSet[10];
109 memset_s(invalidFdSet, sizeof(invalidFdSet), 0, sizeof(invalidFdSet));
110
111 int retNum = pselect(10, reinterpret_cast<fd_set*>(invalidFdSet), nullptr, nullptr, &timeout, nullptr);
112 EXPECT_EQ(retNum, 0);
113 EXPECT_EQ(errno, ENOENT);
114 }
115
116 /*
117 * @tc.number : SUB_KERNEL_SYSCALL_PSELECT_0300
118 * @tc.name : PselectInvalidArgFailed_0003
119 * @tc.desc : Pselect is failed for invalid argument.
120 * @tc.size : MediumTest
121 * @tc.type : Function
122 * @tc.level : Level 2
123 */
124 HWTEST_F(HatsPselectTest, PselectInvalidArgFailed_0003, Function | MediumTest | Level2)
125 {
126 fd_set readFds;
127 FD_ZERO(&readFds);
128
129 timespec timeout = {0, 0};
130
131 int invalidFdSet[10];
132 memset_s(invalidFdSet, sizeof(invalidFdSet), 0, sizeof(invalidFdSet));
133
134 int retNum = pselect(-1, reinterpret_cast<fd_set*>(invalidFdSet), nullptr, nullptr, &timeout, nullptr);
135 EXPECT_EQ(retNum, -1);
136 EXPECT_EQ(errno, EINVAL);
137 }