[v2,10/10] test: eventfs00 -- Extend to test duped fd

Submitted by Cyrill Gorcunov on June 27, 2018, 9:12 a.m.

Details

Message ID 20180627091205.22708-11-gorcunov@gmail.com
State New
Series "epoll: Add support for duped targets"
Headers show

Commit Message

Cyrill Gorcunov June 27, 2018, 9:12 a.m.
From: Cyrill Gorcunov <gorcunov@openvz.org>

To make sure criu can handle dup'ed and closed
file descriptors.

Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
---
 test/zdtm/static/eventfs00.c | 81 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 63 insertions(+), 18 deletions(-)

Patch hide | download patch | download mbox

diff --git a/test/zdtm/static/eventfs00.c b/test/zdtm/static/eventfs00.c
index 72fd38a9cfa2..abcfd036e395 100644
--- a/test/zdtm/static/eventfs00.c
+++ b/test/zdtm/static/eventfs00.c
@@ -29,67 +29,112 @@  const char *test_doc	= "Check for eventfs";
 const char *test_author	= "Cyrill Gorcunov <gorcunov@openvz.org>";
 
 #define EVENTFD_INITIAL	30
-#define EVENTFD_FINAL	90
+#define EVENTFD_FINAL1	90
+#define EVENTFD_FINAL2	(EVENTFD_FINAL1 * 2)
+#define DUPFDNO		999
 
 int main(int argc, char *argv[])
 {
-	int efd, ret, epollfd;
-	int pipefd[2];
 	uint64_t v = EVENTFD_INITIAL;
+	int efd, ret, epollfd, fd;
 	struct epoll_event ev;
+	int i;
+
+	struct {
+		int	pipefd1[2];
+		int	pipefd2[2];
+	} pipes[10];
 
 	test_init(argc, argv);
 
 	epollfd = epoll_create(1);
 	if (epollfd < 0) {
-		fail("epoll_create");
+		pr_perror("epoll_create failed");
 		exit(1);
 	}
 
 	efd = eventfd((unsigned int)v, EFD_NONBLOCK);
 	if (efd < 0) {
-		fail("eventfd");
+		pr_perror("eventfd failed");
 		exit(1);
 	}
 
+	test_msg("created eventfd with %lld\n", (long long)v);
+
 	memset(&ev, 0xff, sizeof(ev));
 	ev.events = EPOLLIN | EPOLLOUT;
 
-	if (pipe(pipefd)) {
-		fail("pipe");
+	for (i = 0; i < ARRAY_SIZE(pipes); i++) {
+		if (pipe(pipes[i].pipefd1) || pipe(pipes[i].pipefd2)) {
+			pr_err("Can't create pipe %d\n", i);
+			exit(1);
+		}
+
+		test_msg("epoll %d add %d native\n", epollfd, pipes[i].pipefd1[0]);
+		if (epoll_ctl(epollfd, EPOLL_CTL_ADD, pipes[i].pipefd1[0], &ev)) {
+			pr_perror("Can't add pipe %d", pipes[i].pipefd1[0]);
+			exit(1);
+		}
+
+		fd = dup2(pipes[i].pipefd2[0], DUPFDNO);
+		if (fd < 0) {
+			pr_perror("Can't dup %d to %d", pipes[i].pipefd2[0], DUPFDNO);
+			exit(1);
+		}
+		test_msg("epoll %d add %d dup'ed from %d\n", epollfd, fd, pipes[i].pipefd2[0]);
+
+		close(fd);
+		test_msg("epoll source %d closed\n", fd);
+	}
+
+	ret = write(efd, &v, sizeof(v));
+	if (ret != sizeof(v)) {
+		pr_perror("write failed");
 		exit(1);
 	}
 
-	if (epoll_ctl(epollfd, EPOLL_CTL_ADD, pipefd[0], &ev)) {
-		fail("epoll_ctl");
+	ret = write(efd, &v, sizeof(v));
+	if (ret != sizeof(v)) {
+		pr_perror("write failed");
 		exit(1);
 	}
 
-	test_msg("created eventfd with %"PRIu64"\n", v);
+	test_daemon();
+	test_waitsig();
 
-	ret = write(efd, &v, sizeof(v));
+	ret = read(efd, &v, sizeof(v));
 	if (ret != sizeof(v)) {
-		fail("write");
+		pr_perror("read failed");
+		exit(1);
+	}
+
+	if (v != EVENTFD_FINAL1) {
+		fail("EVENTFD_FINAL1 mismatch (got %lld but %lld expected)\n",
+		     (long long)v, (long long)EVENTFD_FINAL1);
 		exit(1);
 	}
 
 	ret = write(efd, &v, sizeof(v));
 	if (ret != sizeof(v)) {
-		fail("write");
+		pr_perror("write failed");
 		exit(1);
 	}
 
-	test_daemon();
-	test_waitsig();
+	ret = write(efd, &v, sizeof(v));
+	if (ret != sizeof(v)) {
+		pr_perror("write failed");
+		exit(1);
+	}
 
 	ret = read(efd, &v, sizeof(v));
 	if (ret != sizeof(v)) {
-		fail("write");
+		pr_perror("read failed");
 		exit(1);
 	}
 
-	if (v != EVENTFD_FINAL) {
-		fail("EVENTFD_FINAL mismatch\n");
+	if (v != EVENTFD_FINAL2) {
+		fail("EVENTFD_FINAL2 mismatch (got %lld but %lld expected)\n",
+		     (long long)v, (long long)EVENTFD_FINAL2);
 		exit(1);
 	}