diff options
author | Wolfgang Müller | 2021-03-10 17:09:13 +0100 |
---|---|---|
committer | Wolfgang Müller | 2021-03-10 17:09:13 +0100 |
commit | 3bce19d12d93f1b27e7d2f2acbef0926417d5390 (patch) | |
tree | 3700afd21af95a0904be6aaf3378fc75e3955b10 | |
parent | 1d767c0bdd6476a4ba9a998b8953ec8b9ad9f21c (diff) | |
download | bosun-1.3.0.tar.gz |
Add a first draft of the test suite1.3.0
The introduction of a test suite makes future changes easier to
troubleshoot and verify. Whilst this is only a first draft, it should be
stable enough to be used in normal development and should cover the
entirety of bosun's functionality.
-rw-r--r-- | test.sh | 36 | ||||
-rw-r--r-- | test/01-add.test | 31 | ||||
-rw-r--r-- | test/02-list.test | 39 | ||||
-rw-r--r-- | test/03-flush.test | 14 | ||||
-rw-r--r-- | test/04-rebuild.test | 21 | ||||
-rw-r--r-- | test/05-remove.test | 29 | ||||
-rw-r--r-- | test/06-default.test | 25 | ||||
-rw-r--r-- | test/lib.sh | 84 | ||||
-rw-r--r-- | test/setup.sh | 16 |
9 files changed, 295 insertions, 0 deletions
@@ -0,0 +1,36 @@ +#!/bin/sh + +TMPDIR=${TMPDIR:-/tmp} +MOCK_ROOT=$TMPDIR/bosun-test + +TESTDIR=$PWD/test +BOSUN_CMD=$PWD/bosun + +run_test() { + TARGET_DIR=$MOCK_ROOT/$1/mock + BOSUN_DIR=$TARGET_DIR/stow + + rm -rf "$TARGET_DIR" + + . test/setup.sh || exit 1 + + ( + cd "$TARGET_DIR/.." || exit 1 + env -i \ + PATH="/usr/bin:/bin" \ + BOSUN_CMD="$BOSUN_CMD" \ + BOSUN_DIR="$BOSUN_DIR" \ + sh -c ". $TESTDIR/lib.sh; . $TESTDIR/$1.test" + ) + TESTS_FAILED=$((TESTS_FAILED + $?)) +} + +run_test 01-add +run_test 02-list +run_test 03-flush +run_test 04-rebuild +run_test 05-remove +run_test 06-default + +test $TESTS_FAILED -gt 0 && exit 1 +exit 0 diff --git a/test/01-add.test b/test/01-add.test new file mode 100644 index 0000000..b4d223f --- /dev/null +++ b/test/01-add.test @@ -0,0 +1,31 @@ +#!/bin/sh + +header "bosun add" + +assert success "add host-baz" "$BOSUN_CMD" add host-baz + +want <<EOF +./make.conf -> stow/host-baz/make.conf +./package.accept_keywords -> stow/service-bar/package.accept_keywords +./package.use/20-service-bar -> ../stow/service-bar/package.use/20-service-bar +./package.use/30-app-foo -> ../stow/app-foo/package.use/30-app-foo +EOF + +have_links +assert_output_matches "adds role 'host-baz'" + +want <<EOF +bosun: this command requires at least one role +EOF + +assert failure "add" "$BOSUN_CMD" add +assert_output_matches "prints error message" + +want <<EOF +bosun: no such role 'role-missing' in $BOSUN_DIR +EOF + +assert failure "add role-missing" "$BOSUN_CMD" add role-missing +assert_output_matches "prints error message" + +end diff --git a/test/02-list.test b/test/02-list.test new file mode 100644 index 0000000..075632e --- /dev/null +++ b/test/02-list.test @@ -0,0 +1,39 @@ +#!/bin/sh + +header "bosun list" + +want <<EOF +app-foo +service-bar +EOF + +assert success "list active" "$BOSUN_CMD" list active +assert_output_matches "lists active roles" + +assert success "list" "$BOSUN_CMD" list +assert_output_matches "lists active roles" + +want <<EOF +app-foo +host-baz +service-bar +EOF + +assert success "list all" "$BOSUN_CMD" list all +assert_output_matches "lists all roles" + +want <<EOF +host-baz +EOF + +assert success "list available" "$BOSUN_CMD" list available +assert_output_matches "lists available roles" + +want <<EOF +bosun: no such list type 'foo'. Try: active, all, available +EOF + +assert failure "list foo" "$BOSUN_CMD" list foo +assert_output_matches "prints error message" + +end diff --git a/test/03-flush.test b/test/03-flush.test new file mode 100644 index 0000000..435f534 --- /dev/null +++ b/test/03-flush.test @@ -0,0 +1,14 @@ +#!/bin/sh + +header "bosun flush" + +assert success "flush" "$BOSUN_CMD" flush + +want <<EOF +d . +EOF + +have_dir +assert_output_matches "no roles remaining" + +end diff --git a/test/04-rebuild.test b/test/04-rebuild.test new file mode 100644 index 0000000..503afc4 --- /dev/null +++ b/test/04-rebuild.test @@ -0,0 +1,21 @@ +#!/bin/sh + +header "bosun rebuild" + +mkdir "$BOSUN_DIR/app-foo/package.accept_keywords" || exit 1 +touch "$BOSUN_DIR/app-foo/package.accept_keywords/30-app-foo" || exit 1 + +assert success "rebuild app-foo" "$BOSUN_CMD" rebuild app-foo + +want <<EOF +./package.accept_keywords/20-service-bar -> ../stow/service-bar/package.accept_keywords/20-service-bar +./package.accept_keywords/30-app-foo -> ../stow/app-foo/package.accept_keywords/30-app-foo +./package.use/20-service-bar -> ../stow/service-bar/package.use/20-service-bar +./package.use/30-app-foo -> ../stow/app-foo/package.use/30-app-foo +EOF + +have_links + +assert_output_matches "rebuilds role" + +end diff --git a/test/05-remove.test b/test/05-remove.test new file mode 100644 index 0000000..1fa7d35 --- /dev/null +++ b/test/05-remove.test @@ -0,0 +1,29 @@ +#!/bin/sh + +header "bosun remove" + +assert success "remove app-foo" "$BOSUN_CMD" remove app-foo + +want <<EOF +./package.accept_keywords -> stow/service-bar/package.accept_keywords +./package.use -> stow/service-bar/package.use +EOF + +have_links +assert_output_matches "removes role" + +want <<EOF +bosun: this command requires at least one role +EOF + +assert failure "remove" "$BOSUN_CMD" remove +assert_output_matches "prints error message" + +want <<EOF +bosun: no such role 'role-missing' in $BOSUN_DIR +EOF + +assert failure "remove role-missing" "$BOSUN_CMD" remove role-missing +assert_output_matches "prints error message" + +end diff --git a/test/06-default.test b/test/06-default.test new file mode 100644 index 0000000..d40062e --- /dev/null +++ b/test/06-default.test @@ -0,0 +1,25 @@ +#!/bin/sh + +header "bosun" + +want <<EOF +app-foo +service-bar +EOF + +assert success "bosun" "$BOSUN_CMD" +assert_output_matches "lists active roles" + +want <<EOF +bosun: no such command 'missing-command' +usage: bosun add role ... + bosun flush + bosun [list [type ...]] + bosun rebuild [role ...] + bosun remove [role ...] +EOF + +assert failure "missing-command" "$BOSUN_CMD" missing-command +assert_output_matches "prints error message and usage" + +end diff --git a/test/lib.sh b/test/lib.sh new file mode 100644 index 0000000..733613c --- /dev/null +++ b/test/lib.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +TESTS_FAILED=0 + +ok() { + if ! test -t 1; then + printf 'ok - %s\n' "$*" + else + printf '\e[32mok\e[0m - %s\n' "$*" + fi +} + +nok() { + TESTS_FAILED=$((TESTS_FAILED + 1)) + if ! test -t 1; then + printf 'not ok - %s\n' "$*" >&2 + else + printf '\e[31mnot ok\e[0m - %s\n' "$*" >&2 + fi +} + +header() { + printf '# %s\n' "$*" +} + +info() { + printf '\n' + eval "$@" + printf '\n' +} + +want() { + cat > want +} + +assert_output_matches() { + msg=$1 + if cmp have want >/dev/null 2>&1; then + ok "$msg" + return 0 + else + nok "$msg" + info diff -u have want >&2 + return 1 + fi +} + +assert() { + if test "$1" = "success"; then + assert_return=0 + elif test "$1" = "failure"; then + assert_return=1 + else + assert_return=$1 + fi + shift + + msg=$1 + shift + + eval "$@" > have 2>&1 + + if test "$?" -eq "$assert_return"; then + ok "$msg" + return 0 + else + nok "$msg" + info cat have >&2 + return 1 + fi +} + +end() { + test $TESTS_FAILED -gt 0 && exit $TESTS_FAILED + exit 0 +} + +have_dir() { + (cd "$BOSUN_DIR/.." && find . -printf '%y %p\n' | sed '/^..\.\/stow/d' | sort) > have +} + +have_links() { + (cd "$BOSUN_DIR/.." && find . -type l -printf '%p -> %l\n' | sort) > have +} diff --git a/test/setup.sh b/test/setup.sh new file mode 100644 index 0000000..636c7d6 --- /dev/null +++ b/test/setup.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +mkdir -p "$BOSUN_DIR/app-foo/package.use" +mkdir -p "$BOSUN_DIR/service-bar/package.use" +mkdir -p "$BOSUN_DIR/service-bar/package.accept_keywords" +mkdir -p "$BOSUN_DIR/host-baz" + +touch "$BOSUN_DIR/app-foo/package.use/30-app-foo" +touch "$BOSUN_DIR/service-bar/package.use/20-service-bar" +touch "$BOSUN_DIR/service-bar/package.accept_keywords/20-service-bar" +touch "$BOSUN_DIR/host-baz/make.conf" + +mkdir -p "$BOSUN_DIR/../package.use" +ln -s ../stow/app-foo/package.use/30-app-foo "$BOSUN_DIR/../package.use/30-app-foo" +ln -s ../stow/service-bar/package.use/20-service-bar "$BOSUN_DIR/../package.use/20-service-bar" +ln -s stow/service-bar/package.accept_keywords "$BOSUN_DIR/../package.accept_keywords" |