13aa99676SStefan Eßer#! /bin/sh 23aa99676SStefan Eßer# 33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause 43aa99676SStefan Eßer# 510328f8bSStefan Eßer# Copyright (c) 2018-2021 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 34*d43fa8efSStefan Eßerpids="" 35*d43fa8efSStefan Eßer 36*d43fa8efSStefan Eßer# We need to figure out if we should run stuff in parallel. 37*d43fa8efSStefan Eßerpll=1 38*d43fa8efSStefan Eßer 39*d43fa8efSStefan Eßerwhile getopts "n" opt; do 40*d43fa8efSStefan Eßer 41*d43fa8efSStefan Eßer case "$opt" in 42*d43fa8efSStefan Eßer n) pll=0 ; shift ; set -e ;; 43*d43fa8efSStefan Eßer ?) usage "Invalid option: $opt" ;; 44*d43fa8efSStefan Eßer esac 45*d43fa8efSStefan Eßer 46*d43fa8efSStefan Eßerdone 47*d43fa8efSStefan Eßer 4844d4804dSStefan Eßer# Command-line processing. 493aa99676SStefan Eßerif [ "$#" -eq 0 ]; then 50*d43fa8efSStefan Eßer printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" 513aa99676SStefan Eßer exit 1 523aa99676SStefan Eßerelse 533aa99676SStefan Eßer d="$1" 543aa99676SStefan Eßer shift 553aa99676SStefan Eßerfi 563aa99676SStefan Eßer 573aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 583aa99676SStefan Eßer run_extra_tests="$1" 593aa99676SStefan Eßer shift 603aa99676SStefan Eßerelse 613aa99676SStefan Eßer run_extra_tests=1 623aa99676SStefan Eßerfi 633aa99676SStefan Eßer 643aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 653aa99676SStefan Eßer run_stack_tests="$1" 663aa99676SStefan Eßer shift 673aa99676SStefan Eßerelse 683aa99676SStefan Eßer run_stack_tests=1 693aa99676SStefan Eßerfi 703aa99676SStefan Eßer 713aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 723aa99676SStefan Eßer generate="$1" 733aa99676SStefan Eßer shift 743aa99676SStefan Eßerelse 753aa99676SStefan Eßer generate=1 763aa99676SStefan Eßerfi 773aa99676SStefan Eßer 783aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 793aa99676SStefan Eßer time_tests="$1" 803aa99676SStefan Eßer shift 813aa99676SStefan Eßerelse 823aa99676SStefan Eßer time_tests=0 833aa99676SStefan Eßerfi 843aa99676SStefan Eßer 853aa99676SStefan Eßerif [ "$#" -gt 0 ]; then 863aa99676SStefan Eßer exe="$1" 873aa99676SStefan Eßer shift 883aa99676SStefan Eßerelse 893aa99676SStefan Eßer exe="$testdir/../bin/$d" 903aa99676SStefan Eßerfi 913aa99676SStefan Eßer 923aa99676SStefan Eßerscriptdir="$testdir/$d/scripts" 933aa99676SStefan Eßer 9410328f8bSStefan Eßerscripts=$(cat "$scriptdir/all.txt") 9510328f8bSStefan Eßer 9644d4804dSStefan Eßer# Run each script test individually. 9710328f8bSStefan Eßerfor s in $scripts; do 983aa99676SStefan Eßer 993aa99676SStefan Eßer f=$(basename "$s") 100*d43fa8efSStefan Eßer 101*d43fa8efSStefan Eßer if [ "$pll" -ne 0 ]; then 102*d43fa8efSStefan Eßer sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \ 103*d43fa8efSStefan Eßer "$generate" "$time_tests" "$exe" "$@" & 104*d43fa8efSStefan Eßer pids="$pids $!" 105*d43fa8efSStefan Eßer else 10610328f8bSStefan Eßer sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \ 10710328f8bSStefan Eßer "$generate" "$time_tests" "$exe" "$@" 108*d43fa8efSStefan Eßer fi 1093aa99676SStefan Eßer 1103aa99676SStefan Eßerdone 111*d43fa8efSStefan Eßer 112*d43fa8efSStefan Eßerif [ "$pll" -ne 0 ]; then 113*d43fa8efSStefan Eßer 114*d43fa8efSStefan Eßer exit_err=0 115*d43fa8efSStefan Eßer 116*d43fa8efSStefan Eßer for p in $pids; do 117*d43fa8efSStefan Eßer 118*d43fa8efSStefan Eßer wait "$p" 119*d43fa8efSStefan Eßer err="$?" 120*d43fa8efSStefan Eßer 121*d43fa8efSStefan Eßer if [ "$err" -ne 0 ]; then 122*d43fa8efSStefan Eßer printf 'A script failed!\n' 123*d43fa8efSStefan Eßer exit_err=1 124*d43fa8efSStefan Eßer fi 125*d43fa8efSStefan Eßer 126*d43fa8efSStefan Eßer done 127*d43fa8efSStefan Eßer 128*d43fa8efSStefan Eßer if [ "$exit_err" -ne 0 ]; then 129*d43fa8efSStefan Eßer exit 1 130*d43fa8efSStefan Eßer fi 131*d43fa8efSStefan Eßer 132*d43fa8efSStefan Eßerfi 133