xref: /aosp_15_r20/external/google-fruit/tests/CMakeLists.txt (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
1*a65addddSAndroid Build Coastguard Worker
2*a65addddSAndroid Build Coastguard Workerinclude(CMakeParseArguments)
3*a65addddSAndroid Build Coastguard Worker
4*a65addddSAndroid Build Coastguard Workerif("${WIN32}")
5*a65addddSAndroid Build Coastguard Worker    # This defaults to OFF on Windows, since we don't support PCHs there.
6*a65addddSAndroid Build Coastguard Worker    option(FRUIT_TESTS_USE_PRECOMPILED_HEADERS "Whether to use pre-compiled headers (PCHs) in Fruit tests." OFF)
7*a65addddSAndroid Build Coastguard Worker
8*a65addddSAndroid Build Coastguard Worker    if ("${FRUIT_TESTS_USE_PRECOMPILED_HEADERS}")
9*a65addddSAndroid Build Coastguard Worker        # TODO: consider adding support for PCHs on Windows (at least when using MinGW).
10*a65addddSAndroid Build Coastguard Worker        message(FATAL_ERROR "Please rerun CMake without -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS, precompiled headers are not supported on Windows.")
11*a65addddSAndroid Build Coastguard Worker    endif()
12*a65addddSAndroid Build Coastguard Workerelse()
13*a65addddSAndroid Build Coastguard Worker    option(FRUIT_TESTS_USE_PRECOMPILED_HEADERS "Whether to use pre-compiled headers (PCHs) in Fruit tests." ON)
14*a65addddSAndroid Build Coastguard Workerendif()
15*a65addddSAndroid Build Coastguard Worker
16*a65addddSAndroid Build Coastguard Workerif("${WIN32}")
17*a65addddSAndroid Build Coastguard Worker  # No timeout on windows, the `timeout' executable has a different syntax.
18*a65addddSAndroid Build Coastguard Worker  set(TIMEOUT_COMMAND_PREFIX "")
19*a65addddSAndroid Build Coastguard Worker  set(TIMEOUT_COMMAND_PREFIX_STR "")
20*a65addddSAndroid Build Coastguard Workerelse()
21*a65addddSAndroid Build Coastguard Worker  set(TIMEOUT_COMMAND_PREFIX "timeout" "30")
22*a65addddSAndroid Build Coastguard Worker  set(TIMEOUT_COMMAND_PREFIX_STR "timeout 30")
23*a65addddSAndroid Build Coastguard Workerendif()
24*a65addddSAndroid Build Coastguard Worker
25*a65addddSAndroid Build Coastguard Workerset(VALGRIND_FLAGS
26*a65addddSAndroid Build Coastguard Worker    --leak-check=full --malloc-fill=AA --track-origins=yes --read-var-info=yes --num-callers=50 --error-exitcode=1 --gen-suppressions=all --suppressions=${CMAKE_SOURCE_DIR}/tests/valgrind_suppressions.supp)
27*a65addddSAndroid Build Coastguard Workerstring(REPLACE ";" " " VALGRIND_FLAGS_STR "${VALGRIND_FLAGS}")
28*a65addddSAndroid Build Coastguard Worker
29*a65addddSAndroid Build Coastguard Workerif(NOT "${WIN32}")
30*a65addddSAndroid Build Coastguard Worker  function(check_all_python_tests_listed DIRNAME)
31*a65addddSAndroid Build Coastguard Worker    # Join the list with " ".
32*a65addddSAndroid Build Coastguard Worker    string(REPLACE ";" " " STR "${ARGN}")
33*a65addddSAndroid Build Coastguard Worker    add_test(NAME check-all-python-tests-listed-${DIRNAME}
34*a65addddSAndroid Build Coastguard Worker             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
35*a65addddSAndroid Build Coastguard Worker             COMMAND bash -c -x "pwd; for f in \$(ls test_*.py); do echo \" ${STR} \" | fgrep -q \" \$f \" || { echo \"\$f not listed.\" && exit 1; }; done")
36*a65addddSAndroid Build Coastguard Worker  endfunction(check_all_python_tests_listed)
37*a65addddSAndroid Build Coastguard Workerendif()
38*a65addddSAndroid Build Coastguard Worker
39*a65addddSAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
40*a65addddSAndroid Build Coastguard Worker    set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_GNU})
41*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^Clang$")
42*a65addddSAndroid Build Coastguard Worker    set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_Clang})
43*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel")
44*a65addddSAndroid Build Coastguard Worker    set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_Intel})
45*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang")
46*a65addddSAndroid Build Coastguard Worker    set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_AppleClang})
47*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC")
48*a65addddSAndroid Build Coastguard Worker    set(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS ${FRUIT_ADDITIONAL_COMPILE_FLAGS_MSVC})
49*a65addddSAndroid Build Coastguard Workerendif()
50*a65addddSAndroid Build Coastguard Worker
51*a65addddSAndroid Build Coastguard Worker# Convert CMake list variable `FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS` to string variable.
52*a65addddSAndroid Build Coastguard Worker# CMake list variable becomes ";" delimiter when expanded.
53*a65addddSAndroid Build Coastguard Worker# Expand list items one by one into a string variable and separate them by spaces.
54*a65addddSAndroid Build Coastguard Workerforeach(FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS_ITEM IN LISTS FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS)
55*a65addddSAndroid Build Coastguard Worker  set(FRUIT_TEST_COMPILE_FLAGS "${FRUIT_TEST_COMPILE_FLAGS} ${FRUIT_ADDITIONAL_TEST_COMPILE_FLAGS_ITEM}")
56*a65addddSAndroid Build Coastguard Workerendforeach()
57*a65addddSAndroid Build Coastguard Worker
58*a65addddSAndroid Build Coastguard Workerif ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
59*a65addddSAndroid Build Coastguard Worker    set(FRUIT_TEST_COMPILE_FLAGS "${FRUIT_TEST_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${FRUIT_CXX_STANDARD_FLAGS}")
60*a65addddSAndroid Build Coastguard Workerelse()
61*a65addddSAndroid Build Coastguard Worker    set(FRUIT_TEST_COMPILE_FLAGS "${FRUIT_TEST_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${FRUIT_CXX_STANDARD_FLAGS}")
62*a65addddSAndroid Build Coastguard Workerendif()
63*a65addddSAndroid Build Coastguard Worker
64*a65addddSAndroid Build Coastguard Workerif ("${FRUIT_TESTS_USE_PRECOMPILED_HEADERS}")
65*a65addddSAndroid Build Coastguard Worker    if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
66*a65addddSAndroid Build Coastguard Worker        add_custom_command(
67*a65addddSAndroid Build Coastguard Worker            OUTPUT test_common-precompiled.h.gch
68*a65addddSAndroid Build Coastguard Worker            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
69*a65addddSAndroid Build Coastguard Worker            DEPENDS test_common.h fruit
70*a65addddSAndroid Build Coastguard Worker            COMMAND bash -c "${CMAKE_CXX_COMPILER} -x c++-header ${FRUIT_TEST_COMPILE_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/../include -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/test_common.h -o test_common-precompiled.h.gch")
71*a65addddSAndroid Build Coastguard Worker        add_custom_target(test-common-precompiled-header ALL DEPENDS test_common-precompiled.h.gch)
72*a65addddSAndroid Build Coastguard Worker        # Note that the "test_common-precompiled.h" header doesn't exist, but it's ok because GCC looks for
73*a65addddSAndroid Build Coastguard Worker        # test_common-precompiled.h.gch first. We don't call the precompiled header test_common.h.gch so that if GCC doesn't
74*a65addddSAndroid Build Coastguard Worker        # find it it reports an error instead of using the normal header.
75*a65addddSAndroid Build Coastguard Worker        set(FRUIT_TESTONLY_CXXFLAGS "-include${CMAKE_CURRENT_BINARY_DIR}/test_common-precompiled.h")
76*a65addddSAndroid Build Coastguard Worker
77*a65addddSAndroid Build Coastguard Worker    elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Clang|AppleClang)$")
78*a65addddSAndroid Build Coastguard Worker        add_custom_command(
79*a65addddSAndroid Build Coastguard Worker            OUTPUT test_common.pch
80*a65addddSAndroid Build Coastguard Worker            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
81*a65addddSAndroid Build Coastguard Worker            DEPENDS test_common.h fruit
82*a65addddSAndroid Build Coastguard Worker            COMMAND bash -c "${CMAKE_CXX_COMPILER} -x c++-header ${FRUIT_TEST_COMPILE_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}/../include -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_CURRENT_BINARY_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/test_common.h -o test_common.pch")
83*a65addddSAndroid Build Coastguard Worker        add_custom_target(test-common-precompiled-header ALL DEPENDS test_common.pch)
84*a65addddSAndroid Build Coastguard Worker    set(FRUIT_TESTONLY_CXXFLAGS "-include-pch ${CMAKE_CURRENT_BINARY_DIR}/test_common.pch")
85*a65addddSAndroid Build Coastguard Worker  else()
86*a65addddSAndroid Build Coastguard Worker
87*a65addddSAndroid Build Coastguard Worker    message(ERROR "Using pre-compiled headers in tests is only supported with GCC and Clang. Please add -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF to your cmake invocation and try again.")
88*a65addddSAndroid Build Coastguard Worker  endif()
89*a65addddSAndroid Build Coastguard Workerelse()
90*a65addddSAndroid Build Coastguard Worker    set(FRUIT_TESTONLY_CXXFLAGS "")
91*a65addddSAndroid Build Coastguard Workerendif()
92*a65addddSAndroid Build Coastguard Worker
93*a65addddSAndroid Build Coastguard Workerif("${FRUIT_ENABLE_COVERAGE}")
94*a65addddSAndroid Build Coastguard Worker  set(FRUIT_ENABLE_COVERAGE_PYTHON_BOOL "True")
95*a65addddSAndroid Build Coastguard Workerelse()
96*a65addddSAndroid Build Coastguard Worker  set(FRUIT_ENABLE_COVERAGE_PYTHON_BOOL "False")
97*a65addddSAndroid Build Coastguard Workerendif()
98*a65addddSAndroid Build Coastguard Worker
99*a65addddSAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(MSVC)$")
100*a65addddSAndroid Build Coastguard Worker  # These warnings are disabled for tests only, since they can only be produced when using fruit as a client. Also, they cannot be disabled via pragma pushes/pops,
101*a65addddSAndroid Build Coastguard Worker  #   so we leave it up to clients to disable them if desired.
102*a65addddSAndroid Build Coastguard Worker  # The warning C4702 is disabled because if MSVC optimizes the call to InvokeLambdaWithInjectedArgVector::operator() when cPtr is null, it will inline
103*a65addddSAndroid Build Coastguard Worker  #   a FRUIT_UNREACHABLE statement, which makes all statements succeeding the operator() call unreachable.
104*a65addddSAndroid Build Coastguard Worker  # The warning C4503 is disabled because some of the test_class_destruction.py tests suchs as "test_injector_creation_and_injection"
105*a65addddSAndroid Build Coastguard Worker  #   produce extremely long decorator names. This has no effect on the actual results of the test.
106*a65addddSAndroid Build Coastguard Worker  set(FRUIT_TESTONLY_CXXFLAGS "${FRUIT_TESTONLY_CXXFLAGS} /wd4702 /wd4503")
107*a65addddSAndroid Build Coastguard Workerendif()
108*a65addddSAndroid Build Coastguard Worker
109*a65addddSAndroid Build Coastguard Workeradd_library(test_headers_copy STATIC test_common.cpp)
110*a65addddSAndroid Build Coastguard Workertarget_link_libraries(test_headers_copy fruit)
111*a65addddSAndroid Build Coastguard Worker
112*a65addddSAndroid Build Coastguard Workerif(FRUIT_USES_BOOST)
113*a65addddSAndroid Build Coastguard Worker    find_package(Boost REQUIRED)
114*a65addddSAndroid Build Coastguard Worker    target_include_directories(test_headers_copy PRIVATE ${Boost_INCLUDE_DIRS})
115*a65addddSAndroid Build Coastguard Workerendif()
116*a65addddSAndroid Build Coastguard Worker
117*a65addddSAndroid Build Coastguard Worker# Escape the backslash which is a Windows path separator.
118*a65addddSAndroid Build Coastguard Workerstring(REPLACE "\\" "\\\\" ADDITIONAL_INCLUDE_DIRS "${Boost_INCLUDE_DIRS}")
119*a65addddSAndroid Build Coastguard Worker
120*a65addddSAndroid Build Coastguard Worker# `file(GENERATE)` generates a file for each configuration (CMAKE_BUILD_TYPE)
121*a65addddSAndroid Build Coastguard Worker# supported by the current CMake Generator. If you generate a file with an
122*a65addddSAndroid Build Coastguard Worker# absolute path, only the file generated by the first configuration (often
123*a65addddSAndroid Build Coastguard Worker# `Debug` configuration) will remain.
124*a65addddSAndroid Build Coastguard Worker# To support CMake multi-configuration generator, output files in configuration
125*a65addddSAndroid Build Coastguard Worker# subdirectories.
126*a65addddSAndroid Build Coastguard Workerfile(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/fruit_test_config.py"
127*a65addddSAndroid Build Coastguard Worker     CONTENT "
128*a65addddSAndroid Build Coastguard WorkerCXX='${CMAKE_CXX_COMPILER}'
129*a65addddSAndroid Build Coastguard WorkerCXX_COMPILER_NAME='${CMAKE_CXX_COMPILER_ID}'
130*a65addddSAndroid Build Coastguard WorkerCXX_COMPILER_VERSION='${CMAKE_CXX_COMPILER_VERSION}'
131*a65addddSAndroid Build Coastguard WorkerFRUIT_TEST_COMPILE_FLAGS='${FRUIT_TEST_COMPILE_FLAGS} ${FRUIT_TESTONLY_CXXFLAGS}'
132*a65addddSAndroid Build Coastguard WorkerADDITIONAL_INCLUDE_DIRS='${ADDITIONAL_INCLUDE_DIRS}'
133*a65addddSAndroid Build Coastguard WorkerADDITIONAL_LINKER_FLAGS='${CMAKE_EXE_LINKER_FLAGS}'
134*a65addddSAndroid Build Coastguard WorkerRUN_TESTS_UNDER_VALGRIND='${RUN_TESTS_UNDER_VALGRIND_FLAG}'
135*a65addddSAndroid Build Coastguard WorkerVALGRIND_FLAGS='${VALGRIND_FLAGS_STR}'
136*a65addddSAndroid Build Coastguard WorkerCMAKE_BUILD_TYPE='${CMAKE_BUILD_TYPE}'
137*a65addddSAndroid Build Coastguard Worker
138*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_FRUIT='$<TARGET_FILE_DIR:fruit>'
139*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_FRUIT_LIB='$<TARGET_FILE:fruit>'
140*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_TEST_HEADERS='$<TARGET_FILE_DIR:test_headers_copy>'
141*a65addddSAndroid Build Coastguard WorkerPATH_TO_COMPILED_TEST_HEADERS_LIB='$<TARGET_FILE:test_headers_copy>'
142*a65addddSAndroid Build Coastguard WorkerPATH_TO_FRUIT_STATIC_HEADERS='${CMAKE_CURRENT_SOURCE_DIR}/../include'
143*a65addddSAndroid Build Coastguard WorkerPATH_TO_FRUIT_GENERATED_HEADERS='${CMAKE_CURRENT_BINARY_DIR}/../include'
144*a65addddSAndroid Build Coastguard WorkerPATH_TO_FRUIT_TEST_HEADERS='${CMAKE_CURRENT_SOURCE_DIR}'
145*a65addddSAndroid Build Coastguard WorkerENABLE_COVERAGE=${FRUIT_ENABLE_COVERAGE_PYTHON_BOOL}
146*a65addddSAndroid Build Coastguard Worker")
147*a65addddSAndroid Build Coastguard Worker
148*a65addddSAndroid Build Coastguard Workeradd_custom_target(copy_fruit_test_config ALL
149*a65addddSAndroid Build Coastguard Worker    BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/fruit_test_config.py"
150*a65addddSAndroid Build Coastguard Worker    COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/fruit_test_config.py" "${CMAKE_CURRENT_BINARY_DIR}/fruit_test_config.py"
151*a65addddSAndroid Build Coastguard Worker    VERBATIM
152*a65addddSAndroid Build Coastguard Worker    COMMAND_EXPAND_LISTS)
153*a65addddSAndroid Build Coastguard Worker
154*a65addddSAndroid Build Coastguard Workerfile(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pytest.ini"
155*a65addddSAndroid Build Coastguard Worker     CONTENT "
156*a65addddSAndroid Build Coastguard Worker[pytest]
157*a65addddSAndroid Build Coastguard Workertestpaths = \"${CMAKE_CURRENT_SOURCE_DIR}\"
158*a65addddSAndroid Build Coastguard Workeraddopts = -r a
159*a65addddSAndroid Build Coastguard Workertimeout = 300
160*a65addddSAndroid Build Coastguard Worker")
161