253 lines
9.9 KiB
CMake
253 lines
9.9 KiB
CMake
# Get GTest tests as CMake tests.
|
|
# Copied from FindGTest.cmake
|
|
# Thanks to Daniel Blezek <blezek@gmail.com> for the GTEST_ADD_TESTS code
|
|
function(gtest_add_tests executable working_dir source_var)
|
|
if(NOT UNIT_TEST_NUMBER)
|
|
set(UNIT_TEST_NUMBER 0 CACHE INT "" FORCE)
|
|
endif()
|
|
foreach(source ${${source_var}})
|
|
file(READ "${source}" contents)
|
|
string(REGEX MATCHALL "TEST_?[F]?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents})
|
|
foreach(hit ${found_tests})
|
|
string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit})
|
|
math(EXPR UNIT_TEST_NUMBER "${UNIT_TEST_NUMBER}+1")
|
|
set(UNIT_TEST${UNIT_TEST_NUMBER} ${test_name} ${working_dir} ${ARGN} ${executable} --gtest_filter=${test_name} CACHE STRING "" FORCE)
|
|
endforeach()
|
|
# Groups parametrized tests under a single ctest entry
|
|
string(REGEX MATCHALL "INSTANTIATE_TEST_CASE_P\\(([^,]+), *([^,]+)" found_tests2 ${contents})
|
|
foreach(hit ${found_tests2})
|
|
string(SUBSTRING ${hit} 24 -1 test_name)
|
|
string(REPLACE "," ";" test_name "${test_name}")
|
|
list(GET test_name 0 filter_name)
|
|
list(GET test_name 1 test_prefix)
|
|
string(STRIP ${test_prefix} test_prefix)
|
|
string(REGEX MATCHALL "TEST_P\\(${test_prefix},([^\\)]+)\\)" found_tests3 ${contents})
|
|
foreach(ghit ${found_tests3})
|
|
string(SUBSTRING ${ghit} 8 -1 ghit_name)
|
|
string(REPLACE "," ";" ghit_name "${ghit_name}")
|
|
list(GET ghit_name 1 ghit_tname)
|
|
string(STRIP ${ghit_tname} ghit_tname)
|
|
string(REPLACE ")" "" ghit_tname "${ghit_tname}")
|
|
math(EXPR UNIT_TEST_NUMBER "${UNIT_TEST_NUMBER}+1")
|
|
set(UNIT_TEST${UNIT_TEST_NUMBER} ${test_prefix}.${ghit_tname} ${working_dir} ${ARGN} ${executable} --gtest_filter=*${filter_name}.${ghit_tname}/* CACHE STRING "" FORCE)
|
|
endforeach()
|
|
endforeach()
|
|
endforeach()
|
|
set(UNIT_TEST_NUMBER ${UNIT_TEST_NUMBER} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
|
|
macro(IFEM_add_test_app path workdir name)
|
|
if("${path}" MATCHES "\\*")
|
|
file(GLOB TEST_SRCS ${path})
|
|
else()
|
|
set(TEST_SRCS ${path})
|
|
endif()
|
|
add_executable(${name}-test ${EXCL_ALL} ${IFEM_PATH}/src/IFEM-test.C ${TEST_SRCS})
|
|
gtest_add_tests($<TARGET_FILE:${name}-test> ${workdir} TEST_SRCS)
|
|
list(APPEND TEST_APPS ${name}-test)
|
|
target_link_libraries(${name}-test ${ARGN} gtest pthread)
|
|
endmacro()
|
|
|
|
macro(IFEM_add_unittests IFEM_PATH)
|
|
file(GLOB TEST_SOURCES ${IFEM_PATH}/src/Utility/Test/*.C;${IFEM_PATH}/src/ASM/Test/*.C;${IFEM_PATH}/src/LinAlg/Test/*.C;${IFEM_PATH}/src/SIM/Test/*.C;${IFEM_PATH}/src/Eig/Test/*.C)
|
|
if(NOT PETSC_FOUND)
|
|
list(REMOVE_ITEM TEST_SOURCES ${IFEM_PATH}/src/LinAlg/Test/TestPETScMatrix.C)
|
|
endif()
|
|
|
|
if(NOT ISTL_FOUND)
|
|
list(REMOVE_ITEM TEST_SOURCES ${IFEM_PATH}/src/LinAlg/Test/TestISTLMatrix.C)
|
|
endif()
|
|
|
|
if(NOT HDF5_FOUND)
|
|
list(REMOVE_ITEM TEST_SOURCES ${IFEM_PATH}/src/Utility/Test/TestFieldFunctions.C)
|
|
list(REMOVE_ITEM TEST_SOURCES ${IFEM_PATH}/src/Utility/Test/TestFieldFunctionsLR.C)
|
|
endif()
|
|
|
|
if(LRSPLINE_FOUND OR LRSpline_FOUND)
|
|
file(GLOB LR_TEST_SRCS ${PROJECT_SOURCE_DIR}/src/ASM/LR/Test/*.C)
|
|
list(APPEND TEST_SOURCES ${LR_TEST_SRCS})
|
|
else()
|
|
list(REMOVE_ITEM TEST_SOURCES ${IFEM_PATH}/src/Utility/Test/TestFieldFunctionsLR.C)
|
|
endif()
|
|
|
|
IFEM_add_test_app("${TEST_SOURCES}"
|
|
${IFEM_PATH}
|
|
IFEM
|
|
${IFEM_LIBRARIES} ${IFEM_DEPLIBS})
|
|
|
|
# Parallel unit tests. These all run with 4 processes.
|
|
if(MPI_FOUND)
|
|
set(TEST_SRCS_MPI ${IFEM_PATH}/src/ASM/Test/MPI/TestDomainDecomposition.C)
|
|
if(PETSC_FOUND)
|
|
list(APPEND TEST_SRCS_MPI ${IFEM_PATH}/src/LinAlg/Test/MPI/TestPETScMatrix.C)
|
|
endif()
|
|
if(ISTL_FOUND)
|
|
list(APPEND TEST_SRCS_MPI ${IFEM_PATH}/src/LinAlg/Test/MPI/TestISTLMatrix.C)
|
|
endif()
|
|
add_executable(IFEM-MPI-test ${EXCL_ALL}
|
|
${IFEM_PATH}/src/IFEM-test.C ${TEST_SRCS_MPI})
|
|
target_link_libraries(IFEM-MPI-test ${IFEM_LIBRARIES} ${IFEM_DEPLIBS} gtest)
|
|
gtest_add_tests($<TARGET_FILE:IFEM-MPI-test> ${IFEM_PATH} TEST_SRCS_MPI
|
|
${MPIEXEC} -np 4)
|
|
list(APPEND TEST_APPS IFEM-MPI-test)
|
|
endif()
|
|
endmacro()
|
|
|
|
function(IFEM_add_test name binary)
|
|
separate_arguments(MEMCHECK_COMMAND)
|
|
if(IFEM_TEST_EXTRA)
|
|
set(test-name "${binary}+${IFEM_TEST_EXTRA}+${name}")
|
|
else()
|
|
set(test-name "${binary}+${name}")
|
|
endif()
|
|
if(IFEM_TEST_MEMCHECK)
|
|
add_test("${test-name}" regtest.sh "${MEMCHECK_COMMAND} --log-file=${CMAKE_BINARY_DIR}/valgrindlog ${EXECUTABLE_OUTPUT_PATH}/${binary}" ${PROJECT_SOURCE_DIR}/${TEST_SUBDIR}/Test/${name} ${ARGN})
|
|
else(IFEM_TEST_MEMCHECK)
|
|
add_test("${test-name}" regtest.sh ${EXECUTABLE_OUTPUT_PATH}/${binary} ${PROJECT_SOURCE_DIR}/${TEST_SUBDIR}/Test/${name} ${ARGN})
|
|
endif(IFEM_TEST_MEMCHECK)
|
|
endfunction()
|
|
|
|
function(IFEM_add_restart_test name binary rlevel)
|
|
separate_arguments(MEMCHECK_COMMAND)
|
|
if(IFEM_TEST_EXTRA)
|
|
set(test-name "restart+${binary}+${IFEM_TEST_EXTRA}+${name}")
|
|
else()
|
|
set(test-name "restart+${binary}+${name}")
|
|
endif()
|
|
string(REGEX MATCH "^(.*)\\.[^.]*$" dummy ${name})
|
|
set(rfile ${CMAKE_MATCH_1})
|
|
get_filename_component(rfile ${rfile} NAME)
|
|
if(IFEM_TEST_MEMCHECK)
|
|
add_test("${test-name}" regtest.sh "${MEMCHECK_COMMAND} --log-file=${CMAKE_BINARY_DIR}/valgrindlog ${EXECUTABLE_OUTPUT_PATH}/${binary}" ${PROJECT_SOURCE_DIR}/${TEST_SUBDIR}/Test/${name} ${rfile} ${rlevel} ${ARGN})
|
|
else(IFEM_TEST_MEMCHECK)
|
|
add_test("${test-name}" regtest.sh ${EXECUTABLE_OUTPUT_PATH}/${binary} ${PROJECT_SOURCE_DIR}/${TEST_SUBDIR}/Test/${name} ${rfile} ${rlevel} ${ARGN})
|
|
endif(IFEM_TEST_MEMCHECK)
|
|
endfunction()
|
|
|
|
function(IFEM_add_vtf_test name binary)
|
|
if(NOT VTFWRITER_FOUND OR NOT VTFLS_COMMAND)
|
|
return()
|
|
endif()
|
|
separate_arguments(MEMCHECK_COMMAND)
|
|
if(IFEM_TEST_EXTRA)
|
|
set(test-name "vtf+${binary}+${IFEM_TEST_EXTRA}+${name}")
|
|
else()
|
|
set(test-name "vtf+${binary}+${name}")
|
|
endif()
|
|
add_test("${test-name}" iotest.sh ${EXECUTABLE_OUTPUT_PATH}/${binary} ${PROJECT_SOURCE_DIR}/${TEST_SUBDIR}/Test/${name} vtf)
|
|
endfunction()
|
|
|
|
function(IFEM_add_hdf5_test name binary)
|
|
if(NOT HDF5_FOUND OR NOT H5LS_COMMAND)
|
|
return()
|
|
endif()
|
|
separate_arguments(MEMCHECK_COMMAND)
|
|
if(IFEM_TEST_EXTRA)
|
|
set(test-name "hdf5+${binary}+${IFEM_TEST_EXTRA}+${name}")
|
|
else()
|
|
set(test-name "hdf5+${binary}+${name}")
|
|
endif()
|
|
add_test("${test-name}" iotest.sh ${EXECUTABLE_OUTPUT_PATH}/${binary} ${PROJECT_SOURCE_DIR}/${TEST_SUBDIR}/Test/${name} hdf5 ${ARGN})
|
|
endfunction()
|
|
|
|
macro(add_check_target)
|
|
add_custom_target(check ${CMAKE_CTEST_COMMAND} WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
|
|
add_custom_command(TARGET check PRE_BUILD COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/failed.log)
|
|
if(IFEM_AS_SUBMODULE OR IFEM_LIBRARY_BUILD)
|
|
ifem_add_unittests(${IFEM_PATH})
|
|
endif()
|
|
if(NOT TARGET gtest)
|
|
add_subdirectory(${IFEM_PATH}/3rdparty/gtest gtest ${EXCL_ALL})
|
|
endif()
|
|
if (${UNIT_TEST_NUMBER} GREATER 0)
|
|
foreach(test_number RANGE 1 ${UNIT_TEST_NUMBER})
|
|
list(GET UNIT_TEST${test_number} 0 name)
|
|
list(GET UNIT_TEST${test_number} 1 dir)
|
|
list(REMOVE_AT UNIT_TEST${test_number} 0 1)
|
|
if(IFEM_TEST_MEMCHECK)
|
|
set(cmd ${MEMCHECK_COMMAND} ${cmd})
|
|
endif()
|
|
add_test(NAME ${name}
|
|
COMMAND ${UNIT_TEST${test_number}}
|
|
WORKING_DIRECTORY ${dir})
|
|
endforeach()
|
|
endif()
|
|
add_dependencies(check ${TEST_APPS})
|
|
add_custom_target(testapps DEPENDS ${TEST_APPS})
|
|
|
|
if(NOT TARGET check-commits)
|
|
add_custom_target(check-commits
|
|
COMMAND ${CMAKE_COMMAND}
|
|
-DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
|
|
-DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR}
|
|
-P ${IFEM_CHECKCOMMITS_SCRIPT})
|
|
endif()
|
|
|
|
foreach(dep ${IFEM_INCLUDE_DIRS} ${IFEM_INCLUDES})
|
|
list(APPEND IPATHS -I ${dep})
|
|
endforeach()
|
|
|
|
if(NOT CMAKE_DISABLE_FIND_PACKAGE_ClangCheck)
|
|
find_program(CLANGCHECK_COMMAND clang-check)
|
|
endif()
|
|
if(NOT CMAKE_DISABLE_FIND_PACKAGE_CppCheck)
|
|
find_program(CPPCHECK_COMMAND cppcheck)
|
|
endif()
|
|
foreach(src ${CHECK_SOURCES})
|
|
get_filename_component(name ${src} NAME)
|
|
get_filename_component(EXT ${src} EXT)
|
|
if(EXT STREQUAL .C)
|
|
if(NOT IS_ABSOLUTE ${src})
|
|
set(src ${PROJECT_SOURCE_DIR}/${src})
|
|
endif()
|
|
if(CLANGCHECK_COMMAND AND CMAKE_EXPORT_COMPILE_COMMANDS)
|
|
add_test(NAME clang-check+${name}
|
|
COMMAND clang-check-test.sh ${CLANGCHECK_COMMAND} ${src}
|
|
CONFIGURATIONS analyze clang-check)
|
|
endif()
|
|
if(CPPCHECK_COMMAND)
|
|
add_test(NAME cppcheck+${name}
|
|
COMMAND cppcheck-test.sh ${CPPCHECK_COMMAND} ${src} ${IPATHS}
|
|
CONFIGURATIONS analyze cppcheck)
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endmacro()
|
|
|
|
if(IFEM_TEST_MEMCHECK)
|
|
find_program(MEMCHECK_COMMAND valgrind)
|
|
if(NOT MEMCHECK_COMMAND)
|
|
message(FATAL_ERROR "Could not locate valgrind and IFEM_TEST_MEMCHECK is requested.")
|
|
endif()
|
|
endif()
|
|
|
|
set(IFEM_TESTING_INCLUDED 1)
|
|
if(IFEM_INTREE_BUILD)
|
|
include_directories(${IFEM_PATH}/3rdparty/gtest/include)
|
|
elseif(NOT IFEM_AS_SUBMODULE AND NOT IFEM_LIBRARY_BUILD
|
|
AND NOT TARGET gtest)
|
|
if (EXISTS ${PROJECT_SOURCE_DIR}/../gtest)
|
|
add_subdirectory(${PROJECT_SOURCE_DIR}/../gtest gtest)
|
|
include_directories(${PROJECT_SOURCE_DIR}/../gtest/include)
|
|
else()
|
|
include(DownloadGTest)
|
|
include_directories(${GTEST_INCLUDE_DIRS})
|
|
endif()
|
|
endif()
|
|
|
|
find_program(VTFLS_COMMAND vtfls)
|
|
find_program(H5LS_COMMAND h5ls)
|
|
|
|
# Generate regtest script with correct paths
|
|
configure_file(${IFEM_REGTEST_SCRIPT} regtest.sh @ONLY)
|
|
configure_file(${IFEM_CLANG_CHECK_TEST_SCRIPT} clang-check-test.sh @ONLY)
|
|
configure_file(${IFEM_CPPCHECK_TEST_SCRIPT} cppcheck-test.sh @ONLY)
|
|
configure_file(${IFEM_IOTEST_SCRIPT} iotest.sh @ONLY)
|
|
|
|
if(IFEM_BUILD_TESTING)
|
|
set(EXCL_ALL)
|
|
else()
|
|
set(EXCL_ALL EXCLUDE_FROM_ALL)
|
|
endif()
|