]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Kill unit tests that run more than 1200 seconds
authorMark Andrews <marka@isc.org>
Tue, 24 Jan 2023 07:09:06 +0000 (18:09 +1100)
committerMark Andrews <marka@isc.org>
Mon, 3 Apr 2023 00:15:43 +0000 (00:15 +0000)
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.

tests/include/tests/isc.h

index 391a64454becfea6aea47c7dbadcc90a3c0132ee..b58695e3a44d6aa370c0c180b6258719c5617536 100644 (file)
@@ -17,6 +17,9 @@
 
 #include <inttypes.h>
 #include <stdbool.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
 
 #include <isc/buffer.h>
 #include <isc/hash.h>
@@ -166,18 +169,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);                                                  \
        }