1include(RunCTest) 2 3set(SITE test-site) 4set(BUILDNAME test-build) 5set(COVERAGE_COMMAND "") 6 7unset(ENV{CTEST_PARALLEL_LEVEL}) 8 9function(run_mc_test CASE_NAME CHECKER_COMMAND) 10 run_ctest(${CASE_NAME} ${ARGN}) 11endfunction() 12 13unset(CTEST_EXTRA_CONFIG) 14unset(CTEST_EXTRA_CODE) 15unset(CTEST_SUFFIX_CODE) 16unset(CTEST_MEMCHECK_ARGS) 17unset(CMAKELISTS_EXTRA_CODE) 18 19#----------------------------------------------------------------------------- 20# add ThreadSanitizer test 21set(CTEST_EXTRA_CODE 22"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"report_bugs=1:history_size=5:exitcode=55\") 23") 24set(CMAKELISTS_EXTRA_CODE 25"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\" 26-P \"${RunCMake_SOURCE_DIR}/testThreadSanitizer.cmake\") 27") 28run_mc_test(DummyThreadSanitizer "" -DMEMCHECK_TYPE=ThreadSanitizer) 29unset(CMAKELISTS_EXTRA_CODE) 30unset(CTEST_EXTRA_CODE) 31 32#----------------------------------------------------------------------------- 33# add standalone LeakSanitizer test 34set(CTEST_EXTRA_CODE 35"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55\") 36") 37set(CMAKELISTS_EXTRA_CODE 38"add_test(NAME TestSan COMMAND \"${CMAKE_COMMAND}\" 39-P \"${RunCMake_SOURCE_DIR}/testLeakSanitizer.cmake\") 40") 41run_mc_test(DummyLeakSanitizer "" -DMEMCHECK_TYPE=LeakSanitizer) 42unset(CMAKELISTS_EXTRA_CODE) 43unset(CTEST_EXTRA_CODE) 44 45#----------------------------------------------------------------------------- 46# add AddressSanitizer test 47set(CTEST_EXTRA_CODE 48"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55\") 49") 50set(CMAKELISTS_EXTRA_CODE 51"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\" 52-P \"${RunCMake_SOURCE_DIR}/testAddressSanitizer.cmake\") 53") 54run_mc_test(DummyAddressSanitizer "" -DMEMCHECK_TYPE=AddressSanitizer) 55unset(CMAKELISTS_EXTRA_CODE) 56unset(CTEST_EXTRA_CODE) 57 58#----------------------------------------------------------------------------- 59# add AddressSanitizer/LeakSanitizer test 60set(CTEST_EXTRA_CODE 61"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55\") 62") 63set(CMAKELISTS_EXTRA_CODE 64"add_test(NAME TestSan COMMAND \"${CMAKE_COMMAND}\" 65-P \"${RunCMake_SOURCE_DIR}/testAddressLeakSanitizer.cmake\") 66") 67run_mc_test(DummyAddressLeakSanitizer "" -DMEMCHECK_TYPE=AddressSanitizer) 68unset(CMAKELISTS_EXTRA_CODE) 69unset(CTEST_EXTRA_CODE) 70 71#----------------------------------------------------------------------------- 72# add MemorySanitizer test 73set(CTEST_EXTRA_CODE 74"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55\") 75") 76set(CMAKELISTS_EXTRA_CODE 77"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\" 78-P \"${RunCMake_SOURCE_DIR}/testMemorySanitizer.cmake\") 79") 80run_mc_test(DummyMemorySanitizer "" -DMEMCHECK_TYPE=MemorySanitizer) 81unset(CMAKELISTS_EXTRA_CODE) 82unset(CTEST_EXTRA_CODE) 83 84#----------------------------------------------------------------------------- 85# add UndefinedBehaviorSanitizer test 86set(CTEST_EXTRA_CODE 87"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1\") 88") 89set(CMAKELISTS_EXTRA_CODE 90"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\" 91-P \"${RunCMake_SOURCE_DIR}/testUndefinedBehaviorSanitizer.cmake\") 92") 93run_mc_test(DummyUndefinedBehaviorSanitizer "" -DMEMCHECK_TYPE=UndefinedBehaviorSanitizer) 94unset(CMAKELISTS_EXTRA_CODE) 95unset(CTEST_EXTRA_CODE) 96 97#----------------------------------------------------------------------------- 98# add output test 99set(CTEST_EXTRA_CODE 100"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1\") 101") 102set(CMAKELISTS_EXTRA_CODE 103"add_test(NAME TestSan COMMAND \"\${CMAKE_COMMAND}\" 104-P \"${RunCMake_SOURCE_DIR}/testUndefinedBehaviorSanitizer.cmake\") 105") 106run_mc_test(ExpectedOutputs "" -DMEMCHECK_TYPE=UndefinedBehaviorSanitizer) 107unset(CMAKELISTS_EXTRA_CODE) 108unset(CTEST_EXTRA_CODE) 109 110#----------------------------------------------------------------------------- 111set(CTEST_EXTRA_CODE "string(REPLACE \" \" \"\\\\ \" PRE_POST_COMMAND \"\${CTEST_MEMORYCHECK_COMMAND}\") 112 113set(CTEST_CUSTOM_PRE_MEMCHECK \"\${PRE_POST_COMMAND} pre command\") 114set(CTEST_CUSTOM_POST_MEMCHECK \"\${PRE_POST_COMMAND} post command \") 115") 116run_mc_test(DummyValgrindPrePost "${PSEUDO_VALGRIND}") 117unset(CTEST_EXTRA_CODE) 118 119#----------------------------------------------------------------------------- 120set(CTEST_EXTRA_CODE "set(CTEST_CUSTOM_POST_MEMCHECK \"${MEMCHECK_FAIL}\")") 121run_mc_test(DummyValgrindFailPost "${PSEUDO_VALGRIND}") 122unset(CTEST_EXTRA_CODE) 123 124#----------------------------------------------------------------------------- 125set(CTEST_EXTRA_CODE "set(CTEST_CUSTOM_PRE_MEMCHECK \"${MEMCHECK_FAIL}\")") 126run_mc_test(DummyValgrindFailPre "${PSEUDO_VALGRIND}") 127unset(CTEST_EXTRA_CODE) 128 129#----------------------------------------------------------------------------- 130set(CTEST_EXTRA_CONFIG "set(CTEST_CUSTOM_MEMCHECK_IGNORE RunCMakeAgain)\n") 131set(CMAKELISTS_EXTRA_CODE "add_test(NAME RunCMakeAgain COMMAND \"\${CMAKE_COMMAND}\" --version)") 132run_mc_test(DummyValgrindIgnoreMemcheck "${PSEUDO_VALGRIND}") 133unset(CTEST_EXTRA_CONFIG) 134unset(CMAKELISTS_EXTRA_CODE) 135 136#----------------------------------------------------------------------------- 137set(CMAKELISTS_EXTRA_CODE "add_test(NAME RunCMakeAgain COMMAND \"\${CMAKE_COMMAND}\" --version)") 138run_mc_test(DummyValgrindTwoTargets "${PSEUDO_VALGRIND}" "-VV") 139unset(CMAKELISTS_EXTRA_CODE) 140 141#----------------------------------------------------------------------------- 142set(CTEST_EXTRA_CONFIG "set(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE \"\${CMAKE_CURRENT_BINARY_DIR}/does-not-exist\")") 143run_mc_test(DummyValgrindInvalidSupFile "${PSEUDO_VALGRIND}") 144unset(CTEST_EXTRA_CONFIG) 145 146#----------------------------------------------------------------------------- 147# CTest will add the logfile option before any custom options. Set the logfile 148# again, this time to an empty string. This will cause the logfile to be 149# missing, which will be the prove for us that the custom option is indeed used. 150set(CTEST_EXTRA_CONFIG "set(CTEST_MEMORYCHECK_COMMAND_OPTIONS \"--log-file=\")") 151run_mc_test(DummyValgrindCustomOptions "${PSEUDO_VALGRIND}") 152unset(CTEST_EXTRA_CONFIG) 153 154#----------------------------------------------------------------------------- 155run_mc_test(DummyPurify "${PSEUDO_PURIFY}") 156run_mc_test(DummyValgrind "${PSEUDO_VALGRIND}") 157run_mc_test(DummyBC "${PSEUDO_BC}") 158run_mc_test(DummyPurifyNoLogFile "${PSEUDO_PURIFY_NOLOG}") 159run_mc_test(DummyValgrindNoLogFile "${PSEUDO_VALGRIND_NOLOG}") 160run_mc_test(DummyBCNoLogFile "${PSEUDO_BC_NOLOG}") 161run_mc_test(NotExist "\${CTEST_BINARY_DIRECTORY}/no-memcheck-exe") 162run_mc_test(Unknown "\${CMAKE_COMMAND}") 163 164#---------------------------------------------------------------------------- 165set(CTEST_MEMCHECK_ARGS QUIET) 166run_mc_test(DummyQuiet "${PSEUDO_VALGRIND}") 167unset(CTEST_MEMCHECK_ARGS) 168 169#----------------------------------------------------------------------------- 170set(CTEST_SUFFIX_CODE "message(\"Defect count: \${defect_count}\")") 171set(CTEST_MEMCHECK_ARGS "DEFECT_COUNT defect_count") 172run_mc_test(DummyValgrindNoDefects "${PSEUDO_VALGRIND}") 173unset(CTEST_MEMCHECK_ARGS) 174unset(CTEST_SUFFIX_CODE) 175 176#----------------------------------------------------------------------------- 177set(CTEST_SUFFIX_CODE "message(\"Defect count: \${defect_count}\")") 178set(CTEST_MEMCHECK_ARGS "DEFECT_COUNT defect_count") 179set(CTEST_EXTRA_CODE 180"set(CTEST_MEMORYCHECK_SANITIZER_OPTIONS \"simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55\") 181") 182set(CMAKELISTS_EXTRA_CODE 183"add_test(NAME TestSan COMMAND \"${CMAKE_COMMAND}\" 184-P \"${RunCMake_SOURCE_DIR}/testLeakSanitizer.cmake\") 185") 186run_mc_test(DummyLeakSanitizerPrintDefects "" -DMEMCHECK_TYPE=LeakSanitizer) 187unset(CMAKELISTS_EXTRA_CODE) 188unset(CTEST_EXTRA_CODE) 189unset(CTEST_MEMCHECK_ARGS) 190unset(CTEST_SUFFIX_CODE) 191 192#----------------------------------------------------------------------------- 193set(CMAKELISTS_EXTRA_CODE 194"add_test(NAME TestSan COMMAND \"${CMAKE_COMMAND}\" 195-P \"${RunCMake_SOURCE_DIR}/testCudaSanitizer.cmake\") 196") 197set(CTEST_SUFFIX_CODE "message(\"Defect count: \${defect_count}\")") 198set(CTEST_MEMCHECK_ARGS "DEFECT_COUNT defect_count") 199run_mc_test(DummyCudaSanitizer "${PSEUDO_CUDA_SANITIZER}") 200unset(CTEST_MEMCHECK_ARGS) 201unset(CTEST_SUFFIX_CODE) 202unset(CTEST_EXTRA_CODE) 203