13aa99676SStefan Eßer#! /bin/sh 23aa99676SStefan Eßer# 33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause 43aa99676SStefan Eßer# 5*a970610aSStefan Eßer# Copyright (c) 2018-2024 Gavin D. Howard and contributors. 63aa99676SStefan Eßer# 73aa99676SStefan Eßer# Redistribution and use in source and binary forms, with or without 83aa99676SStefan Eßer# modification, are permitted provided that the following conditions are met: 93aa99676SStefan Eßer# 103aa99676SStefan Eßer# * Redistributions of source code must retain the above copyright notice, this 113aa99676SStefan Eßer# list of conditions and the following disclaimer. 123aa99676SStefan Eßer# 133aa99676SStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice, 143aa99676SStefan Eßer# this list of conditions and the following disclaimer in the documentation 153aa99676SStefan Eßer# and/or other materials provided with the distribution. 163aa99676SStefan Eßer# 173aa99676SStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 183aa99676SStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 193aa99676SStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 203aa99676SStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 213aa99676SStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 223aa99676SStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 233aa99676SStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 243aa99676SStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 253aa99676SStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 263aa99676SStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 273aa99676SStefan Eßer# POSSIBILITY OF SUCH DAMAGE. 283aa99676SStefan Eßer# 293aa99676SStefan Eßer 303aa99676SStefan Eßerscript="$0" 313aa99676SStefan Eßer 323aa99676SStefan Eßertestdir=$(dirname "${script}") 333aa99676SStefan Eßer 34103d7cdfSStefan Eßer. "$testdir/../scripts/functions.sh" 35103d7cdfSStefan Eßer 364fca8e0fSStefan Eßer# Just print the usage and exit with an error. This can receive a message to 374fca8e0fSStefan Eßer# print. 384fca8e0fSStefan Eßer# @param 1 A message to print. 394fca8e0fSStefan Eßerusage() { 404fca8e0fSStefan Eßer if [ $# -eq 1 ]; then 414fca8e0fSStefan Eßer printf '%s\n\n' "$1" 424fca8e0fSStefan Eßer fi 434fca8e0fSStefan Eßer printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" 444fca8e0fSStefan Eßer exit 1 454fca8e0fSStefan Eßer} 464fca8e0fSStefan Eßer 47d43fa8efSStefan Eßerpids="" 48d43fa8efSStefan Eßer 49d43fa8efSStefan Eßer# We need to figure out if we should run stuff in parallel. 50d43fa8efSStefan Eßerpll=1 51d43fa8efSStefan Eßer 52d43fa8efSStefan Eßerwhile getopts "n" opt; do 53d43fa8efSStefan Eßer 54d43fa8efSStefan Eßer case "$opt" in 55103d7cdfSStefan Eßer n) pll=0 ; set -e ;; 56d43fa8efSStefan Eßer ?) usage "Invalid option: $opt" ;; 57d43fa8efSStefan Eßer esac 58d43fa8efSStefan Eßer 59d43fa8efSStefan Eßerdone 60103d7cdfSStefan Eßershift $(($OPTIND - 1)) 61d43fa8efSStefan Eßer 6244d4804dSStefan Eßer# Command-line processing. 633aa99676SStefan Eßerif [ "$#" -eq 0 ]; then 644fca8e0fSStefan Eßer usage "Need at least 1 argument" 653aa99676SStefan Eßerelse 663aa99676SStefan Eßer d="$1" 673aa99676SStefan Eßer shift 684fca8e0fSStefan Eßer check_d_arg "$d" 693aa99676SStefan Eßerfi 703aa99676SStefan Eßer 713aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 723aa99676SStefan Eßer run_extra_tests="$1" 733aa99676SStefan Eßer shift 744fca8e0fSStefan Eßer check_bool_arg "$run_extra_tests" 753aa99676SStefan Eßerelse 763aa99676SStefan Eßer run_extra_tests=1 774fca8e0fSStefan Eßer check_bool_arg "$run_extra_tests" 783aa99676SStefan Eßerfi 793aa99676SStefan Eßer 803aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 813aa99676SStefan Eßer run_stack_tests="$1" 823aa99676SStefan Eßer shift 834fca8e0fSStefan Eßer check_bool_arg "$run_stack_tests" 843aa99676SStefan Eßerelse 853aa99676SStefan Eßer run_stack_tests=1 864fca8e0fSStefan Eßer check_bool_arg "$run_stack_tests" 873aa99676SStefan Eßerfi 883aa99676SStefan Eßer 893aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 903aa99676SStefan Eßer generate="$1" 913aa99676SStefan Eßer shift 924fca8e0fSStefan Eßer check_bool_arg "$generate" 933aa99676SStefan Eßerelse 943aa99676SStefan Eßer generate=1 954fca8e0fSStefan Eßer check_bool_arg "$generate" 963aa99676SStefan Eßerfi 973aa99676SStefan Eßer 983aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 993aa99676SStefan Eßer time_tests="$1" 1003aa99676SStefan Eßer shift 1014fca8e0fSStefan Eßer check_bool_arg "$time_tests" 1023aa99676SStefan Eßerelse 1033aa99676SStefan Eßer time_tests=0 1044fca8e0fSStefan Eßer check_bool_arg "$time_tests" 1053aa99676SStefan Eßerfi 1063aa99676SStefan Eßer 1073aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 1083aa99676SStefan Eßer exe="$1" 1093aa99676SStefan Eßer shift 1104fca8e0fSStefan Eßer check_exec_arg "$exe" 1113aa99676SStefan Eßerelse 1123aa99676SStefan Eßer exe="$testdir/../bin/$d" 1134fca8e0fSStefan Eßer check_exec_arg "$exe" 1143aa99676SStefan Eßerfi 1153aa99676SStefan Eßer 1163aa99676SStefan Eßerscriptdir="$testdir/$d/scripts" 1173aa99676SStefan Eßer 11810328f8bSStefan Eßerscripts=$(cat "$scriptdir/all.txt") 11910328f8bSStefan Eßer 12044d4804dSStefan Eßer# Run each script test individually. 12110328f8bSStefan Eßerfor s in $scripts; do 1223aa99676SStefan Eßer 1233aa99676SStefan Eßer f=$(basename "$s") 124d43fa8efSStefan Eßer 125d43fa8efSStefan Eßer if [ "$pll" -ne 0 ]; then 126d43fa8efSStefan Eßer sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \ 127d43fa8efSStefan Eßer "$generate" "$time_tests" "$exe" "$@" & 128d43fa8efSStefan Eßer pids="$pids $!" 129d43fa8efSStefan Eßer else 13010328f8bSStefan Eßer sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \ 13110328f8bSStefan Eßer "$generate" "$time_tests" "$exe" "$@" 132d43fa8efSStefan Eßer fi 1333aa99676SStefan Eßer 1343aa99676SStefan Eßerdone 135d43fa8efSStefan Eßer 136d43fa8efSStefan Eßerif [ "$pll" -ne 0 ]; then 137d43fa8efSStefan Eßer 138d43fa8efSStefan Eßer exit_err=0 139d43fa8efSStefan Eßer 140d43fa8efSStefan Eßer for p in $pids; do 141d43fa8efSStefan Eßer 142d43fa8efSStefan Eßer wait "$p" 143d43fa8efSStefan Eßer err="$?" 144d43fa8efSStefan Eßer 145d43fa8efSStefan Eßer if [ "$err" -ne 0 ]; then 146d43fa8efSStefan Eßer printf 'A script failed!\n' 147d43fa8efSStefan Eßer exit_err=1 148d43fa8efSStefan Eßer fi 149d43fa8efSStefan Eßer 150d43fa8efSStefan Eßer done 151d43fa8efSStefan Eßer 152d43fa8efSStefan Eßer if [ "$exit_err" -ne 0 ]; then 153d43fa8efSStefan Eßer exit 1 154d43fa8efSStefan Eßer fi 155d43fa8efSStefan Eßer 156d43fa8efSStefan Eßerfi 157