tests: add test_echo_tcp_sendmmsg_recvmmsg
[socket_wrapper.git] / tests / CMakeLists.txt
1 project(tests C)
2
3 include_directories(
4   ${CMAKE_BINARY_DIR}
5   ${CMAKE_CURRENT_SOURCE_DIR}
6   ${CMAKE_SOURCE_DIR}/src
7   ${CMOCKA_INCLUDE_DIR}
8 )
9
10 set(TORTURE_LIBRARY torture)
11
12 # RFC862 echo server
13 add_executable(echo_srv echo_srv.c)
14 target_compile_options(echo_srv
15                        PRIVATE
16                            ${DEFAULT_C_COMPILE_FLAGS}
17                            -D_GNU_SOURCE)
18 target_link_libraries(echo_srv ${SWRAP_REQUIRED_LIBRARIES})
19 if (DEFINED DEFAULT_LINK_FLAGS)
20     set_target_properties(echo_srv
21                           PROPERTIES
22                               LINK_FLAGS ${DEFAULT_LINK_FLAGS})
23 endif()
24
25 add_library(${TORTURE_LIBRARY} STATIC torture.c)
26 target_compile_options(${TORTURE_LIBRARY}
27                        PRIVATE
28                            ${DEFAULT_C_COMPILE_FLAGS}
29                            -D_GNU_SOURCE)
30 target_link_libraries(${TORTURE_LIBRARY}
31     ${CMOCKA_LIBRARY}
32     ${SWRAP_REQUIRED_LIBRARIES}
33     ${CMAKE_THREAD_LIBS_INIT})
34
35 set(SWRAP_THREADED_TESTS
36     test_thread_sockets
37     test_thread_echo_tcp_connect
38     test_thread_echo_tcp_write_read
39     test_thread_echo_tcp_sendmsg_recvmsg
40     test_thread_echo_udp_send_recv)
41
42 set(SWRAP_TESTS
43     test_ioctl
44     test_tcp_listen
45     test_tcp_dup2
46     test_fcntl
47     test_echo_tcp_connect
48     test_echo_tcp_bind
49     test_echo_tcp_socket_options
50     test_echo_tcp_sendmsg_recvmsg
51     test_echo_tcp_sendmmsg_recvmmsg
52     test_echo_tcp_write_read
53     test_echo_tcp_writev_readv
54     test_echo_tcp_get_peer_sock_name
55     test_echo_udp_sendto_recvfrom
56     test_echo_udp_send_recv
57     test_echo_udp_sendmsg_recvmsg
58     test_swrap_unit
59     test_max_sockets
60     test_public_functions
61     test_close_failure
62     test_tcp_socket_overwrite
63     ${SWRAP_THREADED_TESTS})
64
65 if (HAVE_STRUCT_MSGHDR_MSG_CONTROL)
66     set(SWRAP_TESTS ${SWRAP_TESTS} test_sendmsg_recvmsg_fd test_echo_tcp_sendmsg_recvmsg_fd)
67 endif (HAVE_STRUCT_MSGHDR_MSG_CONTROL)
68
69 function(ADD_CMOCKA_TEST_ENVIRONMENT _TEST_NAME)
70     if (CMAKE_BUILD_TYPE)
71         string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
72         if (CMAKE_BUILD_TYPE_LOWER STREQUAL "addresssanitizer")
73             find_library(ASAN_LIBRARY
74                          NAMES asan)
75             if (NOT ASAN_LIBRARY)
76                 foreach(version RANGE 10 1)
77                     if (NOT ASAN_LIBRARY)
78                         find_library(ASAN_LIBRARY libasan.so.${version})
79                     endif()
80                 endforeach()
81             endif()
82         endif()
83     endif()
84
85     if (ASAN_LIBRARY)
86         list(APPEND PRELOAD_LIBRARIES ${ASAN_LIBRARY})
87     endif()
88     list(APPEND PRELOAD_LIBRARIES ${SOCKET_WRAPPER_LOCATION})
89
90     if (OSX)
91         set(TORTURE_ENVIRONMENT "DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${SOCKET_WRAPPER_LOCATION}")
92     else ()
93         string(REPLACE ";" ":" _TMP_ENV "${PRELOAD_LIBRARIES}")
94         set(TORTURE_ENVIRONMENT "LD_PRELOAD=${_TMP_ENV}")
95     endif()
96
97     if (CMAKE_BUILD_TYPE)
98         string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
99         if (CMAKE_BUILD_TYPE_LOWER STREQUAL "addresssanitizer" OR
100             CMAKE_BUILD_TYPE_LOWER STREQUAL "threadsanitizer" OR
101             CMAKE_BUILD_TYPE_LOWER STREQUAL "undefinedsanitizer")
102             list(APPEND TORTURE_ENVIRONMENT "SOCKET_WRAPPER_DISABLE_DEEPBIND=1")
103         endif()
104     endif()
105
106     set_property(TEST
107                     ${_TEST_NAME}
108                 PROPERTY
109                     ENVIRONMENT "${TORTURE_ENVIRONMENT}")
110 endfunction()
111
112 foreach(_SWRAP_TEST ${SWRAP_TESTS})
113     add_cmocka_test(${_SWRAP_TEST}
114                     SOURCES ${_SWRAP_TEST}.c
115                     COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS} -D_GNU_SOURCE
116                     LINK_LIBRARIES ${TORTURE_LIBRARY} socket_wrapper_noop
117                     LINK_OPTIONS ${DEFAULT_LINK_FLAGS})
118     add_cmocka_test_environment(${_SWRAP_TEST})
119 endforeach()
120
121 if (HELGRIND_TESTING)
122     find_program(VALGRIND_EXECUTABLE valgrind)
123     if (VALGRIND_EXECUTABLE)
124         set(VALGRIND_HELGRIND_OPTIONS -v --trace-children=yes --tool=helgrind --error-exitcode=1 --read-var-info=yes --suppressions=${CMAKE_CURRENT_SOURCE_DIR}/helgrind.supp)
125
126         foreach(_TEST ${SWRAP_THREADED_TESTS})
127             set(_HELGRIND_TEST "helgrind_${_TEST}")
128
129             add_test(NAME ${_HELGRIND_TEST} COMMAND ${VALGRIND_EXECUTABLE} ${VALGRIND_HELGRIND_OPTIONS} ${CMAKE_CURRENT_BINARY_DIR}/${_TEST})
130             if (OSX)
131                 set_property(
132                     TEST
133                         ${_HELGRIND_TEST}
134                     PROPERTY
135                         ENVIRONMENT DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${SOCKET_WRAPPER_LOCATION})
136             else ()
137                 set_property(
138                     TEST
139                         ${_HELGRIND_TEST}
140                     PROPERTY
141                         ENVIRONMENT LD_PRELOAD=${SOCKET_WRAPPER_LOCATION} SOCKET_WRAPPER_DISABLE_DEEPBIND=1)
142             endif()
143         endforeach()
144     endif()
145 endif()
146
147 # test_fork_pthread
148 add_library(thread_deadlock SHARED thread_deadlock.c)
149 target_link_libraries(thread_deadlock ${CMAKE_THREAD_LIBS_INIT})
150 target_compile_options(thread_deadlock PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
151
152 add_cmocka_test(test_fork_thread_deadlock
153                 SOURCES test_fork_thread_deadlock.c
154                 COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS} -D_GNU_SOURCE
155                 LINK_LIBRARIES ${TORTURE_LIBRARY} thread_deadlock
156                 LINK_OPTIONS ${DEFAULT_LINK_FLAGS})
157 add_cmocka_test_environment(test_fork_thread_deadlock)