From fb86042cb35ba659da40ca5c924cb20a9cf9473b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 17 Oct 2022 01:39:35 +0200 Subject: [PATCH] test: add crashing.sh, verify oncrash:script support Signed-off-by: Joachim Wiberg --- test/Makefile.am | 2 ++ test/common/serv.c | 17 ++++++++--- test/crashing.sh | 69 +++++++++++++++++++++++++++++++++++++++++++ test/skel/bin/post.sh | 4 ++- 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100755 test/crashing.sh diff --git a/test/Makefile.am b/test/Makefile.am index 36be577f..ff57c599 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -21,6 +21,7 @@ EXTRA_DIST += setup-root.sh EXTRA_DIST += add-remove-dynamic-service.sh EXTRA_DIST += add-remove-dynamic-service-sub-config.sh EXTRA_DIST += cond-start-task.sh +EXTRA_DIST += crashing.sh EXTRA_DIST += failing-sysv.sh EXTRA_DIST += global-envs.sh EXTRA_DIST += initctl-status-subset.sh @@ -52,6 +53,7 @@ TESTS = checkself.sh TESTS += add-remove-dynamic-service.sh TESTS += add-remove-dynamic-service-sub-config.sh TESTS += cond-start-task.sh +TESTS += crashing.sh TESTS += failing-sysv.sh TESTS += global-envs.sh TESTS += initctl-status-subset.sh diff --git a/test/common/serv.c b/test/common/serv.c index 6c95ccbd..b4f2a54b 100644 --- a/test/common/serv.c +++ b/test/common/serv.c @@ -12,6 +12,7 @@ #include #include #include +#include #define PROGNM "serv" #define log warnx @@ -115,9 +116,10 @@ static int usage(int rc) fprintf(fp, "%s [-nhp] [-P FILE]\n" "\n" - " -h Show help text (this)\n" + " -c Crash (exit) immediately\n" " -e K:V Verify K environment variable is V value\n" " -E K Verify K is not set in the environment\n" + " -h Show help text (this)\n" " -n Run in foreground\n" " -N SOCK Send 'READY=1\\n' on $NOTIFY_SOCKET or SOCK\n" " -p Create PID file despite running in foreground\n" @@ -142,20 +144,24 @@ int main(int argc, char *argv[]) int do_pidfile = 1; int do_restart = 0; int do_notify = 0; + int do_crash = 0; char *pidfn = NULL; char cmd[80]; int c; - while ((c = getopt(argc, argv, "e:E:hnN:pP:r:")) != EOF) { + while ((c = getopt(argc, argv, "ce:E:hnN:pP:r:")) != EOF) { switch (c) { - case 'h': - return usage(0); + case 'c': + do_crash = 1; + break; case 'e': verify_env(optarg); break; case 'E': verify_noenv(optarg); break; + case 'h': + return usage(0); case 'n': do_background = 0; do_pidfile--; @@ -201,6 +207,9 @@ int main(int argc, char *argv[]) do_notify = atoi(sock); } + if (do_crash) + exit(EX_SOFTWARE); + log("Entering while(1) loop"); while (running) { if (reloading) { diff --git a/test/crashing.sh b/test/crashing.sh new file mode 100755 index 00000000..fc4ffb72 --- /dev/null +++ b/test/crashing.sh @@ -0,0 +1,69 @@ +#!/bin/sh +# Verifies that Finit calls post:script for crashing services + +set -eu + +TEST_DIR=$(dirname "$0") + +test_setup() +{ + say "Test start $(date)" +} + +test_teardown() +{ + say "Test done $(date)" + say "Running test teardown." + + texec rm -f "$FINIT_CONF" "/tmp/post" +} + +crashit() +{ + nm=$1 + + say 'Simulate service crash (kill -9 ..)' + i=0 + laps=100 + while [ $i -lt $laps ]; do + i=$((i + 1)) + say "Lap $i/$laps, killing service $nm ..." # we have this, no sleep needed + if ! texec sh -c "slay $nm"; then + break; + fi + done +} + +test_one() +{ + type=$1 + shift + nm=$1 + shift + args=$* + + say "Add service stanza in $FINIT_CONF" + texec sh -c "echo service log:stderr oncrash:script post:/bin/post.sh $nm $args > $FINIT_CONF" + + say 'Reload Finit' + texec sh -c "initctl reload" + + if [ "$type" = "sig" ]; then + retry "assert_num_children 1 $nm" + texec sh -c "initctl status $nm" + crashit "$nm" + fi + + retry "assert_status $nm crashed" 500 + texec cat /tmp/post + assert_file_contains "/tmp/post" "POST" + texec rm -f "/tmp/post" +} + +# shellcheck source=/dev/null +. "$TEST_DIR/tenv/lib.sh" + +#texec sh -c "initctl debug" + +test_one sig service.sh " -- Test crashing service.sh" +test_one app serv "-np -c -- Test crashing serv" diff --git a/test/skel/bin/post.sh b/test/skel/bin/post.sh index 81ddeeb9..99a65404 100755 --- a/test/skel/bin/post.sh +++ b/test/skel/bin/post.sh @@ -6,4 +6,6 @@ if [ -n "$baz" ]; then marker=$baz fi -echo "$marker" > /tmp/post +echo "$marker" > /tmp/post +echo "EXIT_CODE=$EXIT_CODE" >> /tmp/post +echo "EXIT_STATUS=$EXIT_STATUS" >> /tmp/post