# Copyright (C) 2020-2022 Cisco Systems, Inc. and/or its affiliates. All rights reserved. # # Decrypt test files # add_subdirectory( input ) if(WIN32) add_definitions(-DWIN32_LEAN_AND_MEAN) add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_CRT_SECURE_NO_DEPRECATE) add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) # Windows compatibility headers include_directories(${CMAKE_SOURCE_DIR}/win32/compat) endif() if (ENABLE_UNRAR) add_definitions(-DHAVE_UNRAR) endif() add_definitions(-DTHIS_IS_LIBCLAMAV) # # Programs used by tests # # preprocessor defines for test programs if(WIN32) file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR} OBJDIR) string(REPLACE "\\" "\\\\" OBJDIR ${OBJDIR}) file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} SRCDIR) string(REPLACE "\\" "\\\\" SRCDIR ${SRCDIR}) else() set(OBJDIR ${CMAKE_CURRENT_BINARY_DIR}) set(SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() if(ENABLE_APP) # check_fpu_endian is used by the clamscan tests add_executable(check_fpu_endian) target_sources(check_fpu_endian PRIVATE checks.h check_fpu_endian.c) target_link_libraries(check_fpu_endian PRIVATE ClamAV::libclamav libcheck::check tomsfastmath JSONC::jsonc ${LIBMSPACK} OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB BZip2::BZip2 PCRE2::pcre2 LibXml2::LibXml2) if(ENABLE_SHARED_LIB) target_link_libraries(check_fpu_endian PRIVATE ClamAV::libunrar_iface_iface) else() if (ENABLE_UNRAR) target_link_libraries(check_fpu_endian PRIVATE ClamAV::libunrar_iface_static) endif() endif() if(LLVM_FOUND) target_link_directories( check_fpu_endian PUBLIC ${LLVM_LIBRARY_DIRS} ) target_link_libraries( check_fpu_endian PUBLIC ${LLVM_LIBRARIES} ) endif() target_include_directories(check_fpu_endian PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/libclamav ${CMAKE_BINARY_DIR}) target_compile_definitions(check_fpu_endian PUBLIC OBJDIR="${OBJDIR}" SRCDIR="${SRCDIR}") # check_clamd is used by the clamd tests add_executable(check_clamd) target_sources(check_clamd PRIVATE check_clamd.c checks.h) target_link_libraries(check_clamd PRIVATE ClamAV::libclamav ClamAV::common libcheck::check tomsfastmath JSONC::jsonc ${LIBMSPACK} OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB BZip2::BZip2 PCRE2::pcre2 LibXml2::LibXml2) if(ENABLE_SHARED_LIB) target_link_libraries(check_clamd PRIVATE ClamAV::libunrar_iface_iface) else() if (ENABLE_UNRAR) target_link_libraries(check_clamd PRIVATE ClamAV::libunrar_iface_static) endif() endif() if(LLVM_FOUND) target_link_directories( check_clamd PUBLIC ${LLVM_LIBRARY_DIRS} ) target_link_libraries( check_clamd PUBLIC ${LLVM_LIBRARIES} ) endif() target_include_directories(check_clamd PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/libclamav ${CMAKE_BINARY_DIR}) target_compile_definitions(check_clamd PUBLIC OBJDIR="${OBJDIR}" SRCDIR="${SRCDIR}") endif() # # Test executables # add_executable(check_clamav) target_sources(check_clamav PRIVATE checks.h check_bytecode.c check_clamav.c check_disasm.c check_htmlnorm.c check_jsnorm.c check_matchers.c check_regex.c check_str.c check_uniq.c) target_link_libraries(check_clamav PRIVATE ClamAV::libclamav libcheck::check tomsfastmath JSONC::jsonc ${LIBMSPACK} OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB BZip2::BZip2 PCRE2::pcre2 LibXml2::LibXml2) if (ENABLE_UNRAR) if(ENABLE_SHARED_LIB) target_link_libraries(check_clamav PRIVATE ClamAV::libunrar_iface_iface) else() if (ENABLE_UNRAR) target_link_libraries(check_clamav PRIVATE ClamAV::libunrar_iface_static) endif() endif() endif() if(LLVM_FOUND) target_link_directories( check_clamav PUBLIC ${LLVM_LIBRARY_DIRS} ) target_link_libraries( check_clamav PUBLIC ${LLVM_LIBRARIES} ) endif() target_include_directories(check_clamav PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/libclamav ${CMAKE_BINARY_DIR}) target_compile_definitions(check_clamav PUBLIC OBJDIR="${OBJDIR}" SRCDIR="${SRCDIR}") ADD_CUSTOM_COMMAND(TARGET check_clamav POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input/clamav.hdb ${CMAKE_CURRENT_BINARY_DIR}/input/.) # # Paths to pass to our tests via environment variables # if(LLVM_FOUND) string(REPLACE "-l" "" LLVM_LIBRARIES_TRIMMED "${LLVM_LIBRARIES}") list(JOIN LLVM_LIBRARIES_TRIMMED "," LLVM_LIBS) list(JOIN LLVM_LIBRARY_DIRS "," LLVM_DIRS) endif() if(WIN32) file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} SOURCE) file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} BUILD) file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR} TMP) set(NEW_PATH "$;$ENV{PATH}") file(TO_NATIVE_PATH $ LIBSSL) file(TO_NATIVE_PATH $ LIBCRYPTO) file(TO_NATIVE_PATH $ LIBZ) file(TO_NATIVE_PATH $ LIBBZ2) file(TO_NATIVE_PATH $ LIBPCRE2) file(TO_NATIVE_PATH $ LIBXML2) if(NOT ENABLE_LIBCLAMAV_ONLY) # libcurl not used by libclamav and so is not defined in libclamav-only mode. file(TO_NATIVE_PATH $ LIBCURL) endif() file(TO_NATIVE_PATH $ LIBJSONC) file(TO_NATIVE_PATH $ LIBPTHREADW32) file(TO_NATIVE_PATH $ LIBWIN32COMPAT) if(ENABLE_STATIC_LIB) file(TO_NATIVE_PATH $ LIBCLAMAV) if (ENABLE_UNRAR) file(TO_NATIVE_PATH $ LIBCLAMUNRARIFACE) file(TO_NATIVE_PATH $ LIBCLAMUNRAR) endif() else() file(TO_NATIVE_PATH $ LIBCLAMAV) endif() file(TO_NATIVE_PATH $ LIBCLAMMSPACK) file(TO_NATIVE_PATH $ CHECK_CLAMAV) if(ENABLE_APP) file(TO_NATIVE_PATH $ CHECK_CLAMD) file(TO_NATIVE_PATH $ CHECK_FPU_ENDIAN) file(TO_NATIVE_PATH $/clambc.exe CLAMBC) file(TO_NATIVE_PATH $/clamd.exe CLAMD) file(TO_NATIVE_PATH $/clamdscan.exe CLAMDSCAN) file(TO_NATIVE_PATH $/clamdtop.exe CLAMDTOP) file(TO_NATIVE_PATH $/clamscan.exe CLAMSCAN) file(TO_NATIVE_PATH $/clamsubmit.exe CLAMSUBMIT) file(TO_NATIVE_PATH $/clamconf.exe CLAMCONF) file(TO_NATIVE_PATH $/freshclam.exe FRESHCLAM) file(TO_NATIVE_PATH $/sigtool.exe SIGTOOL) endif() else() set(LD_LIBRARY_PATH $:$:$ENV{LD_LIBRARY_PATH}) if(NOT ENABLE_LIBCLAMAV_ONLY) set(LD_LIBRARY_PATH $:${LD_LIBRARY_PATH}) endif() if (ENABLE_UNRAR) set(LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:$:$) endif() set(SOURCE ${CMAKE_SOURCE_DIR}) set(BUILD ${CMAKE_BINARY_DIR}) set(TMP ${CMAKE_CURRENT_BINARY_DIR}) set(NEW_PATH "$ENV{PATH}") set(LIBSSL $) set(LIBCRYPTO $) set(LIBZ $) set(LIBBZ2 $) set(LIBPCRE2 $) set(LIBXML2 $) if(NOT ENABLE_LIBCLAMAV_ONLY) # libcurl not used by libclamav and so is not defined in libclamav-only mode. set(LIBCURL $) endif() set(LIBJSONC $) if(Iconv_FOUND AND NOT Iconv_IS_BUILT_IN) set(LIBICONV ${Iconv_LIBRARIES}) endif() if(ENABLE_STATIC_LIB) set(LIBCLAMAV $) if (ENABLE_UNRAR) set(LIBCLAMUNRARIFACE $) set(LIBCLAMUNRAR $) endif() else() set(LIBCLAMAV $) endif() set(LIBCLAMMSPACK $) set(CHECK_CLAMAV $) if(ENABLE_APP) set(CHECK_CLAMD $) set(CHECK_FPU_ENDIAN $) set(CLAMBC $) set(CLAMD $) set(CLAMDSCAN $) set(CLAMDTOP $) set(CLAMSCAN $) set(CLAMSUBMIT $) set(CLAMCONF $) set(FRESHCLAM $) set(SIGTOOL $) if(ENABLE_MILTER) set(CLAMAV_MILTER $) endif() if(ENABLE_CLAMONACC) set(CLAMONACC $) endif() endif() endif() set(ENVIRONMENT PYTHONTRACEMALLOC=1 VERSION=${PROJECT_VERSION}${VERSION_SUFFIX} SOURCE=${SOURCE} BUILD=${BUILD} TMP=${TMP} CK_FORK=no CK_DEFAULT_TIMEOUT=300 LD_LIBRARY_PATH=${LD_LIBRARY_PATH} DYLD_LIBRARY_PATH=${LD_LIBRARY_PATH} PATH=${NEW_PATH} LIBSSL=${LIBSSL} LIBCRYPTO=${LIBCRYPTO} LIBZ=${LIBZ} LIBBZ2=${LIBBZ2} LIBPCRE2=${LIBPCRE2} LIBXML2=${LIBXML2} LIBCURL=${LIBCURL} LIBJSONC=${LIBJSONC} LIBICONV=${LIBICONV} LLVM_LIBS=${LLVM_LIBS} LLVM_DIRS=${LLVM_LIBRARY_DIRS} LIBPTHREADW32=${LIBPTHREADW32} LIBWIN32COMPAT=${LIBWIN32COMPAT} LIBCLAMAV=${LIBCLAMAV} LIBCLAMMSPACK=${LIBCLAMMSPACK} LIBCLAMUNRARIFACE=${LIBCLAMUNRARIFACE} LIBCLAMUNRAR=${LIBCLAMUNRAR} CHECK_CLAMAV=${CHECK_CLAMAV} CHECK_CLAMD=${CHECK_CLAMD} CHECK_FPU_ENDIAN=${CHECK_FPU_ENDIAN} CLAMBC=${CLAMBC} CLAMD=${CLAMD} CLAMDSCAN=${CLAMDSCAN} CLAMDTOP=${CLAMDTOP} CLAMSCAN=${CLAMSCAN} CLAMSUBMIT=${CLAMSUBMIT} CLAMCONF=${CLAMCONF} FRESHCLAM=${FRESHCLAM} SIGTOOL=${SIGTOOL} CLAMAV_MILTER=${CLAMAV_MILTER} CLAMONACC=${CLAMONACC} ) # # The Tests # ~~~~~~~~~ # # Run all tests with: `ctest` # or: `ctest -V` for verbose output # # Run a specific test like this: # `ctest -V -R libclamav_valgrind_test` # add_test(NAME libclamav COMMAND ${PythonTest_COMMAND};libclamav_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST libclamav PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(Valgrind_FOUND) add_test(NAME libclamav_valgrind COMMAND ${PythonTest_COMMAND};libclamav_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST libclamav_valgrind PROPERTY ENVIRONMENT ${ENVIRONMENT} VALGRIND=${Valgrind_EXECUTABLE}) endif() add_rust_test(NAME libclamav_rust SOURCE_DIRECTORY "${CMAKE_SOURCE_DIR}/libclamav_rust" BINARY_DIRECTORY "${CMAKE_BINARY_DIR}" PRECOMPILE_TESTS FALSE # Cannot precompile, because `sudo make install` will fail. See notes in FindRust.cmake. ) set_property(TEST libclamav_rust PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(ENABLE_APP) add_test(NAME clamscan COMMAND ${PythonTest_COMMAND};clamscan WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST clamscan PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(Valgrind_FOUND) add_test(NAME clamscan_valgrind COMMAND ${PythonTest_COMMAND};clamscan WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST clamscan_valgrind PROPERTY ENVIRONMENT ${ENVIRONMENT} VALGRIND=${Valgrind_EXECUTABLE}) endif() add_test(NAME clamd COMMAND ${PythonTest_COMMAND};clamd_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST clamd PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(Valgrind_FOUND) add_test(NAME clamd_valgrind COMMAND ${PythonTest_COMMAND};clamd_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST clamd_valgrind PROPERTY ENVIRONMENT ${ENVIRONMENT} VALGRIND=${Valgrind_EXECUTABLE}) endif() add_test(NAME freshclam COMMAND ${PythonTest_COMMAND};freshclam_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST freshclam PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(Valgrind_FOUND) add_test(NAME freshclam_valgrind COMMAND ${PythonTest_COMMAND};freshclam_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST freshclam_valgrind PROPERTY ENVIRONMENT ${ENVIRONMENT} VALGRIND=${Valgrind_EXECUTABLE}) endif() add_test(NAME sigtool COMMAND ${PythonTest_COMMAND};sigtool_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST sigtool PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(Valgrind_FOUND) add_test(NAME sigtool_valgrind COMMAND ${PythonTest_COMMAND};sigtool_test.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST sigtool_valgrind PROPERTY ENVIRONMENT ${ENVIRONMENT} VALGRIND=${Valgrind_EXECUTABLE}) endif() endif() if(ENABLE_EXAMPLES) add_test(NAME examples COMMAND ${PythonTest_COMMAND};examples WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST examples PROPERTY ENVIRONMENT ${ENVIRONMENT}) if(Valgrind_FOUND) add_test(NAME examples_valgrind COMMAND ${PythonTest_COMMAND};examples WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TEST examples_valgrind PROPERTY ENVIRONMENT ${ENVIRONMENT} VALGRIND=${Valgrind_EXECUTABLE}) endif() endif() if(WIN32) # # Prepare a test install, with all our DLL dependencies co-located with our EXEs and DLLs # if(VCPKG_APPLOCAL_DEPS) # # Have CMake invoke itself to performa a local install for our test suite. # if(ENABLE_APP) add_custom_target(test_install ALL "${CMAKE_COMMAND}" -D CMAKE_INSTALL_CONFIG_NAME:string=$ -D CMAKE_INSTALL_PREFIX:string=$ -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" DEPENDS check_clamav check_clamd check_fpu_endian ClamAV::libclamav ClamAV::libfreshclam ClamAV::libunrar ClamAV::libunrar_iface ${LIBMSPACK} clambc clamd clamdscan clamdtop clamscan clamsubmit clamconf freshclam-bin sigtool ) else() add_custom_target(test_install ALL "${CMAKE_COMMAND}" -D CMAKE_INSTALL_CONFIG_NAME:string=$ -D CMAKE_INSTALL_PREFIX:string=$ -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" DEPENDS check_clamav ClamAV::libclamav ClamAV::libfreshclam ClamAV::libunrar ClamAV::libunrar_iface ClamAV::libmspack ) endif() else() # # Generate GetLibs-$.ctest which will collect all required DLL and EXE dependencies when `ctest` is run. # if(ENABLE_APP) set(GEN_SCRIPT [[ # Collect runtime DLL dependencies for our libs and apps file(GET_RUNTIME_DEPENDENCIES LIBRARIES $ $ EXECUTABLES $ $ $ $ $ $ $ $ $ $ $ $ RESOLVED_DEPENDENCIES_VAR _r_deps UNRESOLVED_DEPENDENCIES_VAR _u_deps DIRECTORIES $ $ $ $ $ $ $ $ CONFLICTING_DEPENDENCIES_PREFIX CTEST_CONFLICTING_DEPENDENCIES ) foreach(_file ${_r_deps}) string(TOLOWER ${_file} _file_lower) if(NOT ${_file_lower} MATCHES "c:[\\/]windows[\\/]system32.*") message("Collecting DLL dependency: ${_file}") file(COPY ${_file} DESTINATION $) endif() endforeach() # Collect our libs file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) if ($) file(COPY $,ClamAV::libmspack,check_clamav>> DESTINATION $) endif() if ($) file(COPY $,ClamAV::libunrar,check_clamav>> DESTINATION $) endif() if ($) file(COPY $,ClamAV::libunrar_iface,check_clamav>> DESTINATION $) endif() # Collect our apps file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) file(COPY $ DESTINATION $) ]]) else() # We don't have libfreshclam unit tests, so no need to check if ENABLE_LIBCLAMAV_ONLY is enabled. set(GEN_SCRIPT [[ # Collect runtime DLL dependencies for our libs file(GET_RUNTIME_DEPENDENCIES LIBRARIES $ EXECUTABLES $ RESOLVED_DEPENDENCIES_VAR _r_deps UNRESOLVED_DEPENDENCIES_VAR _u_deps DIRECTORIES $ $ $ $ $ $ $ CONFLICTING_DEPENDENCIES_PREFIX CTEST_CONFLICTING_DEPENDENCIES ) foreach(_file ${_r_deps}) string(TOLOWER ${_file} _file_lower) if(NOT ${_file_lower} MATCHES "c:[\\/]windows[\\/]system32.*") message("DEPENDENCY: ${_file}") file(COPY ${_file} DESTINATION $) endif() endforeach() # Collect our libs file(COPY $ DESTINATION $) if ($) file(COPY $,ClamAV::libmspack,check_clamav>> DESTINATION $) endif() if ($) file(COPY $,ClamAV::libunrar,check_clamav>> DESTINATION $) endif() if ($) file(COPY $,ClamAV::libunrar_iface,check_clamav>> DESTINATION $) endif() ]]) endif() file(GENERATE OUTPUT GetLibs-$.ctest CONTENT ${GEN_SCRIPT}) set_directory_properties(PROPERTIES TEST_INCLUDE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Run-GetLibs.ctest) endif() endif()