1*3aa99676SStefan Eßer#! /bin/sh 2*3aa99676SStefan Eßer# 3*3aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause 4*3aa99676SStefan Eßer# 5*3aa99676SStefan Eßer# Copyright (c) 2018-2020 Gavin D. Howard and contributors. 6*3aa99676SStefan Eßer# 7*3aa99676SStefan Eßer# Redistribution and use in source and binary forms, with or without 8*3aa99676SStefan Eßer# modification, are permitted provided that the following conditions are met: 9*3aa99676SStefan Eßer# 10*3aa99676SStefan Eßer# * Redistributions of source code must retain the above copyright notice, this 11*3aa99676SStefan Eßer# list of conditions and the following disclaimer. 12*3aa99676SStefan Eßer# 13*3aa99676SStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice, 14*3aa99676SStefan Eßer# this list of conditions and the following disclaimer in the documentation 15*3aa99676SStefan Eßer# and/or other materials provided with the distribution. 16*3aa99676SStefan Eßer# 17*3aa99676SStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*3aa99676SStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*3aa99676SStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*3aa99676SStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*3aa99676SStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*3aa99676SStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*3aa99676SStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*3aa99676SStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*3aa99676SStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*3aa99676SStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*3aa99676SStefan Eßer# POSSIBILITY OF SUCH DAMAGE. 28*3aa99676SStefan Eßer# 29*3aa99676SStefan Eßer 30*3aa99676SStefan Eßer# WARNING: Test files cannot have empty lines! 31*3aa99676SStefan Eßer 32*3aa99676SStefan Eßerscript="$0" 33*3aa99676SStefan Eßertestdir=$(dirname "$script") 34*3aa99676SStefan Eßer 35*3aa99676SStefan Eßer. "$testdir/../functions.sh" 36*3aa99676SStefan Eßer 37*3aa99676SStefan Eßerif [ "$#" -eq 0 ]; then 38*3aa99676SStefan Eßer printf 'usage: %s dir [exec args...]\n' "$script" 39*3aa99676SStefan Eßer exit 1 40*3aa99676SStefan Eßerelse 41*3aa99676SStefan Eßer d="$1" 42*3aa99676SStefan Eßer shift 43*3aa99676SStefan Eßerfi 44*3aa99676SStefan Eßer 45*3aa99676SStefan Eßerif [ "$#" -lt 1 ]; then 46*3aa99676SStefan Eßer exe="$testdir/../bin/$d" 47*3aa99676SStefan Eßerelse 48*3aa99676SStefan Eßer exe="$1" 49*3aa99676SStefan Eßer shift 50*3aa99676SStefan Eßerfi 51*3aa99676SStefan Eßer 52*3aa99676SStefan Eßerout="$testdir/../.log_${d}_test.txt" 53*3aa99676SStefan Eßer 54*3aa99676SStefan Eßerexebase=$(basename "$exe") 55*3aa99676SStefan Eßer 56*3aa99676SStefan Eßerposix="posix_errors" 57*3aa99676SStefan Eßerread_errors="read_errors" 58*3aa99676SStefan Eßer 59*3aa99676SStefan Eßerif [ "$d" = "bc" ]; then 60*3aa99676SStefan Eßer opts="-l" 61*3aa99676SStefan Eßer halt="halt" 62*3aa99676SStefan Eßer read_call="read()" 63*3aa99676SStefan Eßer read_expr="${read_call}\n5+5;" 64*3aa99676SStefan Eßerelse 65*3aa99676SStefan Eßer opts="-x" 66*3aa99676SStefan Eßer halt="q" 67*3aa99676SStefan Eßerfi 68*3aa99676SStefan Eßer 69*3aa99676SStefan Eßerfor testfile in $testdir/$d/*errors.txt; do 70*3aa99676SStefan Eßer 71*3aa99676SStefan Eßer if [ -z "${testfile##*$read_errors*}" ]; then 72*3aa99676SStefan Eßer # We don't test read errors here. Skip. 73*3aa99676SStefan Eßer continue 74*3aa99676SStefan Eßer fi 75*3aa99676SStefan Eßer 76*3aa99676SStefan Eßer if [ -z "${testfile##*$posix*}" ]; then 77*3aa99676SStefan Eßer 78*3aa99676SStefan Eßer line="last" 79*3aa99676SStefan Eßer printf '%s\n' "$line" | "$exe" "$@" "-lw" 2> "$out" > /dev/null 80*3aa99676SStefan Eßer err="$?" 81*3aa99676SStefan Eßer 82*3aa99676SStefan Eßer if [ "$err" -ne 0 ]; then 83*3aa99676SStefan Eßer die "$d" "returned an error ($err)" "POSIX warning" 1 84*3aa99676SStefan Eßer fi 85*3aa99676SStefan Eßer 86*3aa99676SStefan Eßer checktest "$d" "1" "$line" "$out" "$exebase" 87*3aa99676SStefan Eßer 88*3aa99676SStefan Eßer options="-ls" 89*3aa99676SStefan Eßer else 90*3aa99676SStefan Eßer options="$opts" 91*3aa99676SStefan Eßer fi 92*3aa99676SStefan Eßer 93*3aa99676SStefan Eßer base=$(basename "$testfile") 94*3aa99676SStefan Eßer base="${base%.*}" 95*3aa99676SStefan Eßer printf 'Running %s %s...' "$d" "$base" 96*3aa99676SStefan Eßer 97*3aa99676SStefan Eßer while read -r line; do 98*3aa99676SStefan Eßer 99*3aa99676SStefan Eßer rm -f "$out" 100*3aa99676SStefan Eßer 101*3aa99676SStefan Eßer printf '%s\n' "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null 102*3aa99676SStefan Eßer err="$?" 103*3aa99676SStefan Eßer 104*3aa99676SStefan Eßer checktest "$d" "$err" "$line" "$out" "$exebase" 105*3aa99676SStefan Eßer 106*3aa99676SStefan Eßer done < "$testfile" 107*3aa99676SStefan Eßer 108*3aa99676SStefan Eßer printf 'pass\n' 109*3aa99676SStefan Eßer 110*3aa99676SStefan Eßerdone 111*3aa99676SStefan Eßer 112*3aa99676SStefan Eßerfor testfile in $testdir/$d/errors/*.txt; do 113*3aa99676SStefan Eßer 114*3aa99676SStefan Eßer printf 'Running %s error file %s...' "$d" "$testfile" 115*3aa99676SStefan Eßer 116*3aa99676SStefan Eßer printf '%s\n' "$halt" | "$exe" "$@" $opts "$testfile" 2> "$out" > /dev/null 117*3aa99676SStefan Eßer err="$?" 118*3aa99676SStefan Eßer 119*3aa99676SStefan Eßer checktest "$d" "$err" "$testfile" "$out" "$exebase" 120*3aa99676SStefan Eßer 121*3aa99676SStefan Eßer printf 'pass\n' 122*3aa99676SStefan Eßer 123*3aa99676SStefan Eßer printf 'Running %s error file %s through cat...' "$d" "$testfile" 124*3aa99676SStefan Eßer 125*3aa99676SStefan Eßer cat "$testfile" | "$exe" "$@" $opts 2> "$out" > /dev/null 126*3aa99676SStefan Eßer err="$?" 127*3aa99676SStefan Eßer 128*3aa99676SStefan Eßer checkcrash "$d" "$err" "$testfile" 129*3aa99676SStefan Eßer 130*3aa99676SStefan Eßer printf 'pass\n' 131*3aa99676SStefan Eßer 132*3aa99676SStefan Eßerdone 133