syncthingtray/syncthingconnector/CMakeLists.txt
Martchus ecece11df3 Introduce basic test setup for models
This test setup utilizes the "mocked" configuration so far only used for
manual testing. This allows adding unit tests for models without having to
run Syncthing itself. The test is pretty basic itself at this point.
2024-04-26 23:04:47 +02:00

189 lines
7.5 KiB
CMake

cmake_minimum_required(VERSION 3.17.0 FATAL_ERROR)
# metadata
set(META_PROJECT_NAME syncthingconnector)
set(META_PROJECT_TYPE library)
set(META_APP_NAME "Connection backend of Syncthing Tray")
set(META_APP_DESCRIPTION "Connection backend of Syncthing Tray")
set(META_PROJECT_VARNAME_UPPER LIB_SYNCTHING_CONNECTOR)
set(META_PUBLIC_QT_MODULES Core Network)
# add project files
set(HEADER_FILES
syncthingcompletion.h
syncthingdir.h
syncthingdev.h
syncthingconnection.h
syncthingconnectionenums.h
syncthingconnectionstatus.h
syncthingconnectionsettings.h
syncthingnotifier.h
syncthingconfig.h
syncthingprocess.h
syncthingservice.h
qstringhash.h
utils.h)
set(SRC_FILES
syncthingdir.cpp
syncthingdev.cpp
syncthingconnection.cpp
syncthingconnection_requests.cpp
syncthingconnectionsettings.cpp
syncthingnotifier.cpp
syncthingconfig.cpp
syncthingprocess.cpp
syncthingservice.cpp
utils.cpp)
set(TEST_HEADER_FILES)
set(TEST_SRC_FILES tests/connectiontests.cpp tests/misctests.cpp)
set(TS_FILES translations/${META_PROJECT_NAME}_zh_CN.ts translations/${META_PROJECT_NAME}_cs_CZ.ts
translations/${META_PROJECT_NAME}_de_DE.ts translations/${META_PROJECT_NAME}_en_US.ts)
# find c++utilities
find_package(${PACKAGE_NAMESPACE_PREFIX}c++utilities${CONFIGURATION_PACKAGE_SUFFIX} 5.10.0 REQUIRED)
use_cpp_utilities(VISIBILITY PUBLIC)
# find qtutilities (only headers and CMake modules used)
find_package(${PACKAGE_NAMESPACE_PREFIX}qtutilities${CONFIGURATION_PACKAGE_SUFFIX_QTUTILITIES} 6.3.0 REQUIRED)
use_qt_utilities(ONLY_HEADERS VISIBILITY PUBLIC)
# find boost libraries
option(USE_BOOST_PROCESS "enables Boost.Process for improved behavior of the launcher" ON)
if (USE_BOOST_PROCESS)
option(BOOST_STATIC_LINKAGE "${STATIC_LINKAGE}" "link statically against Boost (instead of dynamically)")
set(Boost_USE_MULTITHREADED ON)
if (BOOST_STATIC_LINKAGE)
set(Boost_USE_STATIC_LIBS ON)
endif ()
# add Boost::boost target which represents include directory for header-only deps and add Boost::filesystem as it is
# needed by Boost.Process
set(BOOST_ARGS 1.75 REQUIRED) # 1.66 does not invoke on_exit handler correctly, 1.75 was the next version I tested and it
# worked
list(APPEND BOOST_ARGS COMPONENTS filesystem)
use_package(TARGET_NAME Boost::boost PACKAGE_NAME Boost PACKAGE_ARGS "${BOOST_ARGS}")
use_package(TARGET_NAME Boost::filesystem PACKAGE_NAME Boost PACKAGE_ARGS "${BOOST_ARGS}")
list(APPEND META_PUBLIC_COMPILE_DEFINITIONS ${META_PROJECT_VARNAME_UPPER}_BOOST_PROCESS)
if (WIN32)
list(APPEND PRIVATE_LIBRARIES ws2_32) # needed by Boost.Asio
endif ()
if (MINGW)
# workaround https://github.com/boostorg/process/issues/96
set_property(
SOURCE syncthingprocess.cpp
APPEND
PROPERTY COMPILE_DEFINITIONS BOOST_USE_WINDOWS_H WIN32_LEAN_AND_MEAN)
elseif (MSVC)
# prevent "Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately."
set_property(
SOURCE syncthingprocess.cpp
APPEND
PROPERTY COMPILE_DEFINITIONS _WIN32_WINNT=0x0601)
endif ()
# add threading library as it is needed by Boost.Process
use_package(TARGET_NAME Threads::Threads PACKAGE_NAME Threads PACKAGE_ARGS REQUIRED)
endif ()
# link also explicitly against the following Qt modules
list(APPEND ADDITIONAL_QT_MODULES Network)
# configure support for controlling Syncthing via systemd service
if (UNIX AND NOT APPLE)
set(ENABLE_SYSTEMD_SUPPORT_BY_DEFAULT ON)
else ()
set(ENABLE_SYSTEMD_SUPPORT_BY_DEFAULT OFF)
endif ()
option(SYSTEMD_SUPPORT "enables support for controlling Syncthing systemd service" ${ENABLE_SYSTEMD_SUPPORT_BY_DEFAULT})
if (SYSTEMD_SUPPORT)
list(
APPEND
DBUS_FILES
org.freedesktop.DBus.Properties.xml
org.freedesktop.login1.LoginManager.xml
org.freedesktop.systemd1.Manager.xml
org.freedesktop.systemd1.Service.xml
org.freedesktop.systemd1.Unit.xml)
set_source_files_properties(org.freedesktop.systemd1.Manager.xml PROPERTIES INCLUDE syncthingservice.h)
list(APPEND META_PUBLIC_COMPILE_DEFINITIONS ${META_PROJECT_VARNAME_UPPER}_SUPPORT_SYSTEMD)
message(STATUS "systemd support enabled")
else ()
message(STATUS "systemd support disabled")
endif ()
# configure whether the SyncthingConnection class should be mocked for test purposes
option(SYNCTHING_CONNECTION_MOCKED
"enables mocking the SyncthingConnection class so it will provide only some fixed test data" OFF)
if (SYNCTHING_CONNECTION_MOCKED)
list(APPEND SRC_FILES syncthingconnectionmockhelpers.h syncthingconnectionmockhelpers.cpp)
set_property(
SOURCE syncthingconnection.cpp syncthingconnection_requests.cpp syncthingconnectionmockhelpers.h
syncthingconnectionmockhelpers.cpp
APPEND
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME_UPPER}_CONNECTION_MOCKED)
message(WARNING "SyncthingConnection class will be mocked")
endif ()
# configure whether the SyncthingService class should be mocked for test purposes
option(SYNCTHING_SERVICE_MOCKED "enables mocking the SyncthingService class so it will provide some fake status" OFF)
if (SYNCTHING_SERVICE_MOCKED)
set_property(
SOURCE syncthingservice.cpp
APPEND
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME_UPPER}_SERVICE_MOCKED)
message(WARNING "SyncthingService class will be mocked")
endif ()
# include modules to apply configuration
include(BasicConfig)
include(QtConfig)
include(WindowsResources)
include(LibraryTarget)
# link tests against test helper (can't use find_package because testhelper target is not present at this point)
list(APPEND TEST_LIBRARIES syncthingtesthelper)
list(APPEND PRIVATE_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/../testhelper/include")
include(TestTarget)
# avoid running this test in parallel with other tests spawning a Syncthing test instance
if (META_MAIN_TEST_NAME)
set_tests_properties("${META_MAIN_TEST_NAME}" PROPERTIES RESOURCE_LOCK "syncthingtestinstance")
endif ()
# add additional library with mocked SyncthingConnector class so models can be tested without running Syncthing itself
if (EXCLUDE_TESTS_FROM_ALL)
set(TESTS_EXCLUSION EXCLUDE_FROM_ALL)
else ()
unset(TESTS_EXCLUSION)
endif ()
add_library(
${META_TARGET_NAME}_mocked
${TESTS_EXCLUSION}
OBJECT
syncthingconnection.h
syncthingconnection.cpp
syncthingconnection_requests.cpp
syncthingconnectionmockhelpers.h
syncthingconnectionmockhelpers.cpp)
target_link_libraries(
${META_TARGET_NAME}_mocked
PUBLIC ${META_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}"
PRIVATE "${PRIVATE_LIBRARIES}")
target_include_directories(
${META_TARGET_NAME}_mocked
PUBLIC ${TARGET_INCLUDE_DIRECTORY_BUILD_INTERFACE} ${TARGET_GENERATED_INCLUDE_DIRECTORY} ${PUBLIC_INCLUDE_DIRS}
PRIVATE ${PRIVATE_INCLUDE_DIRS})
target_compile_definitions(
${META_TARGET_NAME}_mocked
PUBLIC ${META_PUBLIC_COMPILE_DEFINITIONS} ${META_PROJECT_VARNAME_UPPER}_MOCKED
${META_PROJECT_VARNAME_UPPER}_CONNECTION_MOCKED SyncthingConnection=SyncthingConnectionMocked
PRIVATE "${META_PRIVATE_COMPILE_DEFINITIONS}")
target_compile_options(
${META_TARGET_NAME}_mocked
PUBLIC "${META_PUBLIC_COMPILE_OPTIONS}"
PRIVATE "${META_PRIVATE_COMPILE_OPTIONS}")
set_target_properties(${META_TARGET_NAME}_mocked PROPERTIES CXX_STANDARD "${META_CXX_STANDARD}")
include(Doxygen)
include(ConfigHeader)