Module Name:    src
Committed By:   riastradh
Date:           Thu Dec 19 20:11:03 UTC 2024

Modified Files:
        src/tests/lib/libc/sys: t_timerfd.c

Log Message:
t_timerfd: Test for timerfd_settime old_value.

PR kern/58917: timer_settime and timerfd_settime return absolute time
of next event


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/tests/lib/libc/sys/t_timerfd.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/lib/libc/sys/t_timerfd.c
diff -u src/tests/lib/libc/sys/t_timerfd.c:1.8 src/tests/lib/libc/sys/t_timerfd.c:1.9
--- src/tests/lib/libc/sys/t_timerfd.c:1.8	Thu Dec 19 20:10:49 2024
+++ src/tests/lib/libc/sys/t_timerfd.c	Thu Dec 19 20:11:03 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: t_timerfd.c,v 1.8 2024/12/19 20:10:49 riastradh Exp $ */
+/* $NetBSD: t_timerfd.c,v 1.9 2024/12/19 20:11:03 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <sys/cdefs.h>
 __COPYRIGHT("@(#) Copyright (c) 2020\
  The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_timerfd.c,v 1.8 2024/12/19 20:10:49 riastradh Exp $");
+__RCSID("$NetBSD: t_timerfd.c,v 1.9 2024/12/19 20:11:03 riastradh Exp $");
 
 #include <sys/types.h>
 
@@ -308,6 +308,7 @@ ATF_TC_BODY(timerfd_block, tc)
 
 	ATF_REQUIRE((fd = timerfd_create(CLOCK_MONOTONIC, 0)) >= 0);
 
+	struct itimerspec oits;
 	const struct itimerspec its = {
 		.it_value = { .tv_sec = 1, .tv_nsec = 0 },
 		.it_interval = { .tv_sec = 0, .tv_nsec = 0 },
@@ -315,6 +316,16 @@ ATF_TC_BODY(timerfd_block, tc)
 
 	ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &then) == 0);
 	ATF_REQUIRE(timerfd_settime(fd, 0, &its, NULL) == 0);
+	ATF_REQUIRE(timerfd_settime(fd, 0, &its, &oits) == 0);
+	atf_tc_expect_fail("PR kern/58917:"
+	    " timer_settime and timerfd_settime return absolute time"
+	    " of next event");
+	ATF_CHECK_MSG(timespeccmp(&oits.it_value, &its.it_value, <=),
+	    "timerfd_settime returned %jd.%09lu remaining,"
+	    " expected at most %jd.%09lu",
+	    (intmax_t)oits.it_value.tv_sec, oits.it_value.tv_nsec,
+	    (intmax_t)its.it_value.tv_sec, its.it_value.tv_nsec);
+	atf_tc_expect_pass();
 	ATF_REQUIRE(timerfd_read(fd, &val) == 0);
 	ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &now) == 0);
 	ATF_REQUIRE(check_value_against_bounds(val, 1, 1));
@@ -383,15 +394,27 @@ ATF_TC_BODY(timerfd_abstime, tc)
 
 	ATF_REQUIRE((fd = timerfd_create(CLOCK_MONOTONIC, 0)) >= 0);
 
-	struct itimerspec its = {
+	struct itimerspec oits, its = {
 		.it_value = { .tv_sec = 0, .tv_nsec = 0 },
 		.it_interval = { .tv_sec = 0, .tv_nsec = 0 },
 	};
 
 	ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &then) == 0);
-	its.it_value = then;
-	its.it_value.tv_sec += 1;
+	delta = (struct timespec){1, 0};
+	timespecadd(&then, &delta, &its.it_value);
 	ATF_REQUIRE(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, NULL) == 0);
+	ATF_REQUIRE(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, &oits) == 0);
+	timespecadd(&delta, (&(const struct timespec){2, 0}), /* tick slop */
+	    &delta);
+	atf_tc_expect_fail("PR kern/58917:"
+	    " timer_settime and timerfd_settime return absolute time"
+	    " of next event");
+	ATF_CHECK_MSG(timespeccmp(&oits.it_value, &delta, <=),
+	    "timerfd_settime returned %jd.%09lu remaining,"
+	    " expected at most %jd.%09lu",
+	    (intmax_t)oits.it_value.tv_sec, oits.it_value.tv_nsec,
+	    (intmax_t)delta.tv_sec, delta.tv_nsec);
+	atf_tc_expect_pass();
 	ATF_REQUIRE(timerfd_read(fd, &val) == 0);
 	ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &now) == 0);
 	ATF_REQUIRE(check_value_against_bounds(val, 1, 1));

Reply via email to