1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
if (BUILD_TESTS)
add_subdirectory(signal)
add_subdirectory(seh)
file(GLOB hdrs "*.h")
file(GLOB srcs "*.cpp")
list(APPEND testrunner_SOURCES ${hdrs} ${srcs} $<TARGET_OBJECTS:cli_objs>)
if (NOT BUILD_CORE_DLL)
list(APPEND testrunner_SOURCES $<TARGET_OBJECTS:cppcheck-core> $<TARGET_OBJECTS:simplecpp_objs>)
if(USE_BUNDLED_TINYXML2)
list(APPEND testrunner_SOURCES $<TARGET_OBJECTS:tinyxml2_objs>)
endif()
endif()
add_executable(testrunner ${testrunner_SOURCES})
target_include_directories(testrunner PRIVATE ${PROJECT_SOURCE_DIR}/lib/ ${PROJECT_SOURCE_DIR}/cli/)
if(USE_BUNDLED_TINYXML2)
target_externals_include_directories(testrunner PRIVATE ${PROJECT_SOURCE_DIR}/externals/tinyxml2)
else()
target_include_directories(testrunner SYSTEM PRIVATE ${tinyxml2_INCLUDE_DIRS})
endif()
target_externals_include_directories(testrunner PRIVATE ${PROJECT_SOURCE_DIR}/externals/simplecpp/)
if (HAVE_RULES)
target_link_libraries(testrunner ${PCRE_LIBRARY})
endif()
if (WIN32 AND NOT BORLAND)
if(NOT MINGW)
target_link_libraries(testrunner Shlwapi.lib)
else()
target_link_libraries(testrunner shlwapi)
endif()
endif()
if(tinyxml2_FOUND AND NOT USE_BUNDLED_TINYXML2)
target_link_libraries(testrunner ${tinyxml2_LIBRARIES})
endif()
target_link_libraries(testrunner ${CMAKE_THREAD_LIBS_INIT})
if (BUILD_CORE_DLL)
target_compile_definitions(testrunner PRIVATE CPPCHECKLIB_IMPORT SIMPLECPP_IMPORT)
target_link_libraries(testrunner cppcheck-core)
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
# (void) in ASSERT_THROW* macros might trigger this
target_compile_options_safe(testrunner -Wno-useless-cast)
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# $ is used in dinit() designated initialization helper
target_compile_options_safe(testrunner -Wno-dollar-in-identifier-extension)
endif()
if (NOT CMAKE_DISABLE_PRECOMPILE_HEADERS)
target_precompile_headers(testrunner PRIVATE precompiled.h)
endif()
add_dependencies(testrunner copy_cfg)
add_dependencies(testrunner copy_addons)
add_dependencies(testrunner copy_platforms)
if (NOT DISABLE_DMAKE)
add_dependencies(testrunner run-dmake)
endif()
if (LIBXML2_XMLLINT_EXECUTABLE)
# TODO: run the CMake implementation of the tests
# TODO: get rid of the copy
add_custom_target(checkcfg ${CMAKE_COMMAND} -E copy $<TARGET_FILE:cppcheck> ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/cfg/runtests.sh
DEPENDS cppcheck validateCFG)
endif()
if (REGISTER_TESTS)
# CMAKE_MATCH_<n> usage for if (MATCHES) requires CMake 3.9
find_package(Threads REQUIRED)
include(ProcessorCount)
ProcessorCount(N)
set(CTEST_PARALLEL_LEVEL ${N} CACHE STRING "CTest parallel level")
# the macos-* runners are sporadically much slower than other runners so chose a high timeout
set(CTEST_TIMEOUT 130 CACHE STRING "CTest timeout")
add_custom_target(check ${CMAKE_CTEST_COMMAND} --output-on-failure -j ${CTEST_PARALLEL_LEVEL} -C ${CMAKE_CFG_INTDIR} --timeout ${CTEST_TIMEOUT}
DEPENDS testrunner cppcheck)
set(SKIP_TESTS "" CACHE STRING "A list of tests to skip")
function(add_fixture NAME)
if (${NAME} IN_LIST SKIP_TESTS)
elseif(TEST ${NAME})
else()
add_test(NAME ${NAME} COMMAND $<TARGET_FILE:testrunner> ${NAME} WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endif()
endfunction()
foreach(SRC ${srcs})
file(STRINGS ${SRC} FIXTURE_LINE REGEX "^REGISTER_TEST\\([a-zA-z0-9]+\\)$")
foreach(_fixture_line ${FIXTURE_LINE})
if(_fixture_line MATCHES "^REGISTER_TEST\\(([a-zA-z0-9]+)\\)$")
add_fixture(${CMAKE_MATCH_1})
endif()
endforeach()
endforeach()
function(add_cfg CFG_TEST)
set(oneValueArgs PLATFORM NAME)
set(multiValueArgs ADD_LIBRARY)
cmake_parse_arguments(PARSE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
get_filename_component(LIBRARY ${CFG_TEST} NAME_WE)
# TODO: get rid of this
if(PARSE_ADD_LIBRARY)
string(REPLACE ";" "," ADD_LIBRARY "${PARSE_ADD_LIBRARY}")
set(LIBRARY "${ADD_LIBRARY},${LIBRARY}")
endif()
set(PLATFORM unix64)
if(PARSE_PLATFORM)
set(PLATFORM ${PARSE_PLATFORM})
endif()
if(PARSE_NAME)
set(TEST_NAME ${PARSE_NAME})
else()
string(MAKE_C_IDENTIFIER ${CFG_TEST} TEST_NAME)
endif()
if ("cfg-${TEST_NAME}" IN_LIST SKIP_TESTS)
else()
# TODO: add syntax check
add_test(NAME cfg-${TEST_NAME}
COMMAND $<TARGET_FILE:cppcheck>
--library=${LIBRARY}
--check-library
--check-level=exhaustive
--platform=${PLATFORM}
--enable=style,information
--inconclusive
--force
--error-exitcode=1
--inline-suppr
--debug-warnings
--suppress=checkersReport
${CMAKE_CURRENT_SOURCE_DIR}/cfg/${CFG_TEST}
)
endif()
endfunction()
# TODO: glob this
add_cfg(boost.cpp)
add_cfg(bsd.c)
add_cfg(cairo.c)
add_cfg(cppunit.cpp)
add_cfg(emscripten.cpp)
# TODO: posix needs to specified first or it has a different mmap() config
# TODO: get rid of posix dependency
add_cfg(gnu.c ADD_LIBRARY posix)
add_cfg(googletest.cpp)
add_cfg(gtk.c)
add_cfg(kde.cpp)
add_cfg(libcurl.c)
add_cfg(libsigc++.cpp)
add_cfg(lua.c)
add_cfg(mfc.cpp)
add_cfg(opencv2.cpp)
add_cfg(openmp.c)
add_cfg(openssl.c)
add_cfg(posix.c)
add_cfg(python.c)
add_cfg(qt.cpp)
add_cfg(selinux.c)
add_cfg(sqlite3.c)
add_cfg(std.c)
add_cfg(std.cpp)
add_cfg(windows.cpp NAME windows32A PLATFORM win32A)
add_cfg(windows.cpp NAME windows32W PLATFORM win32W)
add_cfg(windows.cpp NAME windows64 PLATFORM win64)
add_cfg(wxwidgets.cpp)
function(fixture_cost NAME COST)
if(TEST ${NAME})
set_tests_properties(${NAME} PROPERTIES COST ${COST})
endif()
endfunction()
# Set cost of the more expensive tests to help improve parallel scheduling
# of tests
#
# To collect data to update this list remove "<cmake-build-folder>/Testing/Temporary/CTestCostData.txt",
# disable the fixture_cost() statements below and run a Debug build with "ctest -j1" several times.
# Afterwards run it with "ctest -j11" and immediately cancel the run and update the list accordingly to the
# first eleven tests chosen.
#
# NOTE: The TestProcessExecutor* tests are not the slowest but they invoke processes which max out the system
# and negatively impact the run-time of the other tests
if (TRUE)
fixture_cost(TestProcessExecutorFiles 2.00)
fixture_cost(TestProcessExecutorFS 2.00)
fixture_cost(TestCondition 1.30)
fixture_cost(TestStl 1.30)
fixture_cost(TestTokenizer 1.30)
fixture_cost(cfg-std_c 1.20)
fixture_cost(cfg-std_cpp 1.20)
fixture_cost(TestAutoVariables 1.20)
fixture_cost(TestUninitVar 1.20)
fixture_cost(TestSimplifyTemplate 1.15)
fixture_cost(TestIO 1.15)
fixture_cost(TestBufferOverrun 1.15)
fixture_cost(TestClass 1.15)
fixture_cost(TestNullPointer 1.15)
fixture_cost(TestSuppressions 1.15)
fixture_cost(TestLeakAutoVar 1.10)
fixture_cost(TestSingleExecutorFS 1.10)
fixture_cost(TestLeakAutoVarRecursiveCountLimit 1.05)
fixture_cost(TestThreadExecutorFS 1.05)
fixture_cost(TestThreadExecutorFiles 1.05)
fixture_cost(TestSymbolDatabase 1.05)
fixture_cost(TestSingleExecutorFiles 1.05)
fixture_cost(TestOther 1.05)
fixture_cost(TestValueFlow 1.05)
fixture_cost(cfg-wxwidgets_cpp 1.05)
fixture_cost(cfg-posix_c 1.05)
fixture_cost(cfg-windows32A 1.03)
fixture_cost(cfg-windows32W 1.03)
fixture_cost(cfg-windows64 1.03)
fixture_cost(TestUnusedVar 1.03)
endif()
endif()
endif()
|