From 6cdeb5b046a67f6cea36f853be1e3894fd62e136 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 24 Jan 2023 18:09:06 +1100 Subject: [PATCH] Kill unit tests that run more than 1200 seconds The CI doesn't provide useful forensics when a system test locks up. Fork the process and kill it with ABRT if it is still running after 20 minutes. Pass the exit status to the caller. (cherry picked from commit 3d5c7cd46c60e0a534dce0640c4e47b699e7003e) --- lib/isc/include/isc/util.h | 6 +++++ tests/include/tests/isc.h | 53 ++++++++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index 922661beaa..81a793d87d 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -59,6 +59,12 @@ */ #define UNUSED(x) (void)(x) +#if __has_c_attribute(maybe_unused) +#define ISC_ATTR_UNUSED [[maybe_unused]] +#else +#define ISC_ATTR_UNUSED __attribute__((__unused__)) +#endif + #if __GNUC__ >= 8 && !defined(__clang__) #define ISC_NONSTRING __attribute__((nonstring)) #else /* if __GNUC__ >= 8 && !defined(__clang__) */ diff --git a/tests/include/tests/isc.h b/tests/include/tests/isc.h index 6131c20185..9165a4208a 100644 --- a/tests/include/tests/isc.h +++ b/tests/include/tests/isc.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -35,6 +36,9 @@ #include "task_p.h" #include "timer_p.h" +#include +#include + #define CHECK(r) \ do { \ result = (r); \ @@ -102,18 +106,39 @@ teardown_managers(void **state); #define ISC_TEST_MAIN ISC_TEST_MAIN_CUSTOM(NULL, NULL) -#define ISC_TEST_MAIN_CUSTOM(setup, teardown) \ - int main(void) { \ - int r; \ - \ - signal(SIGPIPE, SIG_IGN); \ - \ - isc_mem_debugging |= ISC_MEM_DEBUGRECORD; \ - isc_mem_create(&mctx); \ - \ - r = cmocka_run_group_tests(tests, setup, teardown); \ - \ - isc_mem_destroy(&mctx); \ - \ - return (r); \ +#define ISC_TEST_MAIN_CUSTOM(setup, teardown) \ + static int __child = 0; \ + static void __alarm(int sig ISC_ATTR_UNUSED) { \ + kill(__child, SIGABRT); \ + } \ + int main(void) { \ + int r, status; \ + \ + switch ((__child = fork())) { \ + case 0: \ + break; \ + case -1: \ + exit(1); \ + default: \ + signal(SIGALRM, __alarm); \ + alarm(1200); \ + if ((r = waitpid(__child, &status, 0)) == __child) { \ + /* Pass the exit status to the caller. */ \ + if (WIFEXITED(status)) { \ + exit(WEXITSTATUS(status)); \ + } \ + } \ + exit(1); \ + } \ + \ + signal(SIGPIPE, SIG_IGN); \ + \ + isc_mem_debugging |= ISC_MEM_DEBUGRECORD; \ + isc_mem_create(&mctx); \ + \ + r = cmocka_run_group_tests(tests, setup, teardown); \ + \ + isc_mem_destroy(&mctx); \ + \ + return (r); \ }