#!/bin/sh st=0 # exit status (set to 1 if a test fails) fail="**FAIL**" success=" SUCCESS" TEST(){ # Try to make the log file easier to read: test_status="$success" echo "=============== PNGTEST $* ====================" ./pngtest "$@" || { st=$? test_status="$fail" } echo "===============$test_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 however the MSYS2 shell # expects (\n) terminated lines so the ends up in the shell # variable 'line' below. The pattern matching ignores this because of the # '*' at the end of the pattern match. found= while read line do case "$line" in *"$2"*) found=1;; esac echo "$line" # preserve the original output verbatim done # output the missing warning on descriptor 3: test -z "$found" && 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" | 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=$? exit $st