The CTestTestMemcheck test cases all try to check the ctest output with a regular expression. They fail intermittently due to ordering of the portions of the output that come from stdout and stderr being mixed. Convert all the test cases to use the RunCMake infrastructure to match stdout and stderr separately.
145 lines
6.0 KiB
CMake
145 lines
6.0 KiB
CMake
include(RunCMake)
|
|
|
|
set(SITE test-site)
|
|
set(BUILDNAME test-build)
|
|
set(COVERAGE_COMMAND "")
|
|
|
|
function(run_mc_test SUBTEST_NAME CHECKER_COMMAND)
|
|
configure_file(${RunCMake_SOURCE_DIR}/test.cmake.in
|
|
${RunCMake_BINARY_DIR}/${SUBTEST_NAME}/test.cmake @ONLY)
|
|
configure_file(${RunCMake_SOURCE_DIR}/CTestConfig.cmake.in
|
|
${RunCMake_BINARY_DIR}/${SUBTEST_NAME}/CTestConfig.cmake @ONLY)
|
|
configure_file(${RunCMake_SOURCE_DIR}/CMakeLists.txt.in
|
|
${RunCMake_BINARY_DIR}/${SUBTEST_NAME}/CMakeLists.txt @ONLY)
|
|
run_cmake_command(${SUBTEST_NAME} ${CMAKE_CTEST_COMMAND}
|
|
-C Debug
|
|
-S ${RunCMake_BINARY_DIR}/${SUBTEST_NAME}/test.cmake
|
|
-V
|
|
--output-log ${RunCMake_BINARY_DIR}/${SUBTEST_NAME}-build/testOutput.log
|
|
${ARGN}
|
|
)
|
|
endfunction()
|
|
|
|
unset(CTEST_EXTRA_CONFIG)
|
|
unset(CTEST_EXTRA_CODE)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add ThreadSanitizer test
|
|
set(CTEST_EXTRA_CODE
|
|
"set(CTEST_MEMORYCHECK_COMMAND_OPTIONS \"report_bugs=1 history_size=5 exitcode=55\")
|
|
")
|
|
set(CMAKELISTS_EXTRA_CODE
|
|
"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\"
|
|
-P \"${RunCMake_SOURCE_DIR}/testThreadSanitizer.cmake\")
|
|
")
|
|
run_mc_test(DummyThreadSanitizer "" -DMEMCHECK_TYPE=ThreadSanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add LeakSanitizer test
|
|
set(CTEST_EXTRA_CODE
|
|
"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1 report_bugs=1 history_size=5 exitcode=55\")
|
|
")
|
|
set(CMAKELISTS_EXTRA_CODE
|
|
"add_test(NAME TestSan COMMAND \"${CMAKE_COMMAND}\"
|
|
-P \"${RunCMake_SOURCE_DIR}/testLeakSanitizer.cmake\")
|
|
")
|
|
run_mc_test(DummyLeakSanitizer "" -DMEMCHECK_TYPE=AddressSanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add AddressSanitizer test
|
|
set(CTEST_EXTRA_CODE
|
|
"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1 report_bugs=1 history_size=5 exitcode=55\")
|
|
")
|
|
set(CMAKELISTS_EXTRA_CODE
|
|
"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\"
|
|
-P \"${RunCMake_SOURCE_DIR}/testAddressSanitizer.cmake\")
|
|
")
|
|
run_mc_test(DummyAddressSanitizer "" -DMEMCHECK_TYPE=AddressSanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add MemorySanitizer test
|
|
set(CTEST_EXTRA_CODE
|
|
"set(CTEST_MEMORYCHECK_COMMAND_OPTIONS \"simulate_sanitizer=1 report_bugs=1 history_size=5 exitcode=55\")
|
|
")
|
|
set(CMAKELISTS_EXTRA_CODE
|
|
"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\"
|
|
-P \"${RunCMake_SOURCE_DIR}/testMemorySanitizer.cmake\")
|
|
")
|
|
run_mc_test(DummyMemorySanitizer "" -DMEMCHECK_TYPE=MemorySanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add UndefinedBehaviorSanitizer test
|
|
set(CTEST_EXTRA_CODE
|
|
"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1\")
|
|
")
|
|
set(CMAKELISTS_EXTRA_CODE
|
|
"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\"
|
|
-P \"${RunCMake_SOURCE_DIR}/testUndefinedBehaviorSanitizer.cmake\")
|
|
")
|
|
run_mc_test(DummyUndefinedBehaviorSanitizer "" -DMEMCHECK_TYPE=UndefinedBehaviorSanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_EXTRA_CODE "string(REPLACE \" \" \"\\\\ \" PRE_POST_COMMAND \"\${CTEST_MEMORYCHECK_COMMAND}\")
|
|
|
|
set(CTEST_CUSTOM_PRE_MEMCHECK \"\${PRE_POST_COMMAND} pre command\")
|
|
set(CTEST_CUSTOM_POST_MEMCHECK \"\${PRE_POST_COMMAND} post command \")
|
|
")
|
|
run_mc_test(DummyValgrindPrePost "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_EXTRA_CODE "set(CTEST_CUSTOM_POST_MEMCHECK \"${MEMCHECK_FAIL}\")")
|
|
run_mc_test(DummyValgrindFailPost "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_EXTRA_CODE "set(CTEST_CUSTOM_PRE_MEMCHECK \"${MEMCHECK_FAIL}\")")
|
|
run_mc_test(DummyValgrindFailPre "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_EXTRA_CONFIG "set(CTEST_CUSTOM_MEMCHECK_IGNORE RunCMakeAgain)\n")
|
|
set(CMAKELISTS_EXTRA_CODE "add_test(NAME RunCMakeAgain COMMAND \"\${CMAKE_COMMAND}\" --version)")
|
|
run_mc_test(DummyValgrindIgnoreMemcheck "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_EXTRA_CONFIG)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CMAKELISTS_EXTRA_CODE "add_test(NAME RunCMakeAgain COMMAND \"\${CMAKE_COMMAND}\" --version)")
|
|
run_mc_test(DummyValgrindTwoTargets "${PSEUDO_VALGRIND}" "-VV")
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_EXTRA_CONFIG "set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE \"\${CMAKE_CURRENT_BINARY_DIR}/does-not-exist\")")
|
|
run_mc_test(DummyValgrindInvalidSupFile "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_EXTRA_CONFIG)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# CTest will add the logfile option before any custom options. Set the logfile
|
|
# again, this time to an empty string. This will cause the logfile to be
|
|
# missing, which will be the prove for us that the custom option is indeed used.
|
|
set(CTEST_EXTRA_CONFIG "set(CTEST_MEMORYCHECK_COMMAND_OPTIONS \"--log-file=\")")
|
|
run_mc_test(DummyValgrindCustomOptions "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_EXTRA_CONFIG)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
run_mc_test(DummyPurify "${PSEUDO_PURIFY}")
|
|
run_mc_test(DummyValgrind "${PSEUDO_VALGRIND}")
|
|
run_mc_test(DummyBC "${PSEUDO_BC}")
|
|
run_mc_test(DummyPurifyNoLogFile "${PSEUDO_PURIFY_NOLOG}")
|
|
run_mc_test(DummyValgrindNoLogFile "${PSEUDO_VALGRIND_NOLOG}")
|
|
run_mc_test(DummyBCNoLogFile "${PSEUDO_BC_NOLOG}")
|
|
run_mc_test(NotExist "\${CTEST_BINARY_DIRECTORY}/no-memcheck-exe")
|
|
run_mc_test(Unknown "\${CMAKE_COMMAND}")
|