From 7d079f9c72203fb08db34baab548f9cd7104355d Mon Sep 17 00:00:00 2001 From: Lars Bilke <lars.bilke@ufz.de> Date: Mon, 7 Apr 2014 16:25:27 +0200 Subject: [PATCH] First testing environment implementation. See scripts/cmake/test/README.md for details. Conflicts: SimpleTests/FemTests/CMakeLists.txt (ignored) --- CMakeLists.txt | 2 +- scripts/cmake/Test.cmake | 0 scripts/cmake/test/AddTest.cmake | 50 +++++++++++++++++++++++++ scripts/cmake/test/AddTestTester.cmake | 15 ++++++++ scripts/cmake/test/AddTestWrapper.cmake | 12 ++++++ scripts/cmake/test/CTestCustom.cmake.in | 2 + scripts/cmake/test/README.md | 17 +++++++++ scripts/cmake/test/Test.cmake | 18 +++++++++ 8 files changed, 115 insertions(+), 1 deletion(-) delete mode 100644 scripts/cmake/Test.cmake create mode 100644 scripts/cmake/test/AddTest.cmake create mode 100644 scripts/cmake/test/AddTestTester.cmake create mode 100644 scripts/cmake/test/AddTestWrapper.cmake create mode 100644 scripts/cmake/test/CTestCustom.cmake.in create mode 100644 scripts/cmake/test/README.md create mode 100644 scripts/cmake/test/Test.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cb91d27654..25788e7ee70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ INCLUDE(scripts/cmake/Find.cmake) INCLUDE(scripts/cmake/SubmoduleSetup.cmake) INCLUDE(scripts/cmake/ProjectSetup.cmake) INCLUDE(scripts/cmake/DocumentationSetup.cmake) -INCLUDE(scripts/cmake/Test.cmake) +INCLUDE(scripts/cmake/test/Test.cmake) IF(OGS_COVERAGE AND NOT IS_SUBPROJECT) INCLUDE(scripts/cmake/Coverage.cmake) ENDIF() diff --git a/scripts/cmake/Test.cmake b/scripts/cmake/Test.cmake deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/scripts/cmake/test/AddTest.cmake b/scripts/cmake/test/AddTest.cmake new file mode 100644 index 00000000000..f0f1e82a48f --- /dev/null +++ b/scripts/cmake/test/AddTest.cmake @@ -0,0 +1,50 @@ +FUNCTION (AddTest executable case_path case_name wrapper) + + SET(tester ${ARGV4}) + + # Implement wrappers + IF(wrapper STREQUAL "TIME") + SET(WRAPPER_COMMAND ${TIME_TOOL_PATH}) + ELSEIF(wrapper STREQUAL "MEMCHECK" AND VALGRIND_TOOL_PATH) + SET(WRAPPER_COMMAND "${VALGRIND_TOOL_PATH} --tool=memcheck --log-file=${case_path}/${case_name}_memcheck.log -v --leak-check=full --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xff") + SET(tester MEMCHECK) + ELSEIF(wrapper STREQUAL "CALLGRIND" AND VALGRIND_TOOL_PATH) + SET(WRAPPER_COMMAND "${VALGRIND_TOOL_PATH} --tool=callgrind --branch-sim=yes --cache-sim=yes --dump-instr=yes --collect-jumps=yes") + UNSET(tester) + ENDIF() + + # Implement testers + IF(tester STREQUAL "DIFF") + SET(TESTER_COMMAND "${DIFF_TOOL_PATH} -sbB ${case_path}/${case_name}_expected_result.vtu ${case_path}/${case_name}_with_results.vtu") + ELSEIF(tester STREQUAL "MEMCHECK") + SET(TESTER_COMMAND "! ${GREP_TOOL_PATH} definitely ${case_path}/${case_name}_memcheck.log") + ENDIF() + + ## ----------- + + ADD_TEST(NAME "${executable}-${case_path}-${wrapper}" + COMMAND ${CMAKE_COMMAND} + -Dexecutable=$<TARGET_FILE:${executable}> + -Dcase_path=${case_path} + -Dcase_name=${case_name} + -Dwrapper=${wrapper} + -DWRAPPER_COMMAND=${WRAPPER_COMMAND} + -DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR} + -P ${PROJECT_SOURCE_DIR}/scripts/cmake/test/AddTestWrapper.cmake + ) + + IF(NOT tester) + RETURN() + ENDIF() + + ADD_TEST(NAME "${executable}-${case_path}-${wrapper}-${tester}" + COMMAND ${CMAKE_COMMAND} + -Dcase_path=${case_path} + -Dcase_name=${case_name} + -Dtester=${tester} + -DTESTER_COMMAND=${TESTER_COMMAND} + -DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR} + -P ${PROJECT_SOURCE_DIR}/scripts/cmake/test/AddTestTester.cmake + ) + +ENDFUNCTION() diff --git a/scripts/cmake/test/AddTestTester.cmake b/scripts/cmake/test/AddTestTester.cmake new file mode 100644 index 00000000000..d0f30840c72 --- /dev/null +++ b/scripts/cmake/test/AddTestTester.cmake @@ -0,0 +1,15 @@ +#message("tester: ${TESTER_COMMAND}") +#STRING(REPLACE " " ";" TESTER_COMMAND ${TESTER_COMMAND}) +#set(list ${TESTER_COMMAND}) +#message("tester: ${list}") + + +EXECUTE_PROCESS( + COMMAND bash -c ${TESTER_COMMAND} + WORKING_DIRECTORY ${case_path} + RESULT_VARIABLE EXIT_CODE +) + +IF(NOT EXIT_CODE STREQUAL "0") + MESSAGE(FATAL_ERROR "Error exit code: ${EXIT_CODE}") +ENDIF() diff --git a/scripts/cmake/test/AddTestWrapper.cmake b/scripts/cmake/test/AddTestWrapper.cmake new file mode 100644 index 00000000000..0b900a6fdae --- /dev/null +++ b/scripts/cmake/test/AddTestWrapper.cmake @@ -0,0 +1,12 @@ +SET(ARGS --boundary_condition ${case_path}/${case_name}.cnd -g ${case_path}/${case_name}.gml -m ${case_path}/${case_name}.vtu) + +STRING(REPLACE " " ";" WRAPPER_COMMAND ${WRAPPER_COMMAND}) +EXECUTE_PROCESS( + COMMAND ${WRAPPER_COMMAND} ${executable} ${ARGS} + WORKING_DIRECTORY ${case_path} + RESULT_VARIABLE EXIT_CODE +) + +IF(NOT EXIT_CODE STREQUAL "0") + MESSAGE(FATAL_ERROR "Test wrapper exited with code: ${EXIT_CODE}") +ENDIF() diff --git a/scripts/cmake/test/CTestCustom.cmake.in b/scripts/cmake/test/CTestCustom.cmake.in new file mode 100644 index 00000000000..66887f9e0f6 --- /dev/null +++ b/scripts/cmake/test/CTestCustom.cmake.in @@ -0,0 +1,2 @@ +# SET(CTEST_CUSTOM_POST_TEST "cat ${CMAKE_BINARY_DIR}/Testing/Temporary/LastTestTester.log 2>&1") +SET(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE}) # logog diff --git a/scripts/cmake/test/README.md b/scripts/cmake/test/README.md new file mode 100644 index 00000000000..b7c75291c21 --- /dev/null +++ b/scripts/cmake/test/README.md @@ -0,0 +1,17 @@ +Required tools: + +- `time` +- `diff` +- `valgrind` +- `grep` +- `bash` + +Test data is searched for in `ogs6-sources/../ogs6-data`. + +In the build directory run `ctest` with `–-output-on-failure` and `-R` for includes and `-E` for excludes: + +```bash +ctest --output-on-failure -R "MEMCHECK|VALGRIND" -E DIFF +``` + +Wrapper and tester are implemented in `AddTest.cmake`. diff --git a/scripts/cmake/test/Test.cmake b/scripts/cmake/test/Test.cmake new file mode 100644 index 00000000000..132d9843d8b --- /dev/null +++ b/scripts/cmake/test/Test.cmake @@ -0,0 +1,18 @@ +# Find tools and data +FIND_PROGRAM(TIME_TOOL_PATH time REQUIRED) +FIND_PROGRAM(DIFF_TOOL_PATH diff REQUIRED) +FIND_PROGRAM(GREP_TOOL_PATH grep REQUIRED) +FIND_PROGRAM(BASH_TOOL_PATH bash REQUIRED) +FIND_PROGRAM(VALGRIND_TOOL_PATH valgrind REQUIRED) +FIND_FILE(OGS-DATA_PATH ".ogs6-data.dummy" REQUIRED + HINTS ${CMAKE_SOURCE_DIR}/../ogs6-data) +GET_FILENAME_COMPONENT(OGS-DATA_PATH ${OGS-DATA_PATH} PATH) + +ENABLE_TESTING() # Enable CTest + +# See http://www.vtk.org/Wiki/CMake/Testing_With_CTest for some customization options +SET(CTEST_CUSTOM_TESTS_IGNORE test-harness) # ignore logog test +CONFIGURE_FILE( + ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/test/CTestCustom.cmake.in + ${CMAKE_BINARY_DIR}/CTestCustom.cmake +) -- GitLab