xref: /freebsd-src/contrib/bc/tests/error.sh (revision a970610a3af63b3f4df5b69d91c6b4093a00ed8f)
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