• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }