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 3d5c7cd46c)
This commit is contained in:
Mark Andrews
2023-01-24 18:09:06 +11:00
parent 93efd7389f
commit 6cdeb5b046
2 changed files with 45 additions and 14 deletions

View File

@@ -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__) */

View File

@@ -17,6 +17,7 @@
#include <inttypes.h>
#include <stdbool.h>
#include <unistd.h>
#include <uv.h>
#include <isc/buffer.h>
@@ -35,6 +36,9 @@
#include "task_p.h"
#include "timer_p.h"
#include <sys/types.h>
#include <sys/wait.h>
#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); \
}