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