diff --git a/test/Makefile.am b/test/Makefile.am index 7b7e0b1d..b9ed6437 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -8,6 +8,7 @@ EXTRA_DIST += add-remove-dynamic-service-sub-config.sh EXTRA_DIST += start-stop-service.sh EXTRA_DIST += start-stop-service-sub-config.sh EXTRA_DIST += start-kill-service.sh +EXTRA_DIST += start-stop-sysv.sh EXTRA_DIST += signal-service.sh AM_TESTS_ENVIRONMENT = TENV_ROOT='$(abs_builddir)/tenv-root/'; @@ -29,6 +30,7 @@ TESTS += add-remove-dynamic-service-sub-config.sh TESTS += start-stop-service.sh TESTS += start-stop-service-sub-config.sh TESTS += start-kill-service.sh +TESTS += start-stop-sysv.sh TESTS += signal-service.sh clean-local: diff --git a/test/common/S01-service.sh b/test/common/S01-service.sh new file mode 100755 index 00000000..361d285e --- /dev/null +++ b/test/common/S01-service.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# SysV style start script for service.sh + +DAEMON="/test_assets/service.sh" +PIDFILE="/var/run/service.pid" + +start() { + printf 'Starting %s: ' "$DAEMON" + start-stop-daemon -S -b -q -p "$PIDFILE" -x "$DAEMON" + 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/common/service.sh b/test/common/service.sh index 08366777..15df9b55 100755 --- a/test/common/service.sh +++ b/test/common/service.sh @@ -1,15 +1,24 @@ #!/bin/sh -set -eu +cleanup() +{ + echo "Got signal, stopping ..." + rm -f /run/service.pid + exit 0 +} # Hook SIGUSR1 and dump trace to file system # shellcheck disable=SC2172 -trap 'echo USR1 > /tmp/usr1.log' 10 +trap 'echo USR1 > /tmp/usr1.log' USR1 +trap cleanup INT +trap cleanup TERM +trap cleanup QUIT +trap cleanup EXIT echo $$ > /run/service.pid +# sleep may exit on known signal, so +# we cannot use 'set -e' while true; do - sleep 5 + sleep 1 done - -rm /run/service.pid diff --git a/test/start-stop-sysv.sh b/test/start-stop-sysv.sh new file mode 100755 index 00000000..659bb069 --- /dev/null +++ b/test/start-stop-sysv.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +set -eu + +TEST_DIR=$(dirname "$0") + +# shellcheck source=/dev/null +. "$TEST_DIR/tenv/lib.sh" + +test_teardown() { + say "Test done $(date)" + say "Running test teardown." + + texec rm -f "$FINIT_CONF" + texec rm -f /test_assets/service.sh +} + +say "Test start $(date)" + +cp "$TEST_DIR"/common/service.sh "$TENV_ROOT"/test_assets/ +cp "$TEST_DIR"/common/S01-service.sh "$TENV_ROOT"/test_assets/ +chmod +x "$TENV_ROOT"/test_assets/*.sh + +say "Add sysv stanza in $FINIT_CONF" +texec sh -c "echo 'sysv [2345] pid:!/run/service.pid name:service.sh /test_assets/S01-service.sh -- SysV test service' > $FINIT_CONF" + +say 'Reload Finit' +texec sh -c "initctl reload" + +retry 'assert_num_children 1 service.sh' + +say 'Stop the sysv service' +texec sh -c "initctl stop service.sh" + +retry 'assert_num_children 0 service.sh' + +say 'Start the sysv service again' +texec sh -c "initctl start service.sh" + +retry 'assert_num_children 1 service.sh' + +return 0 diff --git a/test/tenv/root.mk b/test/tenv/root.mk index 0717cfe4..81963811 100644 --- a/test/tenv/root.mk +++ b/test/tenv/root.mk @@ -53,7 +53,8 @@ binaries = $(DEST)/bin/awk \ $(DEST)/bin/sleep \ $(DEST)/bin/tail \ $(DEST)/bin/top \ - $(DEST)/bin/touch + $(DEST)/bin/touch \ + $(DEST)/bin/start-stop-daemon dirs = $(DEST)/bin \ $(DEST)/dev \