From 561387ce572f11f607b49e9a533fbb6e3ed8bda0 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Fri, 29 Apr 2022 07:39:12 +0200 Subject: [PATCH] test: new test, verify pre:post: scripts with optional env:file Signed-off-by: Joachim Wiberg --- test/Makefile.am | 30 +++++++++++---------- test/common/serv.c | 31 ++++++++++++++++++++-- test/pre-post-serv.sh | 62 +++++++++++++++++++++++++++++++++++++++++++ test/skel/bin/post.sh | 9 +++++++ test/skel/bin/pre.sh | 9 +++++++ test/skel/etc/env | 5 ++++ 6 files changed, 130 insertions(+), 16 deletions(-) create mode 100755 test/pre-post-serv.sh create mode 100755 test/skel/bin/post.sh create mode 100755 test/skel/bin/pre.sh create mode 100644 test/skel/etc/env diff --git a/test/Makefile.am b/test/Makefile.am index 2b263f63..54ea04bb 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,25 +1,26 @@ SUBDIRS = common tenv -EXTRA_DIST = skel/bin/busybox-x86_64.md5 skel/sbin/service.sh skel/bin/slay \ - skel/sbin/task.sh \ - skel/cdrom/.empty skel/dev/shm/.empty skel/dev/pts/.empty \ - 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/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 \ - skel/home/.empty skel/usr/games/.empty skel/usr/src/.empty \ - skel/usr/share/.empty skel/usr/include/.empty \ - skel/usr/local/games/.empty skel/usr/local/sbin/.empty \ - skel/usr/local/share/.empty skel/usr/local/src/.empty \ - skel/usr/local/lib/.empty skel/usr/local/bin/.empty \ +EXTRA_DIST = skel/bin/busybox-x86_64.md5 skel/sbin/service.sh skel/bin/slay \ + skel/etc/env skel/bin/pre.sh skel/bin/post.sh skel/sbin/task.sh \ + skel/cdrom/.empty skel/dev/shm/.empty skel/dev/pts/.empty \ + 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/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 \ + skel/home/.empty skel/usr/games/.empty skel/usr/src/.empty \ + skel/usr/share/.empty skel/usr/include/.empty \ + skel/usr/local/games/.empty skel/usr/local/sbin/.empty \ + skel/usr/local/share/.empty skel/usr/local/src/.empty \ + skel/usr/local/lib/.empty skel/usr/local/bin/.empty \ skel/usr/local/etc/.empty skel/var/.empty 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 += pre-post-serv.sh EXTRA_DIST += start-stop-service.sh EXTRA_DIST += start-stop-service-sub-config.sh EXTRA_DIST += start-kill-service.sh @@ -44,6 +45,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 += pre-post-serv.sh TESTS += start-stop-service.sh TESTS += start-stop-service-sub-config.sh TESTS += start-kill-service.sh diff --git a/test/common/serv.c b/test/common/serv.c index 56d9b6ff..c5f49076 100644 --- a/test/common/serv.c +++ b/test/common/serv.c @@ -15,6 +15,29 @@ #define PROGNM "serv" +static void verify_env(char *arg) +{ + char *key, *value; + char *replica; + char *env; + + key = replica = strdup(arg); + if (!replica) + err(1, "Failed duplicating arg %s", arg); + + value = strchr(replica, ':'); + if (!value) + errx(1, "Invalid format of KEY:VALUE arg, missing ':' in %s", replica); + *(value++) = 0; + + env = getenv(key); + if (!env) + errx(1, "No '%s' in environment", key); + + if (strcmp(env, value)) + errx(1, "Mismatch, environment '%s' vs expected value '%s'", env, value); +} + static void sig(int signo) { warnx("We got signal %d ...", signo); @@ -48,8 +71,9 @@ static int usage(int rc) fprintf(fp, "%s [-nhp] [-P FILE]\n" "\n" - " -n Run in foreground\n" " -h Show help text (this)\n" + " -e K:V Verify K environment variable is V value\n" + " -n Run in foreground\n" " -p Create PID file despite running in foreground\n" " -P FILE Create PID file using FILE\n" "\n" @@ -69,10 +93,13 @@ int main(int argc, char *argv[]) char *pidfn = NULL; int c; - while ((c = getopt(argc, argv, "hnpP:")) != EOF) { + while ((c = getopt(argc, argv, "e:hnpP:")) != EOF) { switch (c) { case 'h': return usage(0); + case 'e': + verify_env(optarg); + break; case 'n': do_background = 0; do_pidfile--; diff --git a/test/pre-post-serv.sh b/test/pre-post-serv.sh new file mode 100755 index 00000000..00d216fd --- /dev/null +++ b/test/pre-post-serv.sh @@ -0,0 +1,62 @@ +#!/bin/sh +set -eu + +TEST_DIR=$(dirname "$0") + +test_setup() +{ + say "Test start $(date)" +} + +test_teardown() +{ + say "Test done $(date)" + + texec rm -f "$FINIT_CONF" +} + +test_one() +{ + pre=$1 + precont=$2 + service=$3 + post=$4 + postcont=$5 + + say "Add service stanza '$service' to $FINIT_CONF ..." + texec sh -c "echo '$service' > $FINIT_CONF" + + say 'Reload Finit' + texec sh -c "initctl reload" + + retry 'assert_num_children 1 serv' + if [ -n "$pre" ]; then + assert_file_contains "$pre" "$precont" + texec sh -c "rm -f $pre" + fi + + say 'Stop the service' + texec sh -c "initctl stop serv" + + retry 'assert_num_children 0 serv' + if [ -n "$post" ]; then + assert_file_contains "$post" "$postcont" + texec sh -c "rm -f $post" + fi + + say "Done, drop service from $FINIT_CONF ..." + texec sh -c "rm $FINIT_CONF" + texec sh -c "initctl reload" +} + +# shellcheck source=/dev/null +. "$TEST_DIR/tenv/lib.sh" + +#texec sh -c "initctl debug" + +test_one "" "" "service serv -np -- Regular fg service, no pre/post scripts" "" "" +test_one "" "" "service env:/etc/env serv -np -e foo:bar -- serv + env, no pre/post scripts" "" "" +test_one /tmp/pre PRE "service pre:/bin/pre.sh serv -np -- serv + pre script" "" "" +test_one /tmp/pre bar "service env:/etc/env pre:/bin/pre.sh serv -np -e baz:qux -- Env + pre script" "" "" +test_one "" "" "service post:/bin/post.sh serv -np -- Regular fg service, post script" /tmp/post POST +test_one "" "" "service env:/etc/env post:/bin/post.sh serv -np -- Regular fg service, post script" /tmp/post qux diff --git a/test/skel/bin/post.sh b/test/skel/bin/post.sh new file mode 100755 index 00000000..81ddeeb9 --- /dev/null +++ b/test/skel/bin/post.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +marker="POST" +# shellcheck disable=SC2154 +if [ -n "$baz" ]; then + marker=$baz +fi + +echo "$marker" > /tmp/post diff --git a/test/skel/bin/pre.sh b/test/skel/bin/pre.sh new file mode 100755 index 00000000..2dc07904 --- /dev/null +++ b/test/skel/bin/pre.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +marker="PRE" +# shellcheck disable=SC2154 +if [ -n "$foo" ]; then + marker=$foo +fi + +echo "$marker" > /tmp/pre diff --git a/test/skel/etc/env b/test/skel/etc/env new file mode 100644 index 00000000..9ad45095 --- /dev/null +++ b/test/skel/etc/env @@ -0,0 +1,5 @@ +# Some environments to be sourced by Finit services +# and their pre:- and post:scripts + +foo=bar +baz=qux