1d43fa8efSStefan Eßer#! /bin/sh 2d43fa8efSStefan Eßer# 3d43fa8efSStefan Eßer# SPDX-License-Identifier: BSD-2-Clause 4d43fa8efSStefan Eßer# 5*a970610aSStefan Eßer# Copyright (c) 2018-2024 Gavin D. Howard and contributors. 6d43fa8efSStefan Eßer# 7d43fa8efSStefan Eßer# Redistribution and use in source and binary forms, with or without 8d43fa8efSStefan Eßer# modification, are permitted provided that the following conditions are met: 9d43fa8efSStefan Eßer# 10d43fa8efSStefan Eßer# * Redistributions of source code must retain the above copyright notice, this 11d43fa8efSStefan Eßer# list of conditions and the following disclaimer. 12d43fa8efSStefan Eßer# 13d43fa8efSStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice, 14d43fa8efSStefan Eßer# this list of conditions and the following disclaimer in the documentation 15d43fa8efSStefan Eßer# and/or other materials provided with the distribution. 16d43fa8efSStefan Eßer# 17d43fa8efSStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18d43fa8efSStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19d43fa8efSStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20d43fa8efSStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21d43fa8efSStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22d43fa8efSStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23d43fa8efSStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24d43fa8efSStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25d43fa8efSStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26d43fa8efSStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27d43fa8efSStefan Eßer# POSSIBILITY OF SUCH DAMAGE. 28d43fa8efSStefan Eßer# 29d43fa8efSStefan Eßer 30d43fa8efSStefan Eßerscript="$0" 31d43fa8efSStefan Eßertestdir=$(dirname "$script") 32d43fa8efSStefan Eßer 33d43fa8efSStefan Eßer. "$testdir/../scripts/functions.sh" 34d43fa8efSStefan Eßer 35d43fa8efSStefan Eßeroutputdir=${BC_TEST_OUTPUT_DIR:-$testdir} 36d43fa8efSStefan Eßer 374fca8e0fSStefan Eßer# Just print the usage and exit with an error. This can receive a message to 384fca8e0fSStefan Eßer# print. 394fca8e0fSStefan Eßer# @param 1 A message to print. 404fca8e0fSStefan Eßerusage() { 414fca8e0fSStefan Eßer if [ $# -eq 1 ]; then 424fca8e0fSStefan Eßer printf '%s\n\n' "$1" 434fca8e0fSStefan Eßer fi 44d101cdd6SStefan Eßer printf 'usage: %s dir test problematic_tests [exec args...]\n' "$script" 45d43fa8efSStefan Eßer exit 1 464fca8e0fSStefan Eßer} 47d101cdd6SStefan Eßer 484fca8e0fSStefan Eßer# Command-line processing. 494fca8e0fSStefan Eßerif [ "$#" -lt 3 ]; then 504fca8e0fSStefan Eßer usage "Not enough arguments" 51d43fa8efSStefan Eßerelse 52d101cdd6SStefan Eßer 53d43fa8efSStefan Eßer d="$1" 54d43fa8efSStefan Eßer shift 554fca8e0fSStefan Eßer check_d_arg "$d" 56d43fa8efSStefan Eßer 57d43fa8efSStefan Eßer t="$1" 58d43fa8efSStefan Eßer shift 59d101cdd6SStefan Eßer 60d101cdd6SStefan Eßer problematic="$1" 61d101cdd6SStefan Eßer shift 624fca8e0fSStefan Eßer check_bool_arg "$problematic" 63d101cdd6SStefan Eßer 64d43fa8efSStefan Eßerfi 65d43fa8efSStefan Eßer 664fca8e0fSStefan Eßertestfile="$testdir/$d/errors/$t" 674fca8e0fSStefan Eßercheck_file_arg "$testfile" 684fca8e0fSStefan Eßer 69d43fa8efSStefan Eßerif [ "$#" -lt 1 ]; then 70d43fa8efSStefan Eßer exe="$testdir/../bin/$d" 71d43fa8efSStefan Eßerelse 72d43fa8efSStefan Eßer exe="$1" 73d43fa8efSStefan Eßer shift 74d43fa8efSStefan Eßerfi 75d43fa8efSStefan Eßer 76d101cdd6SStefan Eßer# Just skip tests that are problematic on FreeBSD. These tests can cause FreeBSD 77d101cdd6SStefan Eßer# to kill bc from memory exhaustion because of overcommit. 78d101cdd6SStefan Eßerif [ "$d" = "bc" ] && [ "$problematic" -eq 0 ]; then 79d101cdd6SStefan Eßer if [ "$t" = "33.txt" ]; then 80d101cdd6SStefan Eßer printf 'Skipping problematic %s error file %s...\n' "$d" "$t" 81d101cdd6SStefan Eßer exit 0 82d101cdd6SStefan Eßer fi 83d101cdd6SStefan Eßerfi 84d101cdd6SStefan Eßer 85d43fa8efSStefan Eßer# I use these, so unset them to make the tests work. 86d43fa8efSStefan Eßerunset BC_ENV_ARGS 87d43fa8efSStefan Eßerunset BC_LINE_LENGTH 88d43fa8efSStefan Eßerunset DC_ENV_ARGS 89d43fa8efSStefan Eßerunset DC_LINE_LENGTH 90d43fa8efSStefan Eßer 91d43fa8efSStefan Eßerout="$outputdir/${d}_outputs/error_results_${t}" 92d43fa8efSStefan Eßeroutdir=$(dirname "$out") 93d43fa8efSStefan Eßer 94d43fa8efSStefan Eßer# Make sure the directory exists. 95d43fa8efSStefan Eßerif [ ! -d "$outdir" ]; then 96d43fa8efSStefan Eßer mkdir -p "$outdir" 97d43fa8efSStefan Eßerfi 98d43fa8efSStefan Eßer 99d43fa8efSStefan Eßer# Set stuff for the correct calculator. 100d43fa8efSStefan Eßerif [ "$d" = "bc" ]; then 101d43fa8efSStefan Eßer opts="-l" 102d43fa8efSStefan Eßer halt="halt" 103d43fa8efSStefan Eßer read_call="read()" 104d43fa8efSStefan Eßer read_expr="${read_call}\n5+5;" 105d43fa8efSStefan Eßerelse 106d43fa8efSStefan Eßer opts="-x" 107d43fa8efSStefan Eßer halt="q" 108d43fa8efSStefan Eßerfi 109d43fa8efSStefan Eßer 110d101cdd6SStefan Eßerprintf 'Running %s error file %s with clamping...' "$d" "$t" 111d43fa8efSStefan Eßer 112103d7cdfSStefan Eßerprintf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $opts -c "$testfile" 2> "$out" > /dev/null 113d43fa8efSStefan Eßererr="$?" 114d43fa8efSStefan Eßer 115d43fa8efSStefan Eßercheckerrtest "$d" "$err" "$testfile" "$out" "$exebase" > /dev/null 116d43fa8efSStefan Eßer 117d43fa8efSStefan Eßerprintf 'pass\n' 118d43fa8efSStefan Eßer 119d101cdd6SStefan Eßerprintf 'Running %s error file %s without clamping...' "$d" "$t" 120d43fa8efSStefan Eßer 121103d7cdfSStefan Eßerprintf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $opts -C "$testfile" 2> "$out" > /dev/null 122d43fa8efSStefan Eßererr="$?" 123d43fa8efSStefan Eßer 124d101cdd6SStefan Eßercheckerrtest "$d" "$err" "$testfile" "$out" "$exebase" > /dev/null 125d101cdd6SStefan Eßer 126d101cdd6SStefan Eßerprintf 'pass\n' 127d101cdd6SStefan Eßer 128d101cdd6SStefan Eßerprintf 'Running %s error file %s through cat with clamping...' "$d" "$t" 129d101cdd6SStefan Eßer 130103d7cdfSStefan Eßercat "$testfile" 2> /dev/null | "$exe" "$@" $opts -c 2> "$out" > /dev/null 131d101cdd6SStefan Eßererr="$?" 132d101cdd6SStefan Eßer 133d101cdd6SStefan Eßercheckerrtest "$d" "$err" "$testfile" "$out" "$exebase" 134d101cdd6SStefan Eßer 135d101cdd6SStefan Eßerprintf 'pass\n' 136d101cdd6SStefan Eßer 137d101cdd6SStefan Eßerprintf 'Running %s error file %s through cat without clamping...' "$d" "$t" 138d101cdd6SStefan Eßer 139103d7cdfSStefan Eßercat "$testfile" 2> /dev/null | "$exe" "$@" $opts -C 2> "$out" > /dev/null 140d101cdd6SStefan Eßererr="$?" 141d101cdd6SStefan Eßer 142d101cdd6SStefan Eßercheckerrtest "$d" "$err" "$testfile" "$out" "$exebase" 143d43fa8efSStefan Eßer 144d43fa8efSStefan Eßerprintf 'pass\n' 145