Refactor and trap EXIT in test_cmd.sh
Add a third parameter containing the path to a temporary directory for
build systems that cannot use /tmp.
pushd to that directory for test environments that do not support
creating files in the default run folder. This is necessary for
testing files beginning with a dash '-'.
Rename variables. Sort test categories from common use cases
(lossy/lossless) to specific checks (metadata).
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index b328048..cbd65ef 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -129,6 +129,6 @@
add_executable(are_images_equal gtest/are_images_equal.cc)
target_link_libraries(are_images_equal aviftest_helpers)
add_test(NAME test_cmd COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd.sh ${CMAKE_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/data
+ ${CMAKE_CURRENT_SOURCE_DIR}/data /tmp
)
endif()
diff --git a/tests/test_cmd.sh b/tests/test_cmd.sh
index 7f065d0..1839702 100755
--- a/tests/test_cmd.sh
+++ b/tests/test_cmd.sh
@@ -16,98 +16,89 @@
#
# tests for command lines
+# Very verbose but useful for debugging.
set -ex
if [[ "$#" -ge 1 ]]; then
# eval so that the passed in directory can contain variables.
BINARY_DIR="$(eval echo "$1")"
else
- # assume "tests" is the current directory
- BINARY_DIR=..
+ # Assume "tests" is the current directory.
+ BINARY_DIR="$(pwd)/.."
fi
if [[ "$#" -ge 2 ]]; then
TESTDATA_DIR="$(eval echo "$2")"
else
- TESTDATA_DIR=./data
+ TESTDATA_DIR="$(pwd)/data"
+fi
+if [[ "$#" -ge 3 ]]; then
+ TMP_DIR="$(eval echo "$3")"
+else
+ TMP_DIR=/tmp
fi
AVIFENC="${BINARY_DIR}/avifenc"
AVIFDEC="${BINARY_DIR}/avifdec"
ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/are_images_equal"
-ENCODED_FILE=/tmp/avif_test_cmd_encoded.avif
-ENCODED_FILE_NO_METADATA=/tmp/avif_test_cmd_encoded_no_metadata.avif
-ENCODED_FILE_WITH_DASH=-avif_test_cmd_encoded.avif
-DECODED_FILE=/tmp/avif_test_cmd_decoded.png
-PNG_FILE=/tmp/avif_test_cmd_kodim03.png
-
-# Prepare some extra data.
-set +x
-echo "Generating a color PNG"
-"${AVIFENC}" -s 10 "${TESTDATA_DIR}/kodim03_yuv420_8bpc.y4m" -o "${ENCODED_FILE}" > /dev/null
-"${AVIFDEC}" "${ENCODED_FILE}" "${PNG_FILE}" > /dev/null
-set -x
# Basic calls.
"${AVIFENC}" --version
"${AVIFDEC}" --version
-# Lossless test.
-echo "Testing basic lossless"
-"${AVIFENC}" -s 10 -l "${PNG_FILE}" -o "${ENCODED_FILE}"
-"${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE}"
-"${ARE_IMAGES_EQUAL}" "${PNG_FILE}" "${DECODED_FILE}" 0
-
-# Metadata test.
-echo "Testing metadata enc/dec"
-# PNG.
-"${AVIFENC}" "${TESTDATA_DIR}/paris_icc_exif_xmp.png" -o "${ENCODED_FILE}"
-"${AVIFENC}" "${TESTDATA_DIR}/paris_icc_exif_xmp.png" -o "${ENCODED_FILE_NO_METADATA}" --ignore-icc
-cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
-"${AVIFENC}" "${TESTDATA_DIR}/paris_icc_exif_xmp.png" -o "${ENCODED_FILE_NO_METADATA}" --ignore-exif
-cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
-"${AVIFENC}" "${TESTDATA_DIR}/paris_icc_exif_xmp.png" -o "${ENCODED_FILE_NO_METADATA}" --ignore-xmp
-cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
-# JPEG.
-"${AVIFENC}" "${TESTDATA_DIR}/paris_exif_xmp_icc.jpg" -o "${ENCODED_FILE}"
-"${AVIFENC}" "${TESTDATA_DIR}/paris_exif_xmp_icc.jpg" -o "${ENCODED_FILE_NO_METADATA}" --ignore-icc
-cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
-"${AVIFENC}" "${TESTDATA_DIR}/paris_exif_xmp_icc.jpg" -o "${ENCODED_FILE_NO_METADATA}" --ignore-exif
-cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
-"${AVIFENC}" "${TESTDATA_DIR}/paris_exif_xmp_icc.jpg" -o "${ENCODED_FILE_NO_METADATA}" --ignore-xmp
-cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
-
-# Argument parsing test with filenames starting with a dash.
-"${AVIFENC}" -s 10 "${PNG_FILE}" -- "${ENCODED_FILE_WITH_DASH}"
-"${AVIFDEC}" --info -- "${ENCODED_FILE_WITH_DASH}"
-# Passing a filename starting with a dash without using -- should fail.
-set +e
-"${AVIFENC}" -s 10 "${PNG_FILE}" "${ENCODED_FILE_WITH_DASH}"
-if [[ $? -ne 1 ]]; then
- echo "Argument parsing should fail for avifenc"
- exit 1
-fi
-"${AVIFDEC}" --info "${ENCODED_FILE_WITH_DASH}"
-if [[ $? -ne 1 ]]; then
- echo "Argument parsing should fail for avifdec"
- exit 1
-fi
-set -e
-rm -- "${ENCODED_FILE_WITH_DASH}"
-
-# Test code that should fail.
-set +e
-"${ARE_IMAGES_EQUAL}" "${TESTDATA_DIR}/kodim23_yuv420_8bpc.y4m" "${DECODED_FILE}" 0
-if [[ $? -ne 1 ]]; then
- echo "Image should be different"
-
- # Cleanup
- rm "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" "${DECODED_FILE}" "${PNG_FILE}"
- exit 1
-fi
-
-echo "TEST OK"
+# Input file paths.
+INPUT_Y4M="${TESTDATA_DIR}/kodim03_yuv420_8bpc.y4m"
+INPUT_PNG="${TESTDATA_DIR}/paris_icc_exif_xmp.png"
+INPUT_JPG="${TESTDATA_DIR}/paris_exif_xmp_icc.jpg"
+# Output file names.
+ENCODED_FILE="avif_test_cmd_encoded.avif"
+ENCODED_FILE_NO_METADATA="avif_test_cmd_encoded_no_metadata.avif"
+ENCODED_FILE_WITH_DASH="-avif_test_cmd_encoded.avif"
+DECODED_FILE="avif_test_cmd_decoded.png"
+DECODED_FILE_LOSSLESS="avif_test_cmd_decoded_lossless.png"
# Cleanup
-rm "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" "${DECODED_FILE}" "${PNG_FILE}"
+cleanup() {
+ pushd ${TMP_DIR}
+ rm -- "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" \
+ "${ENCODED_FILE_WITH_DASH}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}"
+ popd
+}
+trap cleanup EXIT
+
+pushd ${TMP_DIR}
+ # Lossy test. The decoded pixels should be different from the original image.
+ echo "Testing basic lossy"
+ "${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}"
+ "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE}"
+ "${ARE_IMAGES_EQUAL}" "${INPUT_Y4M}" "${DECODED_FILE}" 0 && exit 1
+
+ # Lossless test. The decoded pixels should be the same as the original image.
+ echo "Testing basic lossless"
+ # TODO(yguyon): Make this test pass with INPUT_PNG instead of DECODED_FILE.
+ "${AVIFENC}" -s 10 -l "${DECODED_FILE}" -o "${ENCODED_FILE}"
+ "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE_LOSSLESS}"
+ "${ARE_IMAGES_EQUAL}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}" 0
+
+ # Argument parsing test with filenames starting with a dash.
+ echo "Testing arguments"
+ "${AVIFENC}" -s 10 "${INPUT_PNG}" -- "${ENCODED_FILE_WITH_DASH}"
+ "${AVIFDEC}" --info -- "${ENCODED_FILE_WITH_DASH}"
+ # Passing a filename starting with a dash without using -- should fail.
+ "${AVIFENC}" -s 10 "${INPUT_PNG}" "${ENCODED_FILE_WITH_DASH}" && exit 1
+ "${AVIFDEC}" --info "${ENCODED_FILE_WITH_DASH}" && exit 1
+
+ # Metadata test.
+ echo "Testing metadata enc/dec"
+ for INPUT in "${INPUT_PNG}" "${INPUT_JPG}"; do
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE}"
+ # Ignoring a metadata chunk should produce a different output file.
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-icc
+ cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-exif
+ cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
+ "${AVIFENC}" "${INPUT}" -o "${ENCODED_FILE_NO_METADATA}" --ignore-xmp
+ cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
+ done
+popd
exit 0