git: 42fd47ef8113 - main - mail: Further refine the SIGINT test.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Tue, 06 May 2025 07:50:02 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=42fd47ef81138ae53ba77add5a400f67af8e6263

commit 42fd47ef81138ae53ba77add5a400f67af8e6263
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-05-06 07:49:45 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-05-06 07:49:45 +0000

    mail: Further refine the SIGINT test.
    
    * Wait at least 1-2 s before sending the second SIGINT.
    * If the child is still running after 15 s, send a SIGKILL.
    * Improve the exit status checks.
    
    Fixes:          59597032c948
    MFC after:      1 week
    Sponsored by:   Klara, Inc.
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D50092
---
 usr.bin/mail/tests/mail_sigint_test.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/usr.bin/mail/tests/mail_sigint_test.c b/usr.bin/mail/tests/mail_sigint_test.c
index e2889493f3cd..ace5f714c459 100644
--- a/usr.bin/mail/tests/mail_sigint_test.c
+++ b/usr.bin/mail/tests/mail_sigint_test.c
@@ -11,6 +11,7 @@
 #include <signal.h>
 #include <stdbool.h>
 #include <stdlib.h>
+#include <time.h>
 #include <unistd.h>
 
 #include <atf-c.h>
@@ -32,6 +33,7 @@ mailx_sigint(bool interactive)
 	char ebuf[1024] = "";
 	struct pollfd fds[2];
 	int ipd[2], opd[2], epd[2], spd[2];
+	time_t start, now;
 	size_t olen = 0, elen = 0;
 	ssize_t rlen;
 	pid_t pid;
@@ -86,25 +88,28 @@ mailx_sigint(bool interactive)
 	fds[0].events = POLLIN;
 	fds[1].fd = epd[0];
 	fds[1].events = POLLIN;
+	time(&start);
 	for (;;) {
-		if (poll(fds, 2, 1000) < 0)
-			atf_tc_fail("failed to poll");
+		ATF_REQUIRE(poll(fds, 2, 1000) >= 0);
 		if (fds[0].revents == POLLIN && olen < sizeof(obuf)) {
 			rlen = read(opd[0], obuf + olen, sizeof(obuf) - olen - 1);
-			if (rlen < 0)
-				atf_tc_fail("failed to read");
+			ATF_REQUIRE(rlen >= 0);
 			olen += rlen;
 		}
 		if (fds[1].revents == POLLIN && elen < sizeof(ebuf)) {
 			rlen = read(epd[0], ebuf + elen, sizeof(ebuf) - elen - 1);
-			if (rlen < 0)
-				atf_tc_fail("failed to read");
+			ATF_REQUIRE(rlen >= 0);
 			elen += rlen;
 		}
-		if (elen > 0 && kc == 1) {
-			kill(pid, SIGINT);
+		time(&now);
+		if (now - start > 1 && elen > 0 && kc == 1) {
+			ATF_CHECK_INTEQ(0, kill(pid, SIGINT));
 			kc++;
 		}
+		if (now - start > 15 && kc > 0) {
+			(void)kill(pid, SIGKILL);
+			kc = -1;
+		}
 		if (waitpid(pid, &status, WNOHANG) == pid)
 			break;
 	}
@@ -114,14 +119,16 @@ mailx_sigint(bool interactive)
 	close(spd[0]);
 	if (interactive) {
 		ATF_CHECK(WIFEXITED(status));
-		ATF_CHECK_INTEQ(1, WEXITSTATUS(status));
+		if (WIFEXITED(status))
+			ATF_CHECK_INTEQ(1, WEXITSTATUS(status));
 		ATF_CHECK_INTEQ(2, kc);
 		ATF_CHECK_STREQ("", obuf);
 		ATF_CHECK_MATCH("Interrupt -- one more to kill letter", ebuf);
 		atf_utils_compare_file("dead.letter", BODY);
 	} else {
 		ATF_CHECK(WIFSIGNALED(status));
-		ATF_CHECK_INTEQ(SIGINT, WTERMSIG(status));
+		if (WIFSIGNALED(status))
+			ATF_CHECK_INTEQ(SIGINT, WTERMSIG(status));
 		ATF_CHECK_INTEQ(1, kc);
 		ATF_CHECK_STREQ("", obuf);
 		ATF_CHECK_STREQ("", ebuf);