diff options
Diffstat (limited to 'tests/all.sh')
-rwxr-xr-x | tests/all.sh | 135 |
1 files changed, 124 insertions, 11 deletions
diff --git a/tests/all.sh b/tests/all.sh index 04afdb39..9174d398 100755 --- a/tests/all.sh +++ b/tests/all.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2021 Gavin D. Howard and contributors. +# Copyright (c) 2018-2023 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -27,54 +27,97 @@ # POSSIBILITY OF SUCH DAMAGE. # -set -e - script="$0" testdir=$(dirname "$script") . "$testdir/../scripts/functions.sh" +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + print 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [gen_tests] [run_problematic_tests] [time_tests] [exec args...]\n' \ + "$script" + exit 1 +} + +# We need to figure out if we should run stuff in parallel. +pll=1 + +while getopts "n" opt; do + + case "$opt" in + n) pll=0 ; set -e ;; + ?) usage "Invalid option: $opt" ;; + esac + +done +shift $(($OPTIND - 1)) + # Command-line processing. if [ "$#" -ge 1 ]; then d="$1" shift + check_d_arg "$d" else - err_exit "usage: $script dir [run_extra_tests] [run_stack_tests] [gen_tests] [time_tests] [exec args...]" 1 + usage "Not enough arguments" fi if [ "$#" -lt 1 ]; then extra=1 + check_bool_arg "$extra" else extra="$1" shift + check_bool_arg "$extra" fi if [ "$#" -lt 1 ]; then run_stack_tests=1 + check_bool_arg "$run_stack_tests" else run_stack_tests="$1" shift + check_bool_arg "$run_stack_tests" fi if [ "$#" -lt 1 ]; then generate_tests=1 + check_bool_arg "$generate_tests" else generate_tests="$1" shift + check_bool_arg "$generate_tests" +fi + +if [ "$#" -lt 1 ]; then + problematic_tests=1 + check_bool_arg "$problematic_tests" +else + problematic_tests="$1" + shift + check_bool_arg "$problematic_tests" fi if [ "$#" -lt 1 ]; then time_tests=0 + check_bool_arg "$time_tests" else time_tests="$1" shift + check_bool_arg "$time_tests" fi if [ "$#" -lt 1 ]; then exe="$testdir/../bin/$d" + check_exec_arg "$exe" else exe="$1" shift + check_exec_arg "$exe" fi stars="***********************************************************************" @@ -96,6 +139,8 @@ unset DC_LINE_LENGTH # Get the list of tests that require extra math. extra_required=$(cat "$testdir/extra_required.txt") +pids="" + printf '\nRunning %s tests...\n\n' "$d" # Run the tests one at a time. @@ -109,25 +154,93 @@ while read t; do fi fi - sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@" + if [ "$pll" -ne 0 ]; then + sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@" & + pids="$pids $!" + else + sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@" + fi done < "$testdir/$d/all.txt" # stdin tests. -sh "$testdir/stdin.sh" "$d" "$exe" "$@" +if [ "$pll" -ne 0 ]; then + sh "$testdir/stdin.sh" "$d" "$exe" "$@" & + pids="$pids $!" +else + sh "$testdir/stdin.sh" "$d" "$exe" "$@" +fi # Script tests. -sh "$testdir/scripts.sh" "$d" "$extra" "$run_stack_tests" "$generate_tests" \ - "$time_tests" "$exe" "$@" +if [ "$pll" -ne 0 ]; then + sh "$testdir/scripts.sh" "$d" "$extra" "$run_stack_tests" "$generate_tests" \ + "$time_tests" "$exe" "$@" & + pids="$pids $!" +else + sh "$testdir/scripts.sh" -n "$d" "$extra" "$run_stack_tests" "$generate_tests" \ + "$time_tests" "$exe" "$@" +fi # Read tests. -sh "$testdir/read.sh" "$d" "$exe" "$@" +if [ "$pll" -ne 0 ]; then + sh "$testdir/read.sh" "$d" "$exe" "$@" & + pids="$pids $!" +else + sh "$testdir/read.sh" "$d" "$exe" "$@" +fi # Error tests. -sh "$testdir/errors.sh" "$d" "$exe" "$@" +if [ "$pll" -ne 0 ]; then + sh "$testdir/errors.sh" "$d" "$exe" "$@" & + pids="$pids $!" +else + sh "$testdir/errors.sh" "$d" "$exe" "$@" +fi + +# Test all the files in the errors directory. While the other error test (in +# tests/errors.sh) does a test for every line, this does one test per file, but +# it runs the file through stdin and as a file on the command-line. +for testfile in $testdir/$d/errors/*.txt; do + + b=$(basename "$testfile") + + if [ "$pll" -ne 0 ]; then + sh "$testdir/error.sh" "$d" "$b" "$problematic_tests" "$@" & + pids="$pids $!" + else + sh "$testdir/error.sh" "$d" "$b" "$problematic_tests" "$@" + fi + +done # Other tests. -sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@" +if [ "$pll" -ne 0 ]; then + sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@" & + pids="$pids $!" +else + sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@" +fi + +if [ "$pll" -ne 0 ]; then + + exit_err=0 + + for p in $pids; do + + wait "$p" + err="$?" + + if [ "$err" -ne 0 ]; then + printf 'A test failed!\n' + exit_err=1 + fi + done + + if [ "$exit_err" -ne 0 ]; then + exit 1 + fi + +fi printf '\nAll %s tests passed.\n' "$d" |