From 4755e5206bcf0acab72ee5d696295bc50a6b3b36 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 24 Mar 2022 22:01:29 +0100 Subject: [PATCH] test: new test, verify SysV start/stop daemon support Install start-stop-daemon in test root. Add S01-service.sh, which uses start-stop-daemon to start service.sh. Modify service.sh to respect signals, and not exit immediately when sleep exits due to SIGTERM. Remove PID file in signal callback and make sure to exit OK The test itself is basically a copy of the start-stop-service.sh test. Signed-off-by: Joachim Wiberg --- test/Makefile.am | 2 ++ test/common/S01-service.sh | 43 ++++++++++++++++++++++++++++++++++++++ test/common/service.sh | 19 ++++++++++++----- test/start-stop-sysv.sh | 42 +++++++++++++++++++++++++++++++++++++ test/tenv/root.mk | 3 ++- 5 files changed, 103 insertions(+), 6 deletions(-) create mode 100755 test/common/S01-service.sh create mode 100755 test/start-stop-sysv.sh 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 \