[LTP] [PATCH 3/4] epoll_wait: Convert epoll_wait03 to the new API
Xie Ziyao
xieziyao@huawei.com
Mon Aug 9 10:39:02 CEST 2021
Convert epoll_wait03 to the new API.
Fixes: #792
Signed-off-by: Xie Ziyao <xieziyao@huawei.com>
---
.../kernel/syscalls/epoll_wait/epoll_wait03.c | 157 +++++-------------
1 file changed, 45 insertions(+), 112 deletions(-)
diff --git a/testcases/kernel/syscalls/epoll_wait/epoll_wait03.c b/testcases/kernel/syscalls/epoll_wait/epoll_wait03.c
index 47b6d8f61..6b0851ea8 100644
--- a/testcases/kernel/syscalls/epoll_wait/epoll_wait03.c
+++ b/testcases/kernel/syscalls/epoll_wait/epoll_wait03.c
@@ -1,153 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2016 Fujitsu Ltd.
* Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.
+ * Copyright (c) 2021 Xie Ziyao <xieziyao@huawei.com>
*/
-/*
- * Description:
- * 1) epoll_wait(2) fails if epfd is not a valid file descriptor
- * 2) epoll_wait(2) fails if epfd is not an epoll file descriptor
- * 3) epoll_wait(2) fails if maxevents is less than zero
- * 4) epoll_wait(2) fails if maxevents is equal to zero
- * 5) epoll_wait(2) fails if the memory area pointed to by events
- * is not accessible with write permissions.
+/*\
+ * [Description]
+ *
+ * Basic test for epoll_wait:
*
- * Expected Result:
- * 1) epoll_wait(2) should return -1 and set errno to EBADF
- * 2) epoll_wait(2) should return -1 and set errno to EINVAL
- * 3) epoll_wait(2) should return -1 and set errno to EINVAL
- * 4) epoll_wait(2) should return -1 and set errno to EINVAL
- * 5) epoll_wait(2) should return -1 and set errno to EFAULT
+ * 1. epoll_wait fails with EBADF if epfd is not a valid file descriptor.
+ * 2. epoll_wait fails with EINVAL if epfd is not an epoll file descriptor.
+ * 3. epoll_wait fails with EINVAL if maxevents is less than zero.
+ * 4. epoll_wait fails with EINVAL if maxevents is equal to zero.
+ * 5. epoll_wait fails with EFAULT if the memory area pointed to by events is
+ * not accessible with write permissions.
*/
-#include <sys/epoll.h>
#include <sys/mman.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-#include "test.h"
-#include "safe_macros.h"
+#include <sys/epoll.h>
-static int page_size, fds[2], epfd, inv_epfd, bad_epfd = -1;
+#include "tst_test.h"
static struct epoll_event epevs[1] = {
{.events = EPOLLOUT}
};
-static struct epoll_event *ev_rdwr = epevs;
-static struct epoll_event *ev_rdonly;
+static struct epoll_event *ev_rdonly, *ev_rdwr = epevs;
+static int fds[2], epfd, inv_epfd, bad_epfd = -1;
static struct test_case_t {
int *epfd;
struct epoll_event **ev;
int maxevents;
int exp_errno;
+ const char *desc;
} tc[] = {
- /* test1 */
- {&bad_epfd, &ev_rdwr, 1, EBADF},
- /* test2 */
- {&inv_epfd, &ev_rdwr, 1, EINVAL},
- /* test3 */
- {&epfd, &ev_rdwr, -1, EINVAL},
- /* test4 */
- {&epfd, &ev_rdwr, 0, EINVAL},
- /* test5 */
- {&epfd, &ev_rdonly, 1, EFAULT}
+ {&bad_epfd, &ev_rdwr, 1, EBADF, "epfd is not a valid fd"},
+ {&inv_epfd, &ev_rdwr, 1, EINVAL, "epfd is not an epoll fd"},
+ {&epfd, &ev_rdwr, -1, EINVAL, "maxevents is less than zero"},
+ {&epfd, &ev_rdwr, 0, EINVAL, "maxevents is equal to zero"},
+ {&epfd, &ev_rdonly, 1, EFAULT, "events has no write permissions"}
};
-char *TCID = "epoll_wait03";
-int TST_TOTAL = ARRAY_SIZE(tc);
-
-static void setup(void);
-static void verify_epoll_wait(struct test_case_t *tc);
-static void cleanup(void);
-
-int main(int ac, char **av)
-{
- int lc, i;
-
- tst_parse_opts(ac, av, NULL, NULL);
-
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
-
- for (i = 0; i < TST_TOTAL; i++)
- verify_epoll_wait(&tc[i]);
- }
-
- cleanup();
- tst_exit();
-}
-
static void setup(void)
{
- tst_sig(NOFORK, DEF_HANDLER, cleanup);
-
- TEST_PAUSE;
-
- page_size = getpagesize();
-
- ev_rdonly = SAFE_MMAP(NULL, NULL, page_size, PROT_READ,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-
- SAFE_PIPE(NULL, fds);
+ ev_rdonly = SAFE_MMAP(NULL, getpagesize(), PROT_READ,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ SAFE_PIPE(fds);
epfd = epoll_create(1);
- if (epfd == -1) {
- tst_brkm(TBROK | TERRNO, cleanup,
- "failed to create epoll instance");
- }
+ if (epfd == -1)
+ tst_brk(TBROK | TERRNO, "epoll_create()");
epevs[0].data.fd = fds[1];
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, fds[1], &epevs[0])) {
- tst_brkm(TBROK | TERRNO, cleanup,
- "failed to register epoll target");
- }
+ if (epoll_ctl(epfd, EPOLL_CTL_ADD, fds[1], &epevs[0]))
+ tst_brk(TBROK | TERRNO, "epoll_clt(..., EPOLL_CTL_ADD, ...)");
}
-static void verify_epoll_wait(struct test_case_t *tc)
+static void verify_epoll_wait(unsigned int n)
{
- TEST(epoll_wait(*(tc->epfd), *(tc->ev), tc->maxevents, -1));
- if (TEST_RETURN != -1) {
- tst_resm(TFAIL, "epoll_wait() succeed unexpectedly");
- } else {
- if (tc->exp_errno == TEST_ERRNO) {
- tst_resm(TPASS | TTERRNO,
- "epoll_wait() fails as expected");
- } else {
- tst_resm(TFAIL | TTERRNO,
- "epoll_wait() fails unexpectedly, "
- "expected %d: %s", tc->exp_errno,
- tst_strerrno(tc->exp_errno));
- }
- }
+ TST_EXP_FAIL(epoll_wait(*tc[n].epfd, *tc[n].ev, tc[n].maxevents, -1),
+ tc[n].exp_errno, "epoll_wait() %s", tc[n].desc);
}
static void cleanup(void)
{
- if (epfd > 0 && close(epfd))
- tst_resm(TWARN | TERRNO, "failed to close epfd");
+ if (epfd > 0)
+ SAFE_CLOSE(epfd);
- if (close(fds[0]))
- tst_resm(TWARN | TERRNO, "close(fds[0]) failed");
+ if (fds[0] > 0)
+ SAFE_CLOSE(fds[0]);
- if (close(fds[1]))
- tst_resm(TWARN | TERRNO, "close(fds[1]) failed");
+ if (fds[1] > 0)
+ SAFE_CLOSE(fds[1]);
}
+
+static struct tst_test test = {
+ .setup = setup,
+ .cleanup = cleanup,
+ .test = verify_epoll_wait,
+ .tcnt = ARRAY_SIZE(tc),
+};
--
2.17.1
More information about the ltp
mailing list