diff --git a/test/Makefile.am b/test/Makefile.am index 74623e4f..03b3501e 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -6,6 +6,7 @@ EXTRA_DIST = skel/bin/busybox-x86_64.md5 skel/sbin/service.sh skel/bin/slay \ skel/etc/inittab skel/etc/hostname skel/etc/fstab \ skel/etc/init.d/rcS skel/etc/init.d/rcK skel/tmp/.empty \ skel/etc/finit.d/.empty skel/etc/init.d/S01-service.sh \ + skel/etc/init.d/S02-serv.sh \ skel/proc/.empty skel/root/.empty skel/run/.empty \ skel/sbin/chrootsetup.sh skel/srv/.empty skel/sys/.empty \ skel/usr/bin/.empty skel/usr/lib/.empty skel/usr/sbin/.empty \ @@ -20,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 += failing-sysv.sh EXTRA_DIST += global-envs.sh EXTRA_DIST += pre-post-serv.sh EXTRA_DIST += start-stop-service.sh @@ -46,6 +48,7 @@ TESTS += setup-root.sh TESTS += add-remove-dynamic-service.sh TESTS += add-remove-dynamic-service-sub-config.sh TESTS += cond-start-task.sh +TESTS += failing-sysv.sh TESTS += global-envs.sh TESTS += pre-post-serv.sh TESTS += start-stop-service.sh diff --git a/test/failing-sysv.sh b/test/failing-sysv.sh new file mode 100755 index 00000000..cf57fed9 --- /dev/null +++ b/test/failing-sysv.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# Verify what happesn when sysv scripts start services that keep +# crashing -- hint: crashing sysv services should be detected by +# Finit just like regular services. +set -eu + +TEST_DIR=$(dirname "$0") + +test_setup() +{ + say "Test start $(date)" + texec sh -c "mkdir -p /etc/default" +} + +test_teardown() +{ + say "Test done $(date)" + say "Running test teardown." + + texec rm -f "$FINIT_CONF" +} + +# shellcheck source=/dev/null +. "$TEST_DIR/tenv/lib.sh" + +# This instructs serv to check the environment, and exit +# if it cannot find "xyzzy", thus triggering a premature +# exit which Finit should act on to retstart it. +say "Setting up bogus /etc/default/serv" +texec sh -c "echo 'SERV_ARGS=\"-e xyzzy:lives\"' > /etc/default/serv" + +say "Add sysv stanza to $FINIT_CONF" +texec sh -c "echo 'sysv restart:5 [2345] pid:!/run/serv.pid name:serv /etc/init.d/S02-serv.sh -- Crashing SysV service' > $FINIT_CONF" + +#texec sh -c "initctl debug" + +say 'Reload Finit' +texec sh -c "initctl reload" +#texec sh -c "initctl status serv" +#texec sh -c "ps" + +say 'Pending sysv restarts by Finit ...' +#texec sh -c "initctl status serv" +#texec sh -c "ps" +retry 'assert_restarts 5 serv' 20 1 + +return 0 diff --git a/test/skel/etc/init.d/S02-serv.sh b/test/skel/etc/init.d/S02-serv.sh new file mode 100755 index 00000000..846ff444 --- /dev/null +++ b/test/skel/etc/init.d/S02-serv.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# SysV style start script for serv + +DAEMON="/sbin/serv" +PIDFILE="/var/run/serv.pid" + +# shellcheck source=/dev/null +[ -r "/etc/default/serv" ] && . "/etc/default/serv" + +start() +{ + printf 'Starting %s: ' "$DAEMON $SERV_ARGS" + # shellcheck disable=SC2086 # we need the word splitting + start-stop-daemon -S -b -q -p "$PIDFILE" -x "$DAEMON" -- $SERV_ARGS + + status=$? + if [ "$status" -eq 0 ]; then + echo "OK" + else + echo "FAIL" + fi + + return "$status" +} + +stop() +{ + printf 'Stopping %s: ' "$DAEMON" + start-stop-daemon -K -q -p "$PIDFILE" + + status=$? + if [ "$status" -eq 0 ]; then + echo "OK" + else + echo "FAIL" + fi + + return "$status" +} + +restart() +{ + stop + sleep 1 + start +} + +case "$1" in + start|stop|restart) + "$1" + ;; + *) + echo "Usage: $0 {start|stop|restart}, got $0 $1" + exit 1 +esac diff --git a/test/tenv/lib.sh b/test/tenv/lib.sh index c0d59762..fbf13b1b 100755 --- a/test/tenv/lib.sh +++ b/test/tenv/lib.sh @@ -37,6 +37,11 @@ assert_new_pid() assert "Finit has registered new PID" "$(texec initctl |grep $1 | awk '{print $1;}')" -eq "$(texec cat $2)" } +assert_restarts() +{ + assert "Finit has registered restarts" "$(texec initctl status "$2" | awk '/Restarts/{print $3;}')" -ge "$1" +} + # shellcheck disable=SC2086 assert_pidfile() {