Module Name:    src
Committed By:   christos
Date:           Sat May 28 15:34:49 UTC 2011

Modified Files:
        src/tests/syscall: t_pselect.c

Log Message:
add a timeout test


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/syscall/t_pselect.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/syscall/t_pselect.c
diff -u src/tests/syscall/t_pselect.c:1.2 src/tests/syscall/t_pselect.c:1.3
--- src/tests/syscall/t_pselect.c:1.2	Tue May 17 23:15:12 2011
+++ src/tests/syscall/t_pselect.c	Sat May 28 11:34:49 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_pselect.c,v 1.2 2011/05/18 03:15:12 christos Exp $ */
+/*	$NetBSD: t_pselect.c,v 1.3 2011/05/28 15:34:49 christos Exp $ */
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
 }
 
 static void __attribute__((__noreturn__))
-child(void)
+child(const struct timespec *ts)
 {
 	struct sigaction sa;
 	sigset_t set;
@@ -76,7 +76,7 @@
 		fd_set rset;
 		FD_ZERO(&rset);
 		FD_SET(fd, &rset);
-		if (pselect(1, &rset, NULL, NULL, NULL, &set) == -1) {
+		if (pselect(1, &rset, NULL, NULL, ts, &set) == -1) {
 			if(errno == EINTR) {
 				if (!keep_going)
 					exit(0);
@@ -85,23 +85,23 @@
        }
 }
 
-ATF_TC(pselect_signal_mask);
-ATF_TC_HEAD(pselect_signal_mask, tc)
+ATF_TC(pselect_signal_mask_with_signal);
+ATF_TC_HEAD(pselect_signal_mask_with_signal, tc)
 {
 
 	/* Cf. PR lib/43625. */
-	atf_tc_set_md_var(tc, "descr",
-	    "Checks pselect's temporary mask setting");
+	atf_tc_set_md_var(tc, "descr", "Checks pselect's temporary mask "
+	    "setting when a signal is received");
 }
 
-ATF_TC_BODY(pselect_signal_mask, tc)
+ATF_TC_BODY(pselect_signal_mask_with_signal, tc)
 {
 	pid_t pid;
 	int status;
 
 	switch (pid = fork()) {
 	case 0:
-		child();
+		child(NULL);
 	case -1:
 		err(1, "fork");
 	default:
@@ -123,11 +123,54 @@
 	}
 }
 
+ATF_TC(pselect_signal_mask_with_timeout);
+ATF_TC_HEAD(pselect_signal_mask_with_timeout, tc)
+{
+
+	atf_tc_set_md_var(tc, "descr", "Checks pselect's temporary mask "
+	    "setting when a timeout occurs");
+}
+ATF_TC_BODY(pselect_signal_mask_with_timeout, tc)
+{
+	pid_t pid;
+	int status;
+	sigset_t oset, nset;
+	static const struct timespec zero = { 0, 0 };
+
+	switch (pid = fork()) {
+	case 0:
+		if (sigprocmask(SIG_BLOCK, NULL, &oset) == -1)
+			err(1, "sigprocmask");
+		child(&zero);
+		if (sigprocmask(SIG_BLOCK, NULL, &nset) == -1)
+			err(1, "sigprocmask");
+		if (memcmp(&oset, &nset, sizeof(oset)) != 0)
+			atf_tc_fail("pselect() masks don't match "
+			    "after timeout");
+		break;
+	case -1:
+		err(1, "fork");
+	default:
+		usleep(500);
+		switch (waitpid(pid, &status, WNOHANG)) {
+		case -1:
+			err(1, "wait");
+		case 0:
+			if (kill(pid, SIGKILL) == -1)
+				err(1, "kill");
+			atf_tc_fail("pselect() did not receive signal");
+			break;
+		default:
+			break;
+		}
+	}
+}
 
 ATF_TP_ADD_TCS(tp)
 {
 
-	ATF_TP_ADD_TC(tp, pselect_signal_mask);
+	ATF_TP_ADD_TC(tp, pselect_signal_mask_with_signal);
+	ATF_TP_ADD_TC(tp, pselect_signal_mask_with_timeout);
 
 	return atf_no_error();
 }

Reply via email to