cmake: Support running the tests with AddressSanitizer
authorAndreas Schneider <asn@samba.org>
Tue, 7 May 2019 10:32:29 +0000 (12:32 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Mon, 3 Jun 2019 10:54:22 +0000 (12:54 +0200)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Gary Lockyer <gary@samba.org>
tests/CMakeLists.txt

index 1e42ab60cd5c1f11cb4cdcb365fa73506bb4f735..f214dfe30d56cc688191717c74c60f23cd2e7b8c 100644 (file)
@@ -8,12 +8,45 @@ include_directories(
 
 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 ()
+function(ADD_CMOCKA_TEST_ENVIRONMENT _TEST_NAME)
+    if (CMAKE_BUILD_TYPE)
+        string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
+        if (CMAKE_BUILD_TYPE_LOWER STREQUAL "addresssanitizer")
+            find_library(ASAN_LIBRARY
+                         NAMES asan)
+            if (NOT ASAN_LIBRARY)
+                foreach(version RANGE 10 1)
+                    if (NOT ASAN_LIBRARY)
+                        find_library(ASAN_LIBRARY libasan.so.${version})
+                    endif()
+                endforeach()
+            endif()
+        endif()
+    endif()
+
+    if (ASAN_LIBRARY)
+        list(APPEND PRELOAD_LIBRARIES ${ASAN_LIBRARY})
+    endif()
+    list(APPEND PRELOAD_LIBRARIES ${UID_WRAPPER_LOCATION})
+
+    if (OSX)
+        set(TORTURE_ENVIRONMENT "DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${UID_WRAPPER_LOCATION}")
+    else ()
+        string(REPLACE ";" ":" _TMP_ENV "${PRELOAD_LIBRARIES}")
+        set(TORTURE_ENVIRONMENT "LD_PRELOAD=${_TMP_ENV}")
+    endif()
+
+    list(APPEND TORTURE_ENVIRONMENT UID_WRAPPER=1)
+
+    foreach(_arg ${ARGN})
+        list(APPEND TORTURE_ENVIRONMENT ${_arg})
+    endforeach()
+
+    set_property(TEST
+                    ${_TEST_NAME}
+                PROPERTY
+                    ENVIRONMENT "${TORTURE_ENVIRONMENT}")
+endfunction()
 
 set(TESTSUITE_LIBRARIES ${UWRAP_REQUIRED_LIBRARIES} ${CMOCKA_LIBRARY})
 
@@ -82,11 +115,7 @@ 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)
+    add_cmocka_test_environment(${_UWRAP_TEST} UID_WRAPPER_ROOT=1)
 endforeach()
 
 # helper library implementing uid_wrapper_enabled()
@@ -96,52 +125,31 @@ target_compile_options(uwrap_enabled
                            ${DEFAULT_C_COMPILE_FLAGS})
 
 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_environment(test_uwrap_enabled)
 
 add_cmocka_test(test_uwrap_disabled test_uwrap_disabled.c ${CMOCKA_LIBRARY})
 set_property(
     TEST
         test_uwrap_disabled
     PROPERTY
-        ENVIRONMENT ${TEST_ENVIRONMENT})
+        ENVIRONMENT LD_PRELOAD=${UID_WRAPPER_LOCATION})
 
 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_environment(test_thread_setuid UID_WRAPPER_ROOT=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_environment(test_thread_setreuid UID_WRAPPER_ROOT=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_environment(test_thread_sync_setreuid UID_WRAPPER_ROOT=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)
+add_cmocka_test_environment(test_glibc_thread_support UID_WRAPPER_ROOT=1 CMOCKA_TEST_ABORT=1)
 
 if (LINUX)
     add_executable(getuids getuids.c)
 endif (LINUX)
-