blob: 247ed7a27c2dad895fc946dd59dc9dab92333fa6 [file] [log] [blame]
Yannis Guyon8d614692022-04-01 17:44:40 +00001# Copyright 2022 Joe Drago. All rights reserved.
2# SPDX-License-Identifier: BSD-2-Clause
3
4# With testing enabled, all targets referenced by add_test() can be run
5# at once with CMake's ctest command line tool from the build folder.
6enable_testing()
Yannis Guyon8d614692022-04-01 17:44:40 +00007
Yannis Guyon2b91ce62022-06-21 11:51:46 +02008################################################################################
Yannis Guyon440af442022-06-22 10:42:52 +02009# C tests and tools
Yannis Guyon2b91ce62022-06-21 11:51:46 +020010
Yannis Guyon8d614692022-04-01 17:44:40 +000011add_executable(aviftest aviftest.c)
12if(AVIF_LOCAL_LIBGAV1)
13 set_target_properties(aviftest PROPERTIES LINKER_LANGUAGE "CXX")
14endif()
15target_link_libraries(aviftest avif ${AVIF_PLATFORM_LIBRARIES})
Yannis Guyon2d271dd2022-05-13 12:27:06 +020016add_test(NAME aviftest COMMAND aviftest ${CMAKE_CURRENT_SOURCE_DIR}/data)
Yannis Guyon8d614692022-04-01 17:44:40 +000017
Yannis Guyon440af442022-06-22 10:42:52 +020018if(AVIF_ENABLE_COVERAGE)
19 add_custom_target(
20 avif_coverage
21 COMMAND ${CMAKE_COMMAND} -E env "LLVM_PROFILE_FILE=${CMAKE_CURRENT_BINARY_DIR}/aviftest.profraw" $<TARGET_FILE:aviftest>
22 ${CMAKE_CURRENT_SOURCE_DIR}/data
23 COMMAND ${XCRUN} llvm-profdata merge -sparse ${CMAKE_CURRENT_BINARY_DIR}/aviftest.profraw -o
24 ${CMAKE_CURRENT_BINARY_DIR}/aviftest.profdata
25 COMMAND cmake -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/coverage
26 COMMAND ${XCRUN} llvm-cov show $<TARGET_FILE:aviftest> -instr-profile=${CMAKE_CURRENT_BINARY_DIR}/aviftest.profdata
27 -project-title=libavif --format html -output-dir=${CMAKE_CURRENT_BINARY_DIR}/coverage
28 COMMAND echo Coverage report here: ${CMAKE_CURRENT_BINARY_DIR}/coverage/index.html
29 DEPENDS aviftest
30 )
31endif()
32
Yannis Guyon8d614692022-04-01 17:44:40 +000033add_executable(avifyuv avifyuv.c)
34if(AVIF_LOCAL_LIBGAV1)
35 set_target_properties(avifyuv PROPERTIES LINKER_LANGUAGE "CXX")
36endif()
37target_link_libraries(avifyuv avif ${AVIF_PLATFORM_LIBRARIES})
Yannis Guyon8efe1a82022-05-16 11:48:01 +020038foreach(AVIFYUV_MODE limited rgb) # Modes drift and premultiply take more than 2 minutes each so they are disabled.
Yannis Guyon2d271dd2022-05-13 12:27:06 +020039 add_test(NAME avifyuv_${AVIFYUV_MODE} COMMAND avifyuv -m ${AVIFYUV_MODE})
40endforeach()
Yannis Guyon8d614692022-04-01 17:44:40 +000041
Wan-Teh Change2797072022-11-11 14:08:33 -080042if(AVIF_ENABLE_GTEST OR AVIF_BUILD_APPS)
Yannis Guyon44b086a2022-05-18 10:47:52 +020043 enable_language(CXX)
44 set(CMAKE_CXX_STANDARD 11)
Vincent Rabaudf2e4b1a2022-07-15 04:51:01 +020045 add_library(aviftest_helpers OBJECT gtest/aviftest_helpers.cc)
Yannis Guyon6624e762022-09-09 18:01:49 +020046 target_link_libraries(aviftest_helpers avif_apps)
Wan-Teh Change2797072022-11-11 14:08:33 -080047endif()
Vincent Rabaudf2e4b1a2022-07-15 04:51:01 +020048
Wan-Teh Change2797072022-11-11 14:08:33 -080049################################################################################
50# GoogleTest
51
52if(AVIF_ENABLE_GTEST)
Yannis Guyon44b086a2022-05-18 10:47:52 +020053 if(AVIF_LOCAL_GTEST)
54 set(GTEST_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/ext/googletest/googletest/include)
Yannis Guyon60c90a22022-11-08 13:32:04 +010055 set(GTEST_LIBRARIES ${CMAKE_SOURCE_DIR}/ext/googletest/build/lib/${AVIF_LIBRARY_PREFIX}gtest${AVIF_LIBRARY_SUFFIX})
Wan-Teh Chang393f8f52022-09-06 19:11:03 -070056 set(GTEST_MAIN_LIBRARIES
Yannis Guyonb4515212022-10-20 21:16:27 +020057 ${CMAKE_SOURCE_DIR}/ext/googletest/build/lib/${AVIF_LIBRARY_PREFIX}gtest_main${AVIF_LIBRARY_SUFFIX}
Wan-Teh Chang393f8f52022-09-06 19:11:03 -070058 )
Yannis Guyon44b086a2022-05-18 10:47:52 +020059 set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
60 if(NOT EXISTS ${GTEST_INCLUDE_DIRS}/gtest/gtest.h)
61 message(FATAL_ERROR "googletest(AVIF_LOCAL_GTEST): ${GTEST_INCLUDE_DIRS}/gtest/gtest.h is missing, bailing out")
62 elseif(NOT EXISTS ${GTEST_LIBRARIES})
63 message(FATAL_ERROR "googletest(AVIF_LOCAL_GTEST): ${GTEST_LIBRARIES} is missing, bailing out")
64 elseif(NOT EXISTS ${GTEST_MAIN_LIBRARIES})
65 message(FATAL_ERROR "googletest(AVIF_LOCAL_GTEST): ${GTEST_MAIN_LIBRARIES} is missing, bailing out")
66 else()
67 message(STATUS "Found local ext/googletest")
68 endif()
69 else()
70 find_package(GTest REQUIRED)
71 endif()
72
Yannis Guyon1ce971e2022-08-01 20:22:04 +020073 add_executable(avifallocationtest gtest/avifallocationtest.cc)
74 target_link_libraries(avifallocationtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
75 target_include_directories(avifallocationtest PRIVATE ${GTEST_INCLUDE_DIRS})
76 add_test(NAME avifallocationtest COMMAND avifallocationtest)
77
Yannis Guyon154da762022-12-13 13:21:39 +010078 add_executable(avifalphapremtest gtest/avifalphapremtest.cc)
79 target_link_libraries(avifalphapremtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
80 target_include_directories(avifalphapremtest PRIVATE ${GTEST_INCLUDE_DIRS})
81 add_test(NAME avifalphapremtest COMMAND avifalphapremtest)
82
Wan-Teh Chang05c6e072022-08-19 11:30:59 -070083 add_executable(avifchangesettingtest gtest/avifchangesettingtest.cc)
84 target_link_libraries(avifchangesettingtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
85 target_include_directories(avifchangesettingtest PRIVATE ${GTEST_INCLUDE_DIRS})
86 add_test(NAME avifchangesettingtest COMMAND avifchangesettingtest)
87
Yannis Guyonab691e02022-12-09 14:41:29 +010088 add_executable(avifcllitest gtest/avifcllitest.cc)
89 target_link_libraries(avifcllitest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
90 target_include_directories(avifcllitest PRIVATE ${GTEST_INCLUDE_DIRS})
91 add_test(NAME avifcllitest COMMAND avifcllitest)
92
Yannis Guyon440af442022-06-22 10:42:52 +020093 add_executable(avifgridapitest gtest/avifgridapitest.cc)
Yannis Guyond0825042022-06-21 17:59:38 +020094 target_link_libraries(avifgridapitest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
Yannis Guyon44b086a2022-05-18 10:47:52 +020095 target_include_directories(avifgridapitest PRIVATE ${GTEST_INCLUDE_DIRS})
96 add_test(NAME avifgridapitest COMMAND avifgridapitest)
97
Yannis Guyon98dd5eb2022-06-30 13:33:18 +020098 add_library(avifincrtest_helpers OBJECT gtest/avifincrtest_helpers.cc)
99 target_link_libraries(avifincrtest_helpers avif ${AVIF_PLATFORM_LIBRARIES} ${GTEST_LIBRARIES})
100 target_include_directories(avifincrtest_helpers PUBLIC ${GTEST_INCLUDE_DIRS})
101
102 add_executable(avifincrtest gtest/avifincrtest.cc)
103 target_link_libraries(avifincrtest aviftest_helpers avifincrtest_helpers)
Yannis Guyon6624e762022-09-09 18:01:49 +0200104 add_test(NAME avifincrtest COMMAND avifincrtest ${CMAKE_CURRENT_SOURCE_DIR}/data/)
Yannis Guyon98dd5eb2022-06-30 13:33:18 +0200105
Yannis Guyon633af6c2022-06-23 17:55:07 +0200106 add_executable(avifmetadatatest gtest/avifmetadatatest.cc)
Yannis Guyon6624e762022-09-09 18:01:49 +0200107 target_link_libraries(avifmetadatatest aviftest_helpers ${GTEST_LIBRARIES})
Yannis Guyon633af6c2022-06-23 17:55:07 +0200108 target_include_directories(avifmetadatatest PRIVATE ${GTEST_INCLUDE_DIRS})
Yannis Guyon6624e762022-09-09 18:01:49 +0200109 add_test(NAME avifmetadatatest COMMAND avifmetadatatest ${CMAKE_CURRENT_SOURCE_DIR}/data/)
Yannis Guyon633af6c2022-06-23 17:55:07 +0200110
Yannis Guyonbfb84ad2022-12-08 18:36:34 +0100111 add_executable(avifopaquetest gtest/avifopaquetest.cc)
112 target_link_libraries(avifopaquetest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
113 target_include_directories(avifopaquetest PRIVATE ${GTEST_INCLUDE_DIRS})
114 add_test(NAME avifopaquetest COMMAND avifopaquetest)
115
Yannis Guyon93035c12022-12-16 11:49:59 +0100116 add_executable(avifpng16bittest gtest/avifpng16bittest.cc)
117 target_link_libraries(avifpng16bittest aviftest_helpers ${GTEST_LIBRARIES})
118 target_include_directories(avifpng16bittest PRIVATE ${GTEST_INCLUDE_DIRS})
119 add_test(NAME avifpng16bittest COMMAND avifpng16bittest ${CMAKE_CURRENT_SOURCE_DIR}/data/)
120
121 add_executable(avifreadimagetest gtest/avifreadimagetest.cc)
122 target_link_libraries(avifreadimagetest aviftest_helpers ${GTEST_LIBRARIES})
123 target_include_directories(avifreadimagetest PRIVATE ${GTEST_INCLUDE_DIRS})
124 add_test(NAME avifreadimagetest COMMAND avifreadimagetest ${CMAKE_CURRENT_SOURCE_DIR}/data/)
125
Yannis Guyon5a607922022-07-07 14:28:54 +0200126 add_executable(avifrgbtoyuvtest gtest/avifrgbtoyuvtest.cc)
127 target_link_libraries(avifrgbtoyuvtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
128 target_include_directories(avifrgbtoyuvtest PRIVATE ${GTEST_INCLUDE_DIRS})
129 add_test(NAME avifrgbtoyuvtest COMMAND avifrgbtoyuvtest)
130
Yannis Guyon69719852022-10-24 10:24:03 +0200131 add_executable(aviftilingtest gtest/aviftilingtest.cc)
132 target_link_libraries(aviftilingtest avif_internal ${GTEST_BOTH_LIBRARIES})
133 target_include_directories(aviftilingtest PRIVATE ${GTEST_INCLUDE_DIRS})
134 add_test(NAME aviftilingtest COMMAND aviftilingtest)
Wan-Teh Changff322862022-09-08 09:26:28 -0700135
Yannis Guyon440af442022-06-22 10:42:52 +0200136 add_executable(avify4mtest gtest/avify4mtest.cc)
Yannis Guyon6624e762022-09-09 18:01:49 +0200137 target_link_libraries(avify4mtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
Yannis Guyon44b086a2022-05-18 10:47:52 +0200138 target_include_directories(avify4mtest PRIVATE ${GTEST_INCLUDE_DIRS})
139 add_test(NAME avify4mtest COMMAND avify4mtest)
Yannis Guyon7e706442022-10-17 23:50:27 +0200140
Yannis Guyonb9366f02022-10-19 03:23:27 +0200141 if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE OR NOT AVIF_CODEC_AOM_DECODE)
142 # These tests are supported with aom being the encoder and decoder. If aom is unavailable,
143 # these tests are disabled because other codecs may not implement all the necessary features.
144 # For example, SVT-AV1 requires 4:2:0 images with even dimensions of at least 64x64 px.
145 set_tests_properties(avifallocationtest avifgridapitest avifmetadatatest avifincrtest PROPERTIES DISABLED True)
146
147 message(STATUS "Some tests are disabled because aom is unavailable for encoding or decoding.")
148 endif()
149
Yannis Guyon7e706442022-10-17 23:50:27 +0200150 if(NOT libsharpyuv_FOUND)
151 message(STATUS "Some tests are skipped because libsharpyuv is unavailable.")
152 endif()
Yannis Guyon44b086a2022-05-18 10:47:52 +0200153else()
154 message(STATUS "Most tests are disabled because AVIF_ENABLE_GTEST is OFF.")
155endif()
Vincent Rabaudf2e4b1a2022-07-15 04:51:01 +0200156
157################################################################################
158# Bash tests
159
160if(AVIF_BUILD_APPS)
161 # When building apps, test the avifenc/avifdec.
162 # 'are_images_equal' is used to make sure inputs/outputs are unchanged.
163 add_executable(are_images_equal gtest/are_images_equal.cc)
Yannis Guyon6624e762022-09-09 18:01:49 +0200164 target_link_libraries(are_images_equal aviftest_helpers)
Wan-Teh Chang393f8f52022-09-06 19:11:03 -0700165 add_test(NAME test_cmd COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd.sh ${CMAKE_BINARY_DIR}
Yannis Guyon2709e752022-09-14 11:27:21 +0200166 ${CMAKE_CURRENT_SOURCE_DIR}/data
Wan-Teh Chang393f8f52022-09-06 19:11:03 -0700167 )
Yannis Guyon483340b2022-10-28 10:53:19 +0200168 add_test(NAME test_cmd_grid COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_grid.sh ${CMAKE_BINARY_DIR}
169 ${CMAKE_CURRENT_SOURCE_DIR}/data
170 )
Yannis Guyonb9366f02022-10-19 03:23:27 +0200171 add_test(NAME test_cmd_lossless COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_lossless.sh ${CMAKE_BINARY_DIR}
172 ${CMAKE_CURRENT_SOURCE_DIR}/data
173 )
174 add_test(NAME test_cmd_metadata COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/test_cmd_metadata.sh ${CMAKE_BINARY_DIR}
175 ${CMAKE_CURRENT_SOURCE_DIR}/data
176 )
177
178 if(NOT AVIF_CODEC_AOM OR NOT AVIF_CODEC_AOM_ENCODE)
179 # Only aom encoder supports lossless encoding.
180 set_property(TEST test_cmd_lossless PROPERTY DISABLED True)
181
182 # SVT-AV1 does not support the images with odd dimensions that are used in this test.
183 if(NOT AVIF_CODEC_RAV1E)
184 set_property(TEST test_cmd_metadata PROPERTY DISABLED True)
185 endif()
186
187 message(STATUS "Some tests are disabled because aom is unavailable for encoding.")
188 endif()
Vincent Rabaudf2e4b1a2022-07-15 04:51:01 +0200189endif()