diff --git a/cmake/ecbuild_add_test.cmake b/cmake/ecbuild_add_test.cmake index aba3e96..63a3c44 100644 --- a/cmake/ecbuild_add_test.cmake +++ b/cmake/ecbuild_add_test.cmake @@ -34,6 +34,7 @@ # [ GENERATED [ ...] ] # [ DEPENDS [ ...] ] # [ TEST_DEPENDS [ ...] ] +# [ TEST_REQUIRES [ ...] ] # [ CONDITION ] # [ PROPERTIES [ ...] ] # [ TEST_PROPERTIES [ ...] ] @@ -128,6 +129,9 @@ # TEST_DEPENDS : optional # list of tests to be run before this one # +# TEST_REQUIRES : optional +# list of tests that will automatically run before this one +# # CONDITION : optional # conditional expression which must evaluate to true for this target to be # built (must be valid in a CMake ``if`` statement) @@ -187,7 +191,7 @@ function( ecbuild_add_test ) set( options NO_AS_NEEDED ) set( single_value_args TARGET ENABLED COMMAND TYPE LINKER_LANGUAGE MPI OMP WORKING_DIRECTORY ) - set( multi_value_args SOURCES OBJECTS LIBS INCLUDES TEST_DEPENDS DEPENDS LABELS ARGS + set( multi_value_args SOURCES OBJECTS LIBS INCLUDES TEST_DEPENDS DEPENDS TEST_REQUIRES LABELS ARGS PERSISTENT DEFINITIONS RESOURCES TEST_DATA CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION TEST_PROPERTIES PROPERTIES ENVIRONMENT ) @@ -475,6 +479,15 @@ function( ecbuild_add_test ) set_tests_properties( ${_PAR_TARGET} PROPERTIES ${_PAR_TEST_PROPERTIES} ) endif() + # Set the fictures properties if test requires another test to run before + if ( DEFINED _PAR_TEST_REQUIRES ) + ecbuild_debug("ecbuild_add_test(${_PAR_TARGET}): set test requirements to ${_PAR_TEST_REQUIRES}") + foreach(_requirement ${_PAR_TEST_REQUIRES} ) + set_tests_properties( ${_requirement} PROPERTIES FIXTURES_SETUP ${_requirement} ) + endforeach() + set_tests_properties( ${_PAR_TARGET} PROPERTIES FIXTURES_REQUIRED "${_PAR_TEST_REQUIRES}" ) + endif() + # get test data if( _PAR_TEST_DATA ) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d95f6c7..302a28c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,3 +13,5 @@ add_subdirectory( project_import ) add_subdirectory( project_summary ) add_subdirectory( ecbuild_override_compiler_flags ) add_subdirectory( test_properties ) +add_subdirectory( test_requires_simple ) +add_subdirectory( test_requires_complex ) diff --git a/tests/test_requires_complex/CMakeLists.txt b/tests/test_requires_complex/CMakeLists.txt new file mode 100644 index 0000000..6c80683 --- /dev/null +++ b/tests/test_requires_complex/CMakeLists.txt @@ -0,0 +1,7 @@ + +ecbuild_add_test( + TARGET test_ecbuild_test_requires_complex + TYPE SCRIPT + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh + ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} +) diff --git a/tests/test_requires_complex/build-and-run.sh b/tests/test_requires_complex/build-and-run.sh new file mode 100755 index 0000000..2aa3f4f --- /dev/null +++ b/tests/test_requires_complex/build-and-run.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -e + +HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} +SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} + +# Add ecbuild to path +export PATH=$SOURCE/../../bin:$PATH +echo $PATH +echo $SOURCE + +# Build the project +ecbuild $SOURCE/test_project -B $HERE/build + +# Run only one specific test (which should invoke the dependency) +(cd $HERE/build; ctest -R write_world) # Avoid using --test-dir option in ctest + +# Check if the output is as expected +echo -n "World!" | diff - $HERE/build/world.txt + +# Run only one specific test (which should invoke the dependencies) +(cd $HERE/build; ctest -R combine_hello_world) # Avoid using --test-dir option in ctest + +# Check if the output is as expected +echo -n "Hello, World!" | diff - $HERE/build/helloworld.txt diff --git a/tests/test_requires_complex/test_project/CMakeLists.txt b/tests/test_requires_complex/test_project/CMakeLists.txt new file mode 100644 index 0000000..81b918c --- /dev/null +++ b/tests/test_requires_complex/test_project/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.7 FATAL_ERROR) + +find_package( ecbuild REQUIRED ) +project( test_test_requires_complex VERSION 0.1.0 LANGUAGES NONE ) + +ecbuild_add_test( + TARGET clean_output + COMMAND ${CMAKE_COMMAND} + ARGS -E remove ${CMAKE_CURRENT_BINARY_DIR}/hello.txt ${CMAKE_CURRENT_BINARY_DIR}/world.txt ${CMAKE_CURRENT_BINARY_DIR}/helloworld.txt +) + +ecbuild_add_test( + TARGET write_hello + TEST_REQUIRES clean_output + COMMAND bash + ARGS -c "echo -n 'Hello, ' >> ${CMAKE_CURRENT_BINARY_DIR}/hello.txt" +) + +ecbuild_add_test( + TARGET write_world + TEST_REQUIRES clean_output + COMMAND bash + ARGS -c "echo -n 'World!' >> ${CMAKE_CURRENT_BINARY_DIR}/world.txt" +) + +ecbuild_add_test( + TARGET combine_hello_world + TEST_REQUIRES write_hello write_world + COMMAND bash + ARGS -c "cat ${CMAKE_CURRENT_BINARY_DIR}/hello.txt ${CMAKE_CURRENT_BINARY_DIR}/world.txt >> ${CMAKE_CURRENT_BINARY_DIR}/helloworld.txt" +) diff --git a/tests/test_requires_simple/CMakeLists.txt b/tests/test_requires_simple/CMakeLists.txt new file mode 100644 index 0000000..d2a7b6e --- /dev/null +++ b/tests/test_requires_simple/CMakeLists.txt @@ -0,0 +1,7 @@ + +ecbuild_add_test( + TARGET test_ecbuild_test_requires_simple + TYPE SCRIPT + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-and-run.sh + ENVIRONMENT CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} +) diff --git a/tests/test_requires_simple/build-and-run.sh b/tests/test_requires_simple/build-and-run.sh new file mode 100755 index 0000000..ba7efd5 --- /dev/null +++ b/tests/test_requires_simple/build-and-run.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -e + +HERE=${CMAKE_CURRENT_BINARY_DIR:-"$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"} +SOURCE=${CMAKE_CURRENT_SOURCE_DIR:-$HERE} + +# Add ecbuild to path +export PATH=$SOURCE/../../bin:$PATH +echo $PATH +echo $SOURCE + +# Build the project +ecbuild $SOURCE/test_project -B $HERE/build + +# Run only one specific test (which should invoke the dependencies) +(cd $HERE/build; ctest -R write_world_after_hello) # Avoid using --test-dir option in ctest + +# Check if the output is as expected +echo -n "Hello, World!" | diff - $HERE/build/output.txt diff --git a/tests/test_requires_simple/test_project/CMakeLists.txt b/tests/test_requires_simple/test_project/CMakeLists.txt new file mode 100644 index 0000000..3f293b1 --- /dev/null +++ b/tests/test_requires_simple/test_project/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.7 FATAL_ERROR) + +find_package( ecbuild REQUIRED ) +project( test_test_requires_simple VERSION 0.1.0 LANGUAGES NONE ) + +ecbuild_add_test( + TARGET clean_output + COMMAND ${CMAKE_COMMAND} + ARGS -E remove ${CMAKE_CURRENT_BINARY_DIR}/output.txt +) + +ecbuild_add_test( + TARGET write_hello + TEST_REQUIRES clean_output + COMMAND bash + ARGS -c "echo -n 'Hello, ' >> ${CMAKE_CURRENT_BINARY_DIR}/output.txt" +) + +ecbuild_add_test( + TARGET write_world_after_hello + TEST_REQUIRES write_hello + COMMAND bash + ARGS -c "echo -n 'World!' >> ${CMAKE_CURRENT_BINARY_DIR}/output.txt" +)