mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
The ctest(1) command line allows repeating -L/-LE to form an AND filter over test labels, but the ctest_test() and ctest_memcheck() scripting commands accepted only a single INCLUDE_LABEL/EXCLUDE_LABEL value, so a dashboard script could not express that filter. The label-matching engine already stores the include/exclude expressions as vectors and applies them with AND semantics; only the command binding was single-value. Change both keywords to multi-value (NonEmpty<vector<string>>) and hand the collected list straight to the engine. ctest_memcheck() gains the same behavior for free, since it inherits the option set. Fixes : #27497
264 lines
10 KiB
CMake
264 lines
10 KiB
CMake
include(RunCTest)
|
|
|
|
set(SITE test-site)
|
|
set(BUILDNAME test-build)
|
|
set(COVERAGE_COMMAND "")
|
|
|
|
function(run_mc_test CASE_NAME CHECKER_COMMAND)
|
|
run_ctest(${CASE_NAME} ${ARGN})
|
|
endfunction()
|
|
|
|
unset(CTEST_EXTRA_CONFIG)
|
|
unset(CTEST_EXTRA_CODE)
|
|
unset(CTEST_SUFFIX_CODE)
|
|
unset(CTEST_MEMCHECK_ARGS)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add ThreadSanitizer test
|
|
set(CTEST_EXTRA_CODE
|
|
"set(CTEST_MEMORYCHECK_SANITIZER_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 standalone 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=LeakSanitizer)
|
|
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 AddressSanitizer/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}/testAddressLeakSanitizer.cmake\")
|
|
")
|
|
run_mc_test(DummyAddressLeakSanitizer "" -DMEMCHECK_TYPE=AddressSanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add MemorySanitizer 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}/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)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# add output 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(ExpectedOutputs "" -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}")
|
|
|
|
#----------------------------------------------------------------------------
|
|
set(CTEST_MEMCHECK_ARGS QUIET)
|
|
run_mc_test(DummyQuiet "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_MEMCHECK_ARGS)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_SUFFIX_CODE "message(\"Defect count: \${defect_count}\")")
|
|
set(CTEST_MEMCHECK_ARGS "DEFECT_COUNT defect_count")
|
|
run_mc_test(DummyValgrindNoDefects "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_MEMCHECK_ARGS)
|
|
unset(CTEST_SUFFIX_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CTEST_SUFFIX_CODE "message(\"Defect count: \${defect_count}\")")
|
|
set(CTEST_MEMCHECK_ARGS "DEFECT_COUNT defect_count")
|
|
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(DummyLeakSanitizerPrintDefects "" -DMEMCHECK_TYPE=LeakSanitizer)
|
|
unset(CMAKELISTS_EXTRA_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
unset(CTEST_MEMCHECK_ARGS)
|
|
unset(CTEST_SUFFIX_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
set(CMAKELISTS_EXTRA_CODE
|
|
"add_test(NAME TestSan COMMAND \"${CMAKE_COMMAND}\"
|
|
-P \"${RunCMake_SOURCE_DIR}/testCudaSanitizer.cmake\")
|
|
")
|
|
set(CTEST_SUFFIX_CODE "message(\"Defect count: \${defect_count}\")")
|
|
set(CTEST_MEMCHECK_ARGS "DEFECT_COUNT defect_count")
|
|
run_mc_test(DummyCudaSanitizer "${PSEUDO_CUDA_SANITIZER}")
|
|
unset(CTEST_MEMCHECK_ARGS)
|
|
unset(CTEST_SUFFIX_CODE)
|
|
unset(CTEST_EXTRA_CODE)
|
|
|
|
#-----------------------------------------------------------------------------
|
|
block()
|
|
set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/TestPresetInclude")
|
|
set(CMAKELISTS_EXTRA_CODE [[
|
|
foreach(i RANGE 1 3)
|
|
add_test(NAME test${i} COMMAND ${CMAKE_COMMAND} -E true)
|
|
endforeach()
|
|
]])
|
|
configure_file(
|
|
"${RunCMake_SOURCE_DIR}/CMakePresets.json.in"
|
|
"${RunCMake_TEST_SOURCE_DIR}/CMakePresets.json"
|
|
@ONLY)
|
|
set(CTEST_MEMCHECK_ARGS "PRESET my-include-preset")
|
|
run_mc_test(TestPresetInclude "${PSEUDO_VALGRIND}")
|
|
endblock()
|
|
|
|
block()
|
|
set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/TestPresetFromFile")
|
|
set(custom_presets_file
|
|
"${RunCMake_BINARY_DIR}/TestPresetFromFile/custom-presets.json")
|
|
set(CMAKELISTS_EXTRA_CODE [[
|
|
foreach(i RANGE 1 3)
|
|
add_test(NAME test${i} COMMAND ${CMAKE_COMMAND} -E true)
|
|
endforeach()
|
|
]])
|
|
configure_file(
|
|
"${RunCMake_SOURCE_DIR}/CMakePresets.json.in"
|
|
"${custom_presets_file}"
|
|
@ONLY)
|
|
set(CTEST_MEMCHECK_ARGS
|
|
"PRESET my-include-preset PRESETS_FILE \"${custom_presets_file}\"")
|
|
run_mc_test(TestPresetFromFile "${PSEUDO_VALGRIND}")
|
|
endblock()
|
|
|
|
block()
|
|
set(CTEST_MEMCHECK_ARGS
|
|
"PRESET my-include-preset PRESETS_FILE /nonexistent/path/presets.json")
|
|
run_mc_test(TestPresetBadFile "${PSEUDO_VALGRIND}")
|
|
endblock()
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Verify that INCLUDE_LABEL / EXCLUDE_LABEL accept more than one value that
|
|
# form an AND relationship, and that the change propagates to ctest_memcheck().
|
|
block()
|
|
set(CMAKELISTS_EXTRA_CODE [[
|
|
add_test(NAME test1 COMMAND ${CMAKE_COMMAND} -E true)
|
|
set_property(TEST test1 PROPERTY LABELS foo)
|
|
add_test(NAME test2 COMMAND ${CMAKE_COMMAND} -E true)
|
|
set_property(TEST test2 PROPERTY LABELS bar)
|
|
add_test(NAME test3 COMMAND ${CMAKE_COMMAND} -E true)
|
|
set_property(TEST test3 PROPERTY LABELS foo bar)
|
|
]])
|
|
set(CTEST_MEMCHECK_ARGS "INCLUDE_LABEL foo bar")
|
|
run_mc_test(LabelAndInclude "${PSEUDO_VALGRIND}")
|
|
|
|
set(CTEST_MEMCHECK_ARGS "EXCLUDE_LABEL foo bar")
|
|
run_mc_test(LabelAndExclude "${PSEUDO_VALGRIND}")
|
|
|
|
set(CTEST_MEMCHECK_ARGS "INCLUDE_LABEL foo")
|
|
run_mc_test(LabelAndIncludeSingle "${PSEUDO_VALGRIND}")
|
|
unset(CTEST_MEMCHECK_ARGS)
|
|
endblock()
|