Support multi-config in test_cmd* (#2781)
diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index f5d31b6..404fc98 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml
@@ -36,6 +36,7 @@ fail-fast: false matrix: os: [windows-latest] + generator: [Ninja, "Visual Studio 17 2022"] steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -58,7 +59,7 @@ - name: Prepare libavif (cmake) run: > - cmake -G Ninja -S . -B build + cmake -G "${{ matrix.generator }}" -S . -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=LOCAL -DAVIF_CODEC_DAV1D=LOCAL -DAVIF_CODEC_RAV1E=LOCAL -DAVIF_CODEC_SVT=LOCAL @@ -75,7 +76,15 @@ run: cmake --build build --config Release --parallel 4 - name: Run AVIF Tests working-directory: ./build - run: ctest -j $Env:NUMBER_OF_PROCESSORS --output-on-failure + run: ctest -C Release -j $Env:NUMBER_OF_PROCESSORS --output-on-failure + - name: Set the config folder for Ninja + if: ${{ matrix.generator == 'Ninja' }} + run: + echo "CONFIG_DIR=" >> $env:GITHUB_ENV + - name: Set the config folder for multi-config MSVC + if: ${{ matrix.generator != 'Ninja' }} + run: + echo "CONFIG_DIR=Release\" >> $env:GITHUB_ENV - name: Check static link bundling run: > cl .\apps\avifenc.c .\apps\shared\*.c .\third_party\iccjpeg\iccjpeg.c /nologo @@ -89,10 +98,10 @@ -external:I.\build\_deps\libpng -external:I.\build\_deps\zlib /link - build\libjpeg\src\libjpeg-build\jpeg-static.lib - build\_deps\libpng\libpng16_static.lib - build\_deps\zlib\zlibstatic.lib - build\avif.lib + build\libjpeg\src\libjpeg-build\${env:CONFIG_DIR}jpeg-static.lib + build\_deps\libpng\${env:CONFIG_DIR}libpng16_static.lib + build\_deps\zlib\${env:CONFIG_DIR}zlibstatic.lib + build\${env:CONFIG_DIR}avif.lib ws2_32.lib ntdll.lib userenv.lib bcrypt.lib advapi32.lib /out:avifenc.exe
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6d4b40d..c15df73 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt
@@ -221,6 +221,20 @@ ################################################################################ # Bash tests +# Macro to add a shell test. It takes multi-config generators into account. +# The first argument is the name of the shell script, without .sh. +# The following arguments are sent to the script. +macro(add_cmd_test SHELL_SCRIPT) + get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(${IS_MULTI_CONFIG}) + add_test(NAME ${SHELL_SCRIPT} COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/${SHELL_SCRIPT}.sh $<CONFIG> ${CMAKE_BINARY_DIR} + ${ARGN} + ) + else() + add_test(NAME ${SHELL_SCRIPT} COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/${SHELL_SCRIPT}.sh "" ${CMAKE_BINARY_DIR} ${ARGN}) + endif() +endmacro() + if(AVIF_BUILD_APPS) # When building apps, test the avifenc/avifdec. # 'are_images_equal' is used to make sure inputs/outputs are unchanged. @@ -233,38 +247,18 @@ endif() endif() target_link_libraries(are_images_equal aviftest_helpers avif_enable_warnings) - 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_animation COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_animation.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) - add_test(NAME test_cmd_grid COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_grid.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) - add_test(NAME test_cmd_icc_profile COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_icc_profile.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 - ) - add_test(NAME test_cmd_progressive COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_progressive.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) - add_test(NAME test_cmd_stdin COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_stdin.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) - add_test(NAME test_cmd_targetsize COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_targetsize.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) + add_cmd_test(test_cmd ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_animation ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_grid ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_icc_profile ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_lossless ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_metadata ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_progressive ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_stdin ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_targetsize ${CMAKE_CURRENT_SOURCE_DIR}/data) if(AVIF_ENABLE_JPEG_GAIN_MAP_CONVERSION) - add_test(NAME test_cmd_avifgainmaputil COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_avifgainmaputil.sh - ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/data - ) + add_cmd_test(test_cmd_avifgainmaputil ${CMAKE_CURRENT_SOURCE_DIR}/data) endif() if(AVIF_ENABLE_GOLDEN_TESTS AND AVIF_CODEC_AOM_ENCODE) @@ -277,19 +271,13 @@ set(GOLDEN_TESTS_OUTPUT_DIR "" CACHE STRING "Output path for golden tests (will be a temp dir if empty)") - add_test(NAME test_cmd_enc_boxes_golden - COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_enc_boxes_golden.sh ${CMAKE_BINARY_DIR} ${MP4BOX_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data ${GOLDEN_TESTS_OUTPUT_DIR} - ) + add_cmd_test(test_cmd_enc_boxes_golden ${MP4BOX_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/data ${GOLDEN_TESTS_OUTPUT_DIR}) if(AVIF_ENABLE_JPEG_GAIN_MAP_CONVERSION) - add_test(NAME test_cmd_gainmap COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_gainmap.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) + add_cmd_test(test_cmd_gainmap ${CMAKE_CURRENT_SOURCE_DIR}/data) - add_test(NAME test_cmd_enc_gainmap_boxes_golden - COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_enc_gainmap_boxes_golden.sh ${CMAKE_BINARY_DIR} - ${MP4BOX_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/data ${GOLDEN_TESTS_OUTPUT_DIR} + add_cmd_test( + test_cmd_enc_gainmap_boxes_golden ${MP4BOX_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/data ${GOLDEN_TESTS_OUTPUT_DIR} ) endif() endif() @@ -325,12 +313,8 @@ endif() if(AVIF_BUILD_APPS) - add_test(NAME test_cmd_avm COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_avm.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) - add_test(NAME test_cmd_avm_lossless COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_avm_lossless.sh ${CMAKE_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/data - ) + add_cmd_test(test_cmd_avm ${CMAKE_CURRENT_SOURCE_DIR}/data) + add_cmd_test(test_cmd_avm_lossless ${CMAKE_CURRENT_SOURCE_DIR}/data) endif() # AV2 support is experimental and only available when avm is explicitly specified as the encoder.
diff --git a/tests/cmd_test_common.sh b/tests/cmd_test_common.sh index 81bd3f4..18b5ca7 100644 --- a/tests/cmd_test_common.sh +++ b/tests/cmd_test_common.sh
@@ -20,24 +20,33 @@ # Very verbose but useful for debugging. set -eux -if [[ "$#" -ge 1 ]]; then +# The CMake config must always be passed. It can be empty if there is +# no multi-config generator. +CONFIG="$1" +if [[ "$#" -ge 2 ]]; then # eval so that the passed in directory can contain variables. - BINARY_DIR="$(eval echo "$1")" + BINARY_DIR="$(eval echo "$2")" else # Assume "tests" is the current directory. BINARY_DIR="$(pwd)/.." fi -if [[ "$#" -ge 2 ]]; then - TESTDATA_DIR="$(eval echo "$2")" +if [[ "$#" -ge 3 ]]; then + TESTDATA_DIR="$(eval echo "$3")" else TESTDATA_DIR="$(pwd)/data" fi -if [[ "$#" -ge 3 ]]; then - TMP_DIR="$(eval echo "$3")" +if [[ "$#" -ge 4 ]]; then + TMP_DIR="$(eval echo "$4")" else TMP_DIR="$(mktemp -d)" fi -AVIFENC="${BINARY_DIR}/avifenc" -AVIFDEC="${BINARY_DIR}/avifdec" -ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/are_images_equal" +if [[ ! -z "$CONFIG" ]]; then + AVIFENC="${BINARY_DIR}/${CONFIG}/avifenc" + AVIFDEC="${BINARY_DIR}/${CONFIG}/avifdec" + ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/${CONFIG}/are_images_equal" +else + AVIFENC="${BINARY_DIR}/avifenc" + AVIFDEC="${BINARY_DIR}/avifdec" + ARE_IMAGES_EQUAL="${BINARY_DIR}/tests/are_images_equal" +fi
diff --git a/tests/golden_test_common.sh b/tests/golden_test_common.sh index ec58223..e17e8d7 100755 --- a/tests/golden_test_common.sh +++ b/tests/golden_test_common.sh
@@ -13,33 +13,36 @@ set -eu -if [[ "$#" -ge 1 ]]; then - # eval so that the passed in directory can contain variables. - ENCODER_DIR="$(eval echo "$1")" -else - # Assume "tests" is the current directory. - ENCODER_DIR="$(pwd)/.." -fi +# The CMake config must always be passed. It can be empty if there is +# no multi-config. +CONFIG="$1" if [[ "$#" -ge 2 ]]; then # eval so that the passed in directory can contain variables. - MP4BOX_DIR="$(eval echo "$2")" + BINARY_DIR="$(eval echo "$2")" +else + # Assume "tests" is the current directory. + BINARY_DIR="$(pwd)/.." +fi +if [[ "$#" -ge 3 ]]; then + # eval so that the passed in directory can contain variables. + MP4BOX_DIR="$(eval echo "$3")" else # Assume "tests" is the current directory. MP4BOX_DIR="$(pwd)/../ext/gpac/bin/gcc" fi -if [[ "$#" -ge 3 ]]; then - TESTDATA_DIR="$(eval echo "$3")" +if [[ "$#" -ge 4 ]]; then + TESTDATA_DIR="$(eval echo "$4")" else TESTDATA_DIR="$(pwd)/data" fi -if [[ "$#" -ge 4 && ! -z "$4" ]]; then - OUTPUT_DIR="$(eval echo "$4")/test_cmd_enc_boxes_golden" +if [[ "$#" -ge 5 && ! -z "$5" ]]; then + OUTPUT_DIR="$(eval echo "$5")/test_cmd_enc_boxes_golden" else OUTPUT_DIR="$(mktemp -d)" fi GOLDEN_DIR="${TESTDATA_DIR}/goldens" -AVIFENC="${ENCODER_DIR}/avifenc" +AVIFENC="${BINARY_DIR}/${CONFIG}/avifenc" MP4BOX="${MP4BOX_DIR}/MP4Box" # Colors for pretty formatting.
diff --git a/tests/test_cmd_avifgainmaputil.sh b/tests/test_cmd_avifgainmaputil.sh index f9eb906..22fb2db 100755 --- a/tests/test_cmd_avifgainmaputil.sh +++ b/tests/test_cmd_avifgainmaputil.sh
@@ -6,7 +6,11 @@ source $(dirname "$0")/cmd_test_common.sh || exit -AVIFGAINMAPUTIL="${BINARY_DIR}/avifgainmaputil" +if [[ ! -z "$CONFIG" ]]; then + AVIFGAINMAPUTIL="${BINARY_DIR}/${CONFIG}/avifgainmaputil" +else + AVIFGAINMAPUTIL="${BINARY_DIR}/avifgainmaputil" +fi # Input file paths. INPUT_AVIF_GAINMAP_SDR="${TESTDATA_DIR}/seine_sdr_gainmap_srgb.avif"
diff --git a/tests/test_cmd_targetsize.sh b/tests/test_cmd_targetsize.sh index 47f5297..779ec3a 100755 --- a/tests/test_cmd_targetsize.sh +++ b/tests/test_cmd_targetsize.sh
@@ -18,9 +18,6 @@ source $(dirname "$0")/cmd_test_common.sh || exit -AVIFENC="${BINARY_DIR}/avifenc" -AVIFDEC="${BINARY_DIR}/avifdec" - # Input file paths. INPUT_Y4M="${TESTDATA_DIR}/kodim03_yuv420_8bpc.y4m" # Output file names.