Files
bison/examples/test
Akim Demaille 6135fdc152 examples: beware of portability issues with sh's trap
On AIX 7.2, when invoking "exit 77", we actually exit with 127.  The
"cleanup" function, called via trap, received an incorrect exit
status, something described in Autoconf's doc.
Reported by Bruno Haible.
https://lists.gnu.org/archive/html/bug-bison/2020-05/msg00029.html
https://lists.gnu.org/archive/html/bug-bison/2020-05/msg00047.html

* examples/test (skip): New.
* examples/c/bistromathic/bistromathic.test,
* examples/c/reccalc/reccalc.test: Use it, to ensure $? is set to 77
when the trap is called.
2020-05-04 06:48:00 +02:00

161 lines
3.5 KiB
Bash
Executable File

#! /bin/sh
# Copyright (C) 2005-2015, 2018-2020 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
SHELL=/bin/sh
export SHELL
me=$(basename "$1" .test)
medir=$(dirname "$1" | sed -e 's,.*examples/,,')
# Number of the current test.
number=1
# Exit status of this script.
exit=true
# top_builddir.
cwd=$(pwd)
# Whether to strip '> ...' lines from the expected output.
# See bistromathic.test.
strip_prompt=false
# The exercised program.
abs_medir=$cwd/examples/$medir
if test -x "$abs_medir/$me"; then
prog ()
{
"$abs_medir/$me" "$@"
}
elif test -f "$abs_medir/$me.class"; then
prog ()
{
"$SHELL" "$cwd/javaexec.sh" -cp "$abs_medir" "$me" "$@"
}
else
echo "$me: ERROR: cannot find program to exercise in:"
echo "$me: ERROR: $cwd/examples/$medir/$me"
exit 1
fi
# cleanup
# -------
cleanup ()
{
status=$?
if test -z "$DEBUG"; then
cd "$cwd"
rm -rf $$.dir
fi
exit $status
}
trap cleanup 0 1 2 13 15
mkdir $$.dir
cd $$.dir
# skip [MSG]
# ----------
# Skip this test.
skip ()
{
if test x"$1" != x; then
echo "SKIP: $1"
fi
# See Autoconf's doc on 'trap'.
(exit 77); exit 77
}
# run [-noerr, -n] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
# ----------------------------------------------------------------------
# -noerr: ignore stderr, otherwise merge it into effective output.
# -n: not final end-of-line in expected-output
run ()
{
noerr=false
echo=echo
while true; do
case $1 in
(-noerr) noerr=true; shift;;
(-n) echo=printf; shift;;
(*) break;;
esac
done
# Expected exit status.
sta_exp=$1
shift
# Expected output.
$echo "$1" |
sed -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' |
if $strip_prompt; then
# An extra EOL added in bistromathic's main. Keep that empty line.
sed -e '/^> ./d;s/^> $//g'
else
cat
fi >exp
shift
# Effective exit status.
sta_eff=0
prog "$@" - <input >out_eff 2>err_eff || sta_eff=$?
# Combine effective output and error streams.
{
cat out_eff
if ! $noerr; then
sed -e 's/^/err: /g' \
-e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' \
err_eff
fi
} >eff
if test $sta_eff -eq $sta_exp; then
if diff eff exp >/dev/null 2>&1; then
echo "$me: PASS: $number"
else
echo "$me: FAIL: $number"
echo "$me: input:"
sed -e 's/^/ /' input
echo "$me: expected output:"
sed -e 's/^/ /' exp
echo "$me: effective output:"
sed -e 's/^/ /' eff
echo "$me: diff:"
diff -u exp eff | sed -e 's/^/ /'
exit=false
fi
else
echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)"
cat err_eff
exit=false
fi
number=$(expr $number + 1)
}
# We have cd'd one level deeper.
case $1 in
/*) . "$1";;
*) . "../$1";;
esac
$exit