#!/bin/bash set -euo pipefail ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) TEST_DIR="$ROOT/test/shell.d" shopt -s nullglob tests=() for test in "$TEST_DIR"/*-test.sh; do [[ $(basename "$test") == "base-test.sh" ]] && continue tests+=("$test") done shopt -u nullglob if (( ${#tests[@]} == 0 )); then echo "No shell tests found in $TEST_DIR" >&2 exit 1 fi # Keep going after a failing file. A test file exits at its first failed # assertion, so aborting the run there too would hide every file after it -- # one packaging failure was masking 114 of 134 files. output=$(mktemp) trap 'rm -f "$output"' EXIT failed=() skipped=() for test in "${tests[@]}"; do printf '==> %s\n' "${test#$ROOT/}" bash "$test" | tee "$output" || failed+=("${test#$ROOT/}") if grep -q '^ok - .* # SKIP$' "$output"; then skipped+=("${test#$ROOT/}") fi done if (( ${#skipped[@]} > 0 )); then printf '\nSkipped checks in %d of %d test files:\n' "${#skipped[@]}" "${#tests[@]}" printf ' %s\n' "${skipped[@]}" fi if (( ${#failed[@]} > 0 )); then printf '\n%d of %d test files failed:\n' "${#failed[@]}" "${#tests[@]}" >&2 printf ' %s\n' "${failed[@]}" >&2 exit 1 fi if (( ${#skipped[@]} == 0 )); then printf '\nAll %d test files passed.\n' "${#tests[@]}" else printf '\n%d test files completed without failures; %d had skipped checks.\n' "${#tests[@]}" "${#skipped[@]}" fi