find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Test REQUIRED)

set(TEST_WARNINGS -Wall -Wextra -Wconversion)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    list(APPEND TEST_WARNINGS -Werror)
endif()

add_executable(ValidatorTest ValidatorTest.cpp)
target_link_libraries(ValidatorTest PRIVATE Qt${QT_VERSION_MAJOR}::Test btrfs-assistant-core)
target_compile_options(ValidatorTest PRIVATE ${TEST_WARNINGS})
add_test(NAME ValidatorTest COMMAND ValidatorTest)

add_executable(SafePathTest SafePathTest.cpp)
target_link_libraries(SafePathTest PRIVATE Qt${QT_VERSION_MAJOR}::Test btrfs-assistant-core)
target_compile_options(SafePathTest PRIVATE ${TEST_WARNINGS})
add_test(NAME SafePathTest COMMAND SafePathTest)

# The same tests against the fallback used on kernels without openat2()
add_executable(SafePathFallbackTest SafePathTest.cpp ${PROJECT_SOURCE_DIR}/src/core/SafePath.cpp)
target_include_directories(SafePathFallbackTest PRIVATE ${PROJECT_SOURCE_DIR}/src)
target_compile_definitions(SafePathFallbackTest PRIVATE SAFEPATH_TEST_WITHOUT_OPENAT2)
target_link_libraries(SafePathFallbackTest PRIVATE Qt${QT_VERSION_MAJOR}::Test)
target_compile_options(SafePathFallbackTest PRIVATE ${TEST_WARNINGS})
add_test(NAME SafePathFallbackTest COMMAND SafePathFallbackTest)

# The GUI's copy of files opened through the helper, for Open and Save a Copy in the file browser
add_executable(FileExportTest FileExportTest.cpp ${PROJECT_SOURCE_DIR}/src/ui/FileExport.cpp)
target_include_directories(FileExportTest PRIVATE ${PROJECT_SOURCE_DIR}/src)
target_link_libraries(FileExportTest PRIVATE Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::DBus)
target_compile_options(FileExportTest PRIVATE ${TEST_WARNINGS})
add_test(NAME FileExportTest COMMAND FileExportTest)

# Runs the helper's D-Bus service unprivileged on a private bus.  Without root CoreService manages nothing, which is enough
# to check the API, authorization and marshalling.
find_program(DBUS_DAEMON dbus-daemon)
if(DBUS_DAEMON)
    add_executable(HelperServiceTest HelperServiceTest.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/Authorizer.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/GrantTable.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/HelperService.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/WorkQueue.cpp
    )
    target_include_directories(HelperServiceTest PRIVATE ${PROJECT_SOURCE_DIR}/src)
    target_link_libraries(HelperServiceTest PRIVATE Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::DBus btrfs-assistant-common
                                                    btrfs-assistant-core)
    target_compile_definitions(HelperServiceTest PRIVATE DBUS_DAEMON="${DBUS_DAEMON}" MOCK_POLKIT="$<TARGET_FILE:MockPolkit>"
                                                         API_XML="${PROJECT_SOURCE_DIR}/dbus/org.btrfsassistant.Helper1.xml")
    add_dependencies(HelperServiceTest MockPolkit)
    target_compile_options(HelperServiceTest PRIVATE ${TEST_WARNINGS})
    add_test(NAME HelperServiceTest COMMAND HelperServiceTest)

    # The GUI's client against the same service, for how it tracks and renews its grant
    add_executable(DBusBackendTest DBusBackendTest.cpp
        ${PROJECT_SOURCE_DIR}/src/client/Backend.h
        ${PROJECT_SOURCE_DIR}/src/client/CliBackend.h
        ${PROJECT_SOURCE_DIR}/src/client/DBusBackend.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/Authorizer.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/GrantTable.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/HelperService.cpp
        ${PROJECT_SOURCE_DIR}/src/helper/WorkQueue.cpp
    )
    target_include_directories(DBusBackendTest PRIVATE ${PROJECT_SOURCE_DIR}/src)
    target_link_libraries(DBusBackendTest PRIVATE Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::DBus btrfs-assistant-common
                                                  btrfs-assistant-core)
    target_compile_definitions(DBusBackendTest PRIVATE DBUS_DAEMON="${DBUS_DAEMON}" MOCK_POLKIT="$<TARGET_FILE:MockPolkit>")
    add_dependencies(DBusBackendTest MockPolkit)
    target_compile_options(DBusBackendTest PRIVATE ${TEST_WARNINGS})
    add_test(NAME DBusBackendTest COMMAND DBusBackendTest)
endif()

# The loop-device integration test, run by integration/run-integration-tests.sh as root in a VM, not by ctest
add_executable(MockPolkit integration/MockPolkit.cpp)
target_link_libraries(MockPolkit PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBus)
target_compile_options(MockPolkit PRIVATE ${TEST_WARNINGS})
set_target_properties(MockPolkit PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/integration)

add_executable(HelperIntegrationTest integration/HelperIntegrationTest.cpp ${PROJECT_SOURCE_DIR}/src/client/DBusBackend.cpp
                                     ${PROJECT_SOURCE_DIR}/src/client/Backend.h ${PROJECT_SOURCE_DIR}/src/client/CliBackend.h)
target_include_directories(HelperIntegrationTest PRIVATE ${PROJECT_SOURCE_DIR}/src)
target_link_libraries(HelperIntegrationTest PRIVATE Qt${QT_VERSION_MAJOR}::Test Qt${QT_VERSION_MAJOR}::DBus btrfs-assistant-common)
target_compile_options(HelperIntegrationTest PRIVATE ${TEST_WARNINGS})
set_target_properties(HelperIntegrationTest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/integration)
