Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disable tests that may fail if the codec is not aom #1176

Merged
merged 4 commits into from
Oct 19, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,15 @@ if(AVIF_ENABLE_GTEST)
target_include_directories(avify4mtest PRIVATE ${GTEST_INCLUDE_DIRS})
add_test(NAME avify4mtest COMMAND avify4mtest)

if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE OR NOT AVIF_CODEC_AOM_DECODE)
# These tests are supported with aom being the encoder and decoder. If aom is unavailable,
# these tests are disabled because other codecs may not implement all the necessary features.
# For example, SVT-AV1 requires 4:2:0 images with even dimensions of at least 64x64 px.
set_tests_properties(avifallocationtest avifgridapitest avifmetadatatest avifincrtest PROPERTIES DISABLED True)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Just a comment, no change requested.] Disabling these tests when libaom is not available is a drastic measure. This is appropriate as a simple solution in the v0.11.1 patch release.


message(STATUS "Some tests are disabled because aom is unavailable for encoding or decoding.")
endif()

if(NOT libsharpyuv_FOUND)
message(STATUS "Some tests are skipped because libsharpyuv is unavailable.")
endif()
Expand All @@ -135,4 +144,22 @@ if(AVIF_BUILD_APPS)
add_test(NAME test_cmd COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd.sh ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/data
)
add_test(NAME test_cmd_lossless COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_lossless.sh ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/data
)
add_test(NAME test_cmd_metadata COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_metadata.sh ${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/data
)

if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE)
# Only aom encoder supports lossless encoding.
set_property(TEST test_cmd_lossless PROPERTY DISABLED True)

# SVT-AV1 does not support the images with odd dimensions that are used in this test.
y-guyon marked this conversation as resolved.
Show resolved Hide resolved
if(NOT AVIF_CODEC_RAV1E)
set_property(TEST test_cmd_metadata PROPERTY DISABLED True)
endif()

message(STATUS "Some tests are disabled because aom is unavailable for encoding.")
endif()
endif()
31 changes: 3 additions & 28 deletions tests/test_cmd.sh
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,15 @@ ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/are_images_equal"

# 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
cleanup() {
pushd ${TMP_DIR}
rm -- "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" \
"${ENCODED_FILE_WITH_DASH}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}"
rm -- "${ENCODED_FILE}" "${ENCODED_FILE_WITH_DASH}" "${DECODED_FILE}"
popd
}
trap cleanup EXIT
Expand All @@ -72,33 +67,13 @@ pushd ${TMP_DIR}
"${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}"
"${AVIFENC}" -s 10 "${INPUT_Y4M}" -- "${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
"${AVIFENC}" -s 10 "${INPUT_Y4M}" "${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
72 changes: 72 additions & 0 deletions tests/test_cmd_lossless.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/bin/bash
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------------------------
#
# tests for command lines (lossless)

# 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="$(pwd)/.."
fi
if [[ "$#" -ge 2 ]]; then
TESTDATA_DIR="$(eval echo "$2")"
else
TESTDATA_DIR="$(pwd)/data"
fi
if [[ "$#" -ge 3 ]]; then
TMP_DIR="$(eval echo "$3")"
else
TMP_DIR="$(mktemp -d)"
fi

AVIFENC="${BINARY_DIR}/avifenc"
AVIFDEC="${BINARY_DIR}/avifdec"
ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/are_images_equal"

# Input file paths.
INPUT_Y4M="${TESTDATA_DIR}/kodim03_yuv420_8bpc.y4m"
# Output file names.
ENCODED_FILE="avif_test_cmd_encoded.avif"
DECODED_FILE="avif_test_cmd_decoded.png"
DECODED_FILE_LOSSLESS="avif_test_cmd_decoded_lossless.png"

# Cleanup
cleanup() {
pushd ${TMP_DIR}
rm -- "${ENCODED_FILE}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Just FYI. No change requested.] In these scripts, we should pass -f to the rm command, because some of these files may not exist when the test fails.

popd
}
trap cleanup EXIT

pushd ${TMP_DIR}
# Generate test data.
"${AVIFENC}" -s 8 "${INPUT_Y4M}" -o "${ENCODED_FILE}"
"${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE}"

# 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_Y4M instead of DECODED_FILE.
y-guyon marked this conversation as resolved.
Show resolved Hide resolved
"${AVIFENC}" -s 10 -l "${DECODED_FILE}" -o "${ENCODED_FILE}"
"${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE_LOSSLESS}"
"${ARE_IMAGES_EQUAL}" "${DECODED_FILE}" "${DECODED_FILE_LOSSLESS}" 0
popd

exit 0
72 changes: 72 additions & 0 deletions tests/test_cmd_metadata.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/bin/bash
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------------------------
#
# tests for command lines (metadata)

# 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="$(pwd)/.."
fi
if [[ "$#" -ge 2 ]]; then
TESTDATA_DIR="$(eval echo "$2")"
else
TESTDATA_DIR="$(pwd)/data"
fi
if [[ "$#" -ge 3 ]]; then
TMP_DIR="$(eval echo "$3")"
else
TMP_DIR="$(mktemp -d)"
fi

AVIFENC="${BINARY_DIR}/avifenc"

# Input file paths.
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"

# Cleanup
cleanup() {
pushd ${TMP_DIR}
rm -- "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}"
popd
}
trap cleanup EXIT

pushd ${TMP_DIR}
# Metadata test.
echo "Testing metadata enc"
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