icinga2/test/CMakeLists.txt
Johannes Schmidt e11aad842a Discover Boost test cases automatically after build
This adds a global fixture that can parse an additional argument to
the test executables (`--generate_ctest_config`). When run by
CMake during build, this generates a CTest script containing all
the tests and their properties.

An additional decorator, that defines CTest properties for a test case
or suite that will be added to the tests during config generation.

This version needs no hacks, no huge CMake scripts, just a bit of
additional C++ code that iterates over all test-cases and collects
the information CTest needs.

One caveat is still that this does not work with cross-compilation,
which probably isn't an issue to begin with, but there are also ways
to fix that if necessary.
2025-08-19 09:24:42 +02:00

183 lines
4.3 KiB
CMake

# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+
include(DiscoverBoostTests)
add_library(testdeps INTERFACE)
if(NOT Boost_UNIT_TEST_FRAMEWORK_LIBRARY)
find_package(Boost 1.34.0 QUIET COMPONENTS unit_test_framework)
endif()
if(Boost_UNIT_TEST_FRAMEWORK_LIBRARY)
target_link_libraries(testdeps
INTERFACE
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
${base_DEPS}
)
if(NOT Boost_USE_STATIC_LIBS)
set(BOOST_TEST_DYN_LINK ON)
endif()
else()
set(BOOST_TEST_USE_INCLUDED ON)
endif()
configure_file(BoostTestConfig.h.in BoostTestTargetConfig.h @ONLY)
target_include_directories(testdeps
INTERFACE
"${CMAKE_CURRENT_BINARY_DIR}"
)
target_sources(testdeps INTERFACE
test-runner.cpp
test-ctest.cpp
)
Set(types_test_SOURCES
icingaapplication-fixture.cpp
base-type.cpp
${base_OBJS}
$<TARGET_OBJECTS:config>
$<TARGET_OBJECTS:remote>
$<TARGET_OBJECTS:icinga>
$<TARGET_OBJECTS:methods>
)
if(ICINGA2_WITH_CHECKER)
list(APPEND types_test_SOURCES $<TARGET_OBJECTS:checker>)
endif()
if(ICINGA2_WITH_MYSQL)
list(APPEND types_test_SOURCES $<TARGET_OBJECTS:db_ido> $<TARGET_OBJECTS:db_ido_mysql>)
endif()
if(ICINGA2_WITH_PGSQL)
list(APPEND types_test_SOURCES $<TARGET_OBJECTS:db_ido> $<TARGET_OBJECTS:db_ido_pgsql>)
endif()
if(ICINGA2_WITH_ICINGADB)
list(APPEND types_test_SOURCES $<TARGET_OBJECTS:icingadb>)
endif()
if(ICINGA2_WITH_NOTIFICATION)
list(APPEND types_test_SOURCES $<TARGET_OBJECTS:notification>)
endif()
if(ICINGA2_WITH_PERFDATA)
list(APPEND types_test_SOURCES $<TARGET_OBJECTS:perfdata>)
endif()
if(ICINGA2_UNITY_BUILD)
mkunity_target(types test types_test_SOURCES)
endif()
# In order to test the order of all Icinga 2 config type load dependencies, we need to link against all the libraries,
# but this results in boost signals e.g. in dbevents.cpp being triggered by icinga-checkresult.cpp test cases that
# only pass partially initialised objects. Therefore, the types test cases are decoupled from base and moved to a
# separate executable to not crash the base test cases.
add_executable(testtypes
${types_test_SOURCES}
)
target_link_libraries(testtypes testdeps)
target_discover_boost_tests(testtypes)
set(base_test_SOURCES
icingaapplication-fixture.cpp
utils.cpp
base-array.cpp
base-base64.cpp
base-convert.cpp
base-dictionary.cpp
base-fifo.cpp
base-io-engine.cpp
base-json.cpp
base-match.cpp
base-netstring.cpp
base-object.cpp
base-object-packer.cpp
base-serialize.cpp
base-shellescape.cpp
base-stacktrace.cpp
base-stream.cpp
base-string.cpp
base-timer.cpp
base-tlsutility.cpp
base-utility.cpp
base-value.cpp
config-apply.cpp
config-ops.cpp
icinga-checkresult.cpp
icinga-dependencies.cpp
icinga-legacytimeperiod.cpp
icinga-macros.cpp
icinga-notification.cpp
icinga-perfdata.cpp
methods-pluginnotificationtask.cpp
remote-certificate-fixture.cpp
remote-configpackageutility.cpp
remote-httpserverconnection.cpp
remote-httpmessage.cpp
remote-url.cpp
${base_OBJS}
$<TARGET_OBJECTS:config>
$<TARGET_OBJECTS:remote>
$<TARGET_OBJECTS:icinga>
$<TARGET_OBJECTS:methods>
)
if(ICINGA2_UNITY_BUILD)
mkunity_target(base test base_test_SOURCES)
endif()
add_executable(testbase
${base_test_SOURCES}
)
target_link_libraries(testbase testdeps)
target_discover_boost_tests(testbase)
if(ICINGA2_WITH_LIVESTATUS)
set(livestatus_test_SOURCES
icingaapplication-fixture.cpp
livestatus-fixture.cpp
livestatus.cpp
${base_OBJS}
$<TARGET_OBJECTS:config>
$<TARGET_OBJECTS:remote>
$<TARGET_OBJECTS:icinga>
$<TARGET_OBJECTS:livestatus>
$<TARGET_OBJECTS:methods>
)
if(ICINGA2_UNITY_BUILD)
mkunity_target(livestatus test livestatus_test_SOURCES)
endif()
add_executable(testlivestatus
${livestatus_test_SOURCES}
)
target_link_libraries(testlivestatus testdeps)
target_discover_boost_tests(testlivestatus)
endif()
set(icinga_checkable_test_SOURCES
icingaapplication-fixture.cpp
icinga-checkable-fixture.cpp
icinga-checkable-flapping.cpp
${base_OBJS}
$<TARGET_OBJECTS:config>
$<TARGET_OBJECTS:remote>
$<TARGET_OBJECTS:icinga>
$<TARGET_OBJECTS:cli>
)
if(ICINGA2_UNITY_BUILD)
mkunity_target(icinga_checkable test icinga_checkable_test_SOURCES)
endif()
add_executable(icinga_checkable
${icinga_checkable_test_SOURCES}
)
target_link_libraries(icinga_checkable testdeps)
target_discover_boost_tests(icinga_checkable)