Skip to content
Snippets Groups Projects
hysop_tests.cmake 4.64 KiB
Newer Older
Franck Pérignon's avatar
Franck Pérignon committed
# === Configuration for tests in HySoP ===
Franck Pérignon's avatar
Franck Pérignon committed
#
# --> collect test directories/files
# --> create tests (ctest)
#
Franck Pérignon's avatar
Franck Pérignon committed
# For each function 'test_something' in all files of directories
# 'tests' a new test is created.
#
Franck Pérignon's avatar
Franck Pérignon committed
# Those tests will be run after a call to 'make test'
# or a call to ctest.

find_python_module(pytest REQUIRED)

# === Tests options ===
set(pytest_opt "-v" CACHE INTERNAL "extra options for py.test")

# Force create data directory for tests event if no tests needs it
# because this will we the working directory for all tests.
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests)

Franck Pérignon's avatar
Franck Pérignon committed
# Declaration of python test
# Usage:
#   Add_python_test(name file) with 'name' is the name of the test
#   and file the source file for the test.
Franck Pérignon's avatar
Franck Pérignon committed
macro(add_python_test test_name test_file)
  add_test(${test_name} py.test "${pytest_opt}" ${test_file})
  set_tests_properties(${test_name} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILURE;Exception;[^x]failed;ERROR;Assertion")
  set_tests_properties(${test_name} PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests)
  set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "PYTHONPATH=$ENV{PYTHONPATH}:${HYSOP_BUILD_PYTHONPATH}")
  set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "PYTHONPATH=$ENV{PYTHONPATH}:${HYSOP_BUILD_PYTHONPATH},LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${HYSOP_BUILD_PYTHONPATH}")
  set_tests_properties(${test_name} PROPERTIES TIMEOUT ${TEST_TIMEOUT})
Franck Pérignon's avatar
Franck Pérignon committed
  if(WITH_MPI_TESTS)
    # Run the same test using mpi multi process run.
    # The number of processes used is set with NBPROCS_FOR_TESTS variable (user option for cmake, default=8)
    add_test(${test_name}_mpi ${MPIEXEC} -np ${NBPROCS_FOR_TESTS} ${PYTHON_EXECUTABLE} -m pytest "${pytest_opt}" ${test_file})

    #mpirun -np 1 python -m pytest -v

    set_tests_properties(${test_name}_mpi PROPERTIES FAIL_REGULAR_EXPRESSION "FAILURE;Exception;[^x]failed;ERROR;Assertion")
    set_tests_properties(${test_name}_mpi PROPERTIES WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dataForTests)
    set_tests_properties(${test_name}_mpi PROPERTIES ENVIRONMENT "PYTHONPATH=$ENV{PYTHONPATH}:${HYSOP_BUILD_PYTHONPATH},LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH}:${HYSOP_BUILD_PYTHONPATH}")
    set_tests_properties(${test_name}_mpi PROPERTIES TIMEOUT ${TEST_TIMEOUT})
 endif()
Franck Pérignon's avatar
Franck Pérignon committed
endmacro()
Franck Pérignon's avatar
Franck Pérignon committed

Franck Pérignon's avatar
Franck Pérignon committed
# Choose python build dir as directory where tests will be run.
Franck Pérignon's avatar
Franck Pérignon committed
# --> set test dir
Franck Pérignon's avatar
Franck Pérignon committed
set(testDir ${HYSOP_BUILD_PYTHONPATH})

# === Set the list of all directories which may contain tests ===
set(py_src_dirs core/arrays core/graph core/memory fields operator numerics numerics/splitting)
Franck Pérignon's avatar
Franck Pérignon committed
# === Create the files list from all directories in py_src_dirs ===

Franck Pérignon's avatar
Franck Pérignon committed
# Build a list of test_*.py files for each directory of hysop/${py_src_dirs}
set(py_test_files)
foreach(testdir ${py_src_dirs})
Franck Pérignon's avatar
Franck Pérignon committed
  file(GLOB testfiles RELATIVE ${CMAKE_SOURCE_DIR} hysop/${testdir}/tests/test_*.py)
  set(py_test_files ${py_test_files} ${testfiles})
  # copy data files required by the tests
Franck Pérignon's avatar
Franck Pérignon committed
  file(GLOB reffiles hysop/${testdir}/tests/ref_files/*)
Franck Pérignon's avatar
Franck Pérignon committed
  file(COPY ${reffiles} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/dataForTests)
Franck Pérignon's avatar
Franck Pérignon committed
# Build doctests
Franck Pérignon's avatar
Franck Pérignon committed
# Handling doctest in *.py files recursively for each directory of hysop/${py_src_dirs}
# excluding  __init__ or test_ files.
Franck Pérignon's avatar
Franck Pérignon committed
# Doctest are run for every line which contains '>>>'
set(py_doctest_files)
Franck Pérignon's avatar
Franck Pérignon committed
  file(GLOB testfiles RELATIVE ${CMAKE_SOURCE_DIR} hysop/${testdir}/[a-zA-Z]*.py)
  foreach(testfile ${testfiles})
    file(STRINGS ${testfile} test_doctest REGEX ">>>")
    if(NOT "${test_doctest}" STREQUAL "")
      set(py_doctest_files ${py_doctest_files} ${testfile})
    endif()
  endforeach()
Franck Pérignon's avatar
Franck Pérignon committed
# === Create tests from py_test_files ===
Jean-Baptiste Keck's avatar
Jean-Baptiste Keck committed
  set(execname ${CMAKE_SOURCE_DIR}/${testfile})
  get_filename_component(testName ${testfile} NAME_WE)
Jean-Baptiste Keck's avatar
Jean-Baptiste Keck committed
  message(STATUS "Add test ${execname} ...")
  add_python_test(${testName} ${execname})
Franck Pérignon's avatar
Franck Pérignon committed
# Add files containing doctests
foreach(testfile ${py_doctest_files})
  get_filename_component(testName ${testfile} NAME_WE)
Franck Pérignon's avatar
Franck Pérignon committed
  set(exename ${testDir}/${testfile})
  add_test("doctest_${testName}" py.test -v --doctest-modules ${exename})
endforeach()
# Setup extra timeout for some specific test (used with ctest, not in CI)
set_tests_properties("test_poisson" PROPERTIES TIMEOUT 600)
set_tests_properties("test_poisson_curl" PROPERTIES TIMEOUT 600)
set_tests_properties("test_solenoidal_projection" PROPERTIES TIMEOUT 600)
set_tests_properties("test_spectral_derivative" PROPERTIES TIMEOUT 600)

# Add custom target to launch continuous integration tests
add_custom_target(ci COMMAND ${CMAKE_SOURCE_DIR}/ci/scripts/test.sh ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/hysop)