xref: /aosp_15_r20/bionic/tests/sys_epoll_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <fcntl.h>
21*8d67ca89SAndroid Build Coastguard Worker #include <signal.h>
22*8d67ca89SAndroid Build Coastguard Worker #include <sys/epoll.h>
23*8d67ca89SAndroid Build Coastguard Worker #include <unistd.h>
24*8d67ca89SAndroid Build Coastguard Worker 
25*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
26*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_wait)27*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_wait) {
28*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
29*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker   // Regular epoll_wait.
32*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
33*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, epoll_wait(epoll_fd, events, 1, 1));
34*8d67ca89SAndroid Build Coastguard Worker }
35*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_pwait_no_sigset)36*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_pwait_no_sigset) {
37*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
38*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
39*8d67ca89SAndroid Build Coastguard Worker 
40*8d67ca89SAndroid Build Coastguard Worker   // epoll_pwait without a sigset (which is equivalent to epoll_wait).
41*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
42*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, epoll_pwait(epoll_fd, events, 1, 1, nullptr));
43*8d67ca89SAndroid Build Coastguard Worker }
44*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_pwait64_no_sigset)45*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_pwait64_no_sigset) {
46*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
47*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
48*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
49*8d67ca89SAndroid Build Coastguard Worker 
50*8d67ca89SAndroid Build Coastguard Worker   // epoll_pwait64 without a sigset (which is equivalent to epoll_wait).
51*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
52*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, epoll_pwait64(epoll_fd, events, 1, 1, nullptr));
53*8d67ca89SAndroid Build Coastguard Worker #else
54*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "epoll_pwait64 is bionic-only";
55*8d67ca89SAndroid Build Coastguard Worker #endif
56*8d67ca89SAndroid Build Coastguard Worker }
57*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_pwait2_no_sigset)58*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_pwait2_no_sigset) {
59*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
60*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
61*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
62*8d67ca89SAndroid Build Coastguard Worker 
63*8d67ca89SAndroid Build Coastguard Worker   // epoll_pwait2 without a sigset (which is equivalent to epoll_wait).
64*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
65*8d67ca89SAndroid Build Coastguard Worker   timespec ts = {.tv_nsec = 500};
66*8d67ca89SAndroid Build Coastguard Worker   int rc = epoll_pwait2(epoll_fd, events, 1, &ts, nullptr);
67*8d67ca89SAndroid Build Coastguard Worker   if (rc == -1 && errno == ENOSYS) GTEST_SKIP() << "no epoll_pwait2() in this kernel";
68*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, rc) << strerror(errno);
69*8d67ca89SAndroid Build Coastguard Worker #else
70*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "epoll_pwait2 is only in glibc 2.35+";
71*8d67ca89SAndroid Build Coastguard Worker #endif
72*8d67ca89SAndroid Build Coastguard Worker }
73*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_pwait_with_sigset)74*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_pwait_with_sigset) {
75*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
76*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
77*8d67ca89SAndroid Build Coastguard Worker 
78*8d67ca89SAndroid Build Coastguard Worker   // epoll_pwait with a sigset.
79*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
80*8d67ca89SAndroid Build Coastguard Worker   sigset_t ss;
81*8d67ca89SAndroid Build Coastguard Worker   sigemptyset(&ss);
82*8d67ca89SAndroid Build Coastguard Worker   sigaddset(&ss, SIGPIPE);
83*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, epoll_pwait(epoll_fd, events, 1, 1, &ss));
84*8d67ca89SAndroid Build Coastguard Worker }
85*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_pwait2_with_sigset)86*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_pwait2_with_sigset) {
87*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
88*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
89*8d67ca89SAndroid Build Coastguard Worker 
90*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
91*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
92*8d67ca89SAndroid Build Coastguard Worker   timespec ts = {.tv_nsec = 500};
93*8d67ca89SAndroid Build Coastguard Worker   sigset_t ss2;
94*8d67ca89SAndroid Build Coastguard Worker   sigemptyset(&ss2);
95*8d67ca89SAndroid Build Coastguard Worker   sigaddset(&ss2, SIGPIPE);
96*8d67ca89SAndroid Build Coastguard Worker   int rc = epoll_pwait2(epoll_fd, events, 1, &ts, &ss2);
97*8d67ca89SAndroid Build Coastguard Worker   if (rc == -1 && errno == ENOSYS) GTEST_SKIP() << "no epoll_pwait2() in this kernel";
98*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, rc) << strerror(errno);
99*8d67ca89SAndroid Build Coastguard Worker #else
100*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "epoll_pwait2 is only in glibc 2.35+";
101*8d67ca89SAndroid Build Coastguard Worker #endif
102*8d67ca89SAndroid Build Coastguard Worker }
103*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_pwait2_64_with_sigset)104*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_pwait2_64_with_sigset) {
105*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
106*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd);
107*8d67ca89SAndroid Build Coastguard Worker 
108*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
109*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1] = {};
110*8d67ca89SAndroid Build Coastguard Worker   timespec ts = {.tv_nsec = 500};
111*8d67ca89SAndroid Build Coastguard Worker   sigset64_t ss2;
112*8d67ca89SAndroid Build Coastguard Worker   sigemptyset64(&ss2);
113*8d67ca89SAndroid Build Coastguard Worker   sigaddset64(&ss2, SIGPIPE);
114*8d67ca89SAndroid Build Coastguard Worker   int rc = epoll_pwait2_64(epoll_fd, events, 1, &ts, &ss2);
115*8d67ca89SAndroid Build Coastguard Worker   if (rc == -1 && errno == ENOSYS) GTEST_SKIP() << "no epoll_pwait2() in this kernel";
116*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, rc) << strerror(errno);
117*8d67ca89SAndroid Build Coastguard Worker #else
118*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "epoll_pwait2_64 is bionic-only";
119*8d67ca89SAndroid Build Coastguard Worker #endif
120*8d67ca89SAndroid Build Coastguard Worker }
121*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_create_invalid_size)122*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_create_invalid_size) {
123*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
124*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(-1, epoll_create(0));
125*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
126*8d67ca89SAndroid Build Coastguard Worker }
127*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_event_data)128*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_event_data) {
129*8d67ca89SAndroid Build Coastguard Worker   int epoll_fd = epoll_create(1);
130*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_fd) << strerror(errno);
131*8d67ca89SAndroid Build Coastguard Worker 
132*8d67ca89SAndroid Build Coastguard Worker   int fds[2];
133*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, pipe(fds));
134*8d67ca89SAndroid Build Coastguard Worker 
135*8d67ca89SAndroid Build Coastguard Worker   const uint64_t expected = 0x123456789abcdef0;
136*8d67ca89SAndroid Build Coastguard Worker 
137*8d67ca89SAndroid Build Coastguard Worker   // Get ready to poll on read end of pipe.
138*8d67ca89SAndroid Build Coastguard Worker   epoll_event ev;
139*8d67ca89SAndroid Build Coastguard Worker   ev.events = EPOLLIN;
140*8d67ca89SAndroid Build Coastguard Worker   ev.data.u64 = expected;
141*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE(-1, epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fds[0], &ev));
142*8d67ca89SAndroid Build Coastguard Worker 
143*8d67ca89SAndroid Build Coastguard Worker   // Ensure there's something in the pipe.
144*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1, write(fds[1], "\n", 1));
145*8d67ca89SAndroid Build Coastguard Worker 
146*8d67ca89SAndroid Build Coastguard Worker   // Poll.
147*8d67ca89SAndroid Build Coastguard Worker   epoll_event events[1];
148*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1, epoll_wait(epoll_fd, events, 1, 1));
149*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(expected, events[0].data.u64);
150*8d67ca89SAndroid Build Coastguard Worker 
151*8d67ca89SAndroid Build Coastguard Worker   close(fds[0]);
152*8d67ca89SAndroid Build Coastguard Worker   close(fds[1]);
153*8d67ca89SAndroid Build Coastguard Worker }
154*8d67ca89SAndroid Build Coastguard Worker 
TEST(sys_epoll,epoll_create1)155*8d67ca89SAndroid Build Coastguard Worker TEST(sys_epoll, epoll_create1) {
156*8d67ca89SAndroid Build Coastguard Worker   int fd;
157*8d67ca89SAndroid Build Coastguard Worker   fd = epoll_create(1);
158*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FALSE(CloseOnExec(fd));
159*8d67ca89SAndroid Build Coastguard Worker   close(fd);
160*8d67ca89SAndroid Build Coastguard Worker 
161*8d67ca89SAndroid Build Coastguard Worker   fd = epoll_create1(0);
162*8d67ca89SAndroid Build Coastguard Worker   ASSERT_FALSE(CloseOnExec(fd));
163*8d67ca89SAndroid Build Coastguard Worker   close(fd);
164*8d67ca89SAndroid Build Coastguard Worker 
165*8d67ca89SAndroid Build Coastguard Worker   fd = epoll_create1(EPOLL_CLOEXEC);
166*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(CloseOnExec(fd));
167*8d67ca89SAndroid Build Coastguard Worker   close(fd);
168*8d67ca89SAndroid Build Coastguard Worker }
169