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