awesome/tests/examples/runner.sh

59 lines
1.3 KiB
Bash
Executable File

#!/bin/sh
# Todo: Give this shell script a sane calling convention. Right now it has a
# file containing the expected output as first argument and just executes
# everything else.
set -ue
# Cleanup on errors / aborting
cleanup() {
rm -rf "$file_stderr" "$file_stdout" || true
}
trap "cleanup" 0 2 3 15
file_stdout=$(mktemp)
file_stderr=$(mktemp)
expected_output=$1
shift
# Run the command that we were given
exit_code=0
"$@" > ${file_stdout} 2> ${file_stderr} || exit_code=$?
# If exit code is not zero or anything was produced on stderr...
if [ $exit_code -ne 0 -o -s "${file_stderr}" ]
then
echo "Result: ${exit_code}"
if [ -s "${file_stdout}" ]
then
echo "Output:"
cat "${file_stdout}"
fi
if [ -s "${file_stderr}" ]
then
echo "Error:"
cat "${file_stderr}"
fi
exit 1
fi
# Automatically add the output for new examples
if [ ! -e "${expected_output}" ]
then
cp "${file_stdout}" "${expected_output}"
fi
# Check if we got the output we wanted
if ! cmp -s "${file_stdout}" "${expected_output}"
then
echo "Expected text from ${expected_output}, but got:"
diff -u "${expected_output}" "${file_stdout}" || true
cp "${file_stdout}" "${expected_output}"
exit 1
fi
exit 0
# vim: filetype=sh:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80