summaryrefslogtreecommitdiff
path: root/Build/source/libs/libpng/libpng-src/tests/pngtest-all
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/libpng/libpng-src/tests/pngtest-all')
-rw-r--r--Build/source/libs/libpng/libpng-src/tests/pngtest-all99
1 files changed, 88 insertions, 11 deletions
diff --git a/Build/source/libs/libpng/libpng-src/tests/pngtest-all b/Build/source/libs/libpng/libpng-src/tests/pngtest-all
index 5e96451d373..7a9b64ae672 100644
--- a/Build/source/libs/libpng/libpng-src/tests/pngtest-all
+++ b/Build/source/libs/libpng/libpng-src/tests/pngtest-all
@@ -1,16 +1,93 @@
#!/bin/sh
-# normal execution
+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 $* ===================="
+}
-./pngtest --strict ${srcdir}/pngtest.png
+# The "standard" test
+TEST --strict "${srcdir}"/pngtest.png
-# various crashers
-# using --relaxed because some come from fuzzers that don't maintain CRC's
+# 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
-./pngtest --relaxed ${srcdir}/contrib/testpngs/crashers/badcrc.png
-./pngtest --relaxed ${srcdir}/contrib/testpngs/crashers/badadler.png
-./pngtest --xfail ${srcdir}/contrib/testpngs/crashers/bad_iCCP.png
-./pngtest --xfail ${srcdir}/contrib/testpngs/crashers/empty_ancillary_chunks.png
-./pngtest --xfail ${srcdir}/contrib/testpngs/crashers/huge_*_chunk.png \
- ${srcdir}/contrib/testpngs/crashers/huge_*safe_to_copy.png
-./pngtest --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=
+ 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