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
|
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
execute_process(COMMAND
"${CMAKE_COMMAND}" -E copy_directory "${PROJECT_SOURCE_DIR}/private"
"${CMAKE_CURRENT_BINARY_DIR}/dispatch")
execute_process(COMMAND
"${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/leaks-wrapper.sh"
"${CMAKE_CURRENT_BINARY_DIR}/leaks-wrapper")
else()
execute_process(COMMAND
"${CMAKE_COMMAND}" -E create_symlink "${PROJECT_SOURCE_DIR}/private"
"${CMAKE_CURRENT_BINARY_DIR}/dispatch")
execute_process(COMMAND
"${CMAKE_COMMAND}" -E create_symlink "${CMAKE_CURRENT_SOURCE_DIR}/leaks-wrapper.sh"
"${CMAKE_CURRENT_BINARY_DIR}/leaks-wrapper")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL Linux)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt")
endif()
add_library(bsdtests
STATIC
bsdtests.c
dispatch_test.c)
target_include_directories(bsdtests
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}
PUBLIC
# bsdtests.h needs config_ac.h
${PROJECT_BINARY_DIR})
if (WIN32)
target_sources(bsdtests
PRIVATE
generic_win_port.c)
target_compile_definitions(bsdtests
PUBLIC
_CRT_NONSTDC_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
_USE_MATH_DEFINES)
target_link_libraries(bsdtests
PUBLIC
bcrypt)
endif ()
add_executable(bsdtestharness
bsdtestharness.c)
target_include_directories(bsdtestharness
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR})
target_link_libraries(bsdtestharness
PRIVATE
bsdtests
dispatch)
function(add_unit_test name)
set(options DISABLED_TEST)
set(single_value_args)
set(multiple_value_args SOURCES)
cmake_parse_arguments(AUT "${options}" "${single_value_args}" "${multiple_value_args}" ${ARGN})
if(AUT_DISABLED_TEST)
return()
endif()
add_executable(${name} ${AUT_SOURCES})
target_include_directories(${name}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR})
if(ENABLE_SWIFT)
# For testing in swift.org CI system; make deadlines lenient by default
# to reduce probability of test failures due to machine load.
target_compile_options(${name} PRIVATE -DLENIENT_DEADLINES=1)
endif()
target_include_directories(${name}
SYSTEM BEFORE PRIVATE
"${BlocksRuntime_INCLUDE_DIR}")
if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
target_compile_options(${name} PRIVATE -Xclang -fblocks)
target_compile_options(${name} PRIVATE /W3 -Wno-deprecated-declarations)
else()
target_compile_options(${name} PRIVATE -fblocks)
target_compile_options(${name} PRIVATE -Wall -Wno-deprecated-declarations)
endif()
# Without this flag, cross-compiling static test executables for Android armv7
# fails with the multiple definition errors seen in android/ndk#176, so I
# pulled in this workaround noted there. The tests build and run with this
# flag applied.
if(NOT BUILD_SHARED_LIBS AND CMAKE_SYSTEM_NAME STREQUAL Android AND
CMAKE_SYSTEM_PROCESSOR STREQUAL armv7-a)
target_link_options(${name} PRIVATE "LINKER:--allow-multiple-definition")
endif()
target_link_libraries(${name}
PRIVATE
dispatch
Threads::Threads
BlocksRuntime::BlocksRuntime)
target_link_libraries(${name} PRIVATE bsdtests)
add_test(NAME ${name}
COMMAND bsdtestharness $<TARGET_FILE:${name}>)
set_tests_properties(${name}
PROPERTIES
TIMEOUT 120
DEPENDS bsdtestharness
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
if(NOT leaks_EXECUTABLE)
set_tests_properties(${name}
PROPERTIES
ENVIRONMENT NOLEAKS=1)
endif()
endfunction()
# Tests that reliably pass on all platforms
set(DISPATCH_C_TESTS
apply
api
debug
queue_finalizer
overcommit
context_for_key
after
timer
timer_short
timer_timeout
sema
timer_bit31
timer_bit63
timer_set_time
data
io_muxed
io_net
io_pipe
io_pipe_close
select)
# Tests that usually pass, but occasionally fail.
# Excluded by default for purposes of Swift CI
if(EXTENDED_TEST_SUITE)
# When dispatch_group is reenabled here, also remove the if(EXTENDED_TEST_SUITE) condition below
list(APPEND DISPATCH_C_TESTS
priority
concur
group
read
read2
starfish
suspend_timer
pingpong
drift
readsync
cascade
io)
# an oddball; dispatch_priority.c compiled with -DUSE_SET_TARGET_QUEUE=1
add_unit_test(dispatch_priority2 SOURCES dispatch_priority.c)
target_compile_options(dispatch_priority2 PRIVATE -DUSE_SET_TARGET_QUEUE=1)
endif()
# add C tests for platform-specific functionality when applicable
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
list(APPEND DISPATCH_C_TESTS
deadname
proc
vm
vnode)
endif()
foreach(test ${DISPATCH_C_TESTS})
add_unit_test(dispatch_${test}
SOURCES
dispatch_${test}.c)
endforeach()
set_tests_properties(dispatch_io_pipe PROPERTIES TIMEOUT 15)
set_tests_properties(dispatch_io_pipe_close PROPERTIES TIMEOUT 5)
# test dispatch API for various C/CXX language variants
add_unit_test(dispatch_c99 SOURCES dispatch_c99.c)
add_unit_test(dispatch_plusplus SOURCES dispatch_plusplus.cpp)
# test-specific link options
if(WIN32)
target_link_libraries(dispatch_io_muxed PRIVATE WS2_32)
target_link_libraries(dispatch_io_net PRIVATE WS2_32)
else()
# When dispatch_group is reenabled above, remove this
if(EXTENDED_TEST_SUITE)
target_link_libraries(dispatch_group PRIVATE m)
endif()
target_link_libraries(dispatch_timer_short PRIVATE m)
endif()
# test-specific compile options
set_target_properties(dispatch_c99 PROPERTIES C_STANDARD 99)
|