blob: b4280f5ffc18aee9ff710fd0436d676b51e805c4 [file] [log] [blame]
#!/bin/sh
st=0 # exit status (set to 1 if a test fails)
skipped=
fail="**FAIL**"
skip="**SKIP**"
success=" SUCCESS"
TEST(){
# Try to make the log file easier to read:
echo "=============== pngtest $* ===================="
./pngtest "$@"
status=$?
case "$status" in
0) test_status="$success";;
77) test_status="$skip"
skipped=1;;
*) test_status="$fail"
st="$status";;
esac
echo "===============$test_status $* ===================="
return "$status"
}
# The "standard" test
TEST --strict "${srcdir}"/pngtest.png
# Various crashers
# Use --relaxed because some come from fuzzers that don't maintain CRCs
TEST --relaxed "${srcdir}"/contrib/testpngs/crashers/badcrc.png
# Use --xfail because there is no reliable way of disabling these errors
# (Adler32 checking cannot be switched off on all builds and there is no
# provision for turning the other checks into warnings.)
TEST --xfail "${srcdir}"/contrib/testpngs/crashers/badadler.png
TEST --xfail "${srcdir}"/contrib/testpngs/crashers/bad_iCCP.png
TEST --xfail "${srcdir}"/contrib/testpngs/crashers/empty_ancillary_chunks.png
for file in "${srcdir}"/contrib/testpngs/crashers/huge_*_chunk.png
do
TEST --xfail "$file"
done
for file in "${srcdir}"/contrib/testpngs/crashers/huge_*safe_to_copy.png
do
TEST --xfail "$file"
done
TEST --xfail "${srcdir}"/contrib/testpngs/crashers/huge_IDAT.png
# Regression tests for required warnings (or errors):
check_stdout(){
# $1: the test file (a bad PNG which must produce a warning, etc)
# $2: a string which must occur at the end of line on stdout for success
# result: an error message on descriptor 3 if the string is NOT found
#
# WARNING: when this script is executed on MSYS2 (Windows Cygwin variant)
# pngtest outputs lines terminated with <cr><lf> however the MSYS2 shell
# expects <lf> (\n) terminated lines so the <cr> ends up in the shell
# variable 'line' below. The pattern matching ignores this because of the
# '*' at the end of the pattern match.
found=
skipped=
while read line
do
case "$line" in
*"$2"*) found=1;;
*"TEST SKIPPED"*) skipped=1;;
esac
echo "$line" # preserve the original output verbatim
done
# output the missing warning on descriptor 3:
test -z "$found" -a -z "$skipped" && echo "$1: $2" >&3
}
# NOTE: traditionally the Bourne shell executed the last element in a pipe
# sequence in the original shell so it could set variables in the original
# shell however this is not reliable and doesn't work in bash.
#
# It *is* reliable to use the actual exit status of the last command in
# the pipeline.
exec 4>&1 # original stdout - the log file
{
exec 3>&1 # stdout is the pipe at this point
fail=" FAIL(EXPECTED)" # runtime scope
success=" SUCCESS(UNEXPECTED)" # there should be a write error
for file in "${srcdir}"/contrib/testpngs/badpal/*.png
do
# The exit code is ignored here, the test is that the particular errors
# (warnings) are produced. The original output still ends up in the log
# file.
{
TEST "$file"
test "$?" -eq 77 && echo "TEST SKIPPED"
} |
check_stdout "$file" 'IDAT: Read palette index exceeding num_palette' |
check_stdout "$file" 'Wrote palette index exceeding num_palette' >&4
done
exec 3>&-
} | {
# This may not be a sub-shell, if it is 'st' is undefined and the exit
# just ends up as 'exit'.
while read error
do
echo "MISSING REPORT: $error"
st=1
done
exit $st
} || st=$?
test "$st" -gt 0 && exit "$st"
test -n "$skipped" && exit 77
exit 0