project(tests C)

include_directories(
  ${CMAKE_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMOCKA_INCLUDE_DIR}
)

set(PRELOAD_LIBS ${UID_WRAPPER_LOCATION})

if (OSX)
    set(TEST_ENVIRONMENT DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${PRELOAD_LIBS};UID_WRAPPER=1)
    add_definitions(-DOSX)
else ()
    set(TEST_ENVIRONMENT LD_PRELOAD=${PRELOAD_LIBS};UID_WRAPPER_ROOT=1)
endif ()

set(TESTSUITE_LIBRARIES ${UWRAP_REQUIRED_LIBRARIES} ${CMOCKA_LIBRARY})

if (BSD)
    add_definitions(-DBSD)
endif (BSD)

set(UWRAP_UID_TESTS
     test_setuid
     test_seteuid)

if (HAVE_SETREUID)
    list(APPEND UWRAP_UID_TESTS test_setreuid)
endif (HAVE_SETREUID)

if (HAVE_SETRESUID)
    list(APPEND UWRAP_UID_TESTS test_setresuid test_setuid_euid1 test_setuid_euid2)
    if (HAVE_GETRESUID)
        list(APPEND UWRAP_UID_TESTS test_getresuid)
    endif (HAVE_GETRESUID)
endif (HAVE_SETRESUID)

set(UWRAP_SYSCALL_UID_TESTS
    test_syscall_setuid
    test_syscall_setreuid
    test_syscall_setresuid)

set(UWRAP_GID_TESTS
    test_setgid
    test_setegid)

if (HAVE_SETREGID)
    list(APPEND UWRAP_GID_TESTS test_setregid)
endif (HAVE_SETREGID)

if (HAVE_SETRESGID)
    list(APPEND UWRAP_GID_TESTS test_setresgid)

    if (HAVE_GETRESGID)
        list(APPEND UWRAP_GID_TESTS test_setresgid_unprivileged)
    endif (HAVE_GETRESGID)
endif (HAVE_SETRESGID)

set(UWRAP_TESTS
    ${UWRAP_UID_TESTS}
    ${UWRAP_GID_TESTS}
    test_setgroups
    test_syscall
    ${UWRAP_SYSCALL_UID_TESTS}
    test_syscall_gid)

if (HAVE_LINUX_32BIT_SYSCALLS)
    set(UWRAP_TESTS
        ${UWRAP_TESTS}
        test_syscall_setuid32
        test_syscall_setreuid32
        test_syscall_setresuid32
        test_syscall_setgid32
        test_syscall_setregid32
        test_syscall_setresgid32
        test_syscall_setgroups32)
endif (HAVE_LINUX_32BIT_SYSCALLS)

foreach(_UWRAP_TEST ${UWRAP_TESTS})
    add_cmocka_test(${_UWRAP_TEST} ${_UWRAP_TEST}.c ${TESTSUITE_LIBRARIES})

    set_property(
        TEST
            ${_UWRAP_TEST}
        PROPERTY
            ENVIRONMENT ${TEST_ENVIRONMENT};UID_WRAPPER=1)
endforeach()

# helper library implementing uid_wrapper_enabled()
add_library(uwrap_enabled SHARED uwrap_enabled.c)

add_cmocka_test(test_uwrap_enabled test_uwrap_enabled.c ${CMOCKA_LIBRARY} uwrap_enabled)
set_property(
    TEST
        test_uwrap_enabled
    PROPERTY
        ENVIRONMENT ${TEST_ENVIRONMENT};UID_WRAPPER=1)

add_cmocka_test(test_uwrap_disabled test_uwrap_disabled.c ${CMOCKA_LIBRARY})
set_property(
    TEST
        test_uwrap_disabled
    PROPERTY
        ENVIRONMENT ${TEST_ENVIRONMENT})

add_cmocka_test(test_thread_setuid test_thread_setuid.c ${CMOCKA_LIBRARY})
target_link_libraries(test_thread_setuid ${CMAKE_THREAD_LIBS_INIT})
set_property(
    TEST
        test_thread_setuid
    PROPERTY
        ENVIRONMENT ${TEST_ENVIRONMENT};UID_WRAPPER=1;CMOCKA_TEST_ABORT=1)

add_cmocka_test(test_thread_setreuid test_thread_setreuid.c ${CMOCKA_LIBRARY})
target_link_libraries(test_thread_setreuid ${CMAKE_THREAD_LIBS_INIT})
set_property(
    TEST
        test_thread_setreuid
    PROPERTY
        ENVIRONMENT ${TEST_ENVIRONMENT};UID_WRAPPER=1;CMOCKA_TEST_ABORT=1)

add_cmocka_test(test_thread_sync_setreuid test_thread_sync_setreuid.c ${CMOCKA_LIBRARY})
target_link_libraries(test_thread_sync_setreuid ${CMAKE_THREAD_LIBS_INIT})
set_property(
    TEST
        test_thread_sync_setreuid
    PROPERTY
        ENVIRONMENT ${TEST_ENVIRONMENT};UID_WRAPPER=1;CMOCKA_TEST_ABORT=1)

add_cmocka_test(test_glibc_thread_support test_glibc_thread_support.c ${CMOCKA_LIBRARY})
target_link_libraries(test_glibc_thread_support ${CMAKE_THREAD_LIBS_INIT})
set_property(
    TEST
        test_glibc_thread_support
    PROPERTY
        ENVIRONMENT ${TEST_ENVIRONMENT};UID_WRAPPER=1)

if (LINUX)
    add_executable(getuids getuids.c)
endif (LINUX)

