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