on a142f21 help sign in
unity8/cmake/modules/QmlTest.cmake
312 lines 10 kB history raw
1# If you need to override the qmlscene or qmltestrunner executables,
2# create the corresponding executable target.
4# These functions respect the global STDOUT_LOGGER and ARTIFACTS_DIR variables.
6# You can use those with cmake_parse_arguments
7# if you need to wrap and mangle arguments.
8set(QMLTEST_OPTIONS ADD_TEST CACHE INTERNAL "")
9set(QMLTEST_SINGLE ITERATIONS ARG_PREFIX CACHE INTERNAL "")
10set(QMLTEST_MULTI ARGS ENVIRONMENT DEPENDS IMPORT_PATHS TARGETS CACHE INTERNAL "")
12# import_executables(name1 [name2 [...]]
13# [OPTIONAL] # continue when not found
14# )
16# This will find the named executables and import them
17# to an imported target of the same name.
19function(import_executables)
20 cmake_parse_arguments(QMLTEST "OPTIONAL" "" "" ${ARGN})
22 foreach(NAME ${QMLTEST_UNPARSED_ARGUMENTS})
23 if(NOT TARGET ${NAME})
24 add_executable(${NAME} IMPORTED GLOBAL)
25 find_program(${NAME}_exe ${NAME})
27 if(NOT QMLTEST_OPTIONAL AND NOT ${NAME}_exe)
28 message(FATAL_ERROR "Could not locate ${NAME}.")
29 elseif(NOT ${NAME}_exe)
30 message(STATUS "Could not locate ${NAME}, skipping.")
31 else()
32 set_target_properties(${NAME} PROPERTIES IMPORTED_LOCATION ${${NAME}_exe})
33 endif()
34 endif()
35 endforeach()
36endfunction()
39# add_qml_test(path component_name
40# [...]
41# )
43# Add test targets for ${component_name} under ${path}. It's assumed
44# that the test file is named ${path}/tst_${component_name}.qml.
46# This function wraps add_manual_qml_test and add_qml_unittest,
47# see below for available arguments.
49function(add_qml_test PATH COMPONENT_NAME)
50 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
51 mangle_arguments()
53 add_qml_unittest(${ARGV})
54 add_manual_qml_test(${ARGV})
55endfunction()
58# add_qml_unittest(path component_name
59# [...]
60# )
62# Add test targets for ${component_name} under ${path}. It's assumed
63# that the test file is named ${path}/tst_${component_name}.qml.
65# This function wraps add_executable_test, see below for available arguments.
67function(add_qml_unittest PATH COMPONENT_NAME)
68 import_executables(qmltestrunner)
70 add_executable_test(${COMPONENT_NAME} qmltestrunner
71 ${ARGN}
72 ARGS -input ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
73 )
74endfunction()
77# add_manual_qml_test(path component_name
78# [...]
79# )
81# Add manual test targets for ${component_name} under ${path}. It's assumed
82# that the test file is named ${path}/tst_${component_name}.qml.
84# This function wraps add_manual_test, see below for available arguments.
86function(add_manual_qml_test PATH COMPONENT_NAME)
87 import_executables(qmlscene)
88 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
90 add_manual_test(${COMPONENT_NAME} qmlscene
91 ${ARGN}
92 ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
93 )
94endfunction()
97# add_executable_test(target component_name
98# [...] # see doc for add_manual_qml_test for common arguments
99# [ADD_TEST] # whether to add to the "test" target
100# [ARG_PREFIX arg_prefix] # prefix logging arguments with this string
101# [ARGS] arg1 [arg2 [...]] # pass these arguments to the test executable
102# [TARGETS target1 [target2 [...]]] # make the listed targets depend on this test
103# # if a corresponding xvfbtarget1, xvfbtarget2 etc. exists,
104# # this test running under xvfb will be added as a dependency
105# # of those targets
106# [ITERATIONS count] # run this test as a benchmark for ${count} iterations
107# )
109# Logging options in the standard form of "-o filename,format"
110# will be appended to the arguments list, prefixed with ARG_PREFIX.
111# XUnitXML files will be stored in current binary dir or under
112# ARTIFACTS_DIR, if set.
114# Three targets will be created:
115# - test${component_name} - Runs the test
116# - xvfbtest${component_name} - Runs the test under xvfb
117# - gdbtest${component_name} - Runs the test under gdb
119function(add_executable_test COMPONENT_NAME TARGET)
120 import_executables(gdb xvfb-run OPTIONAL)
122 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
123 mangle_arguments()
125 if(ARTIFACTS_DIR)
126 file(RELATIVE_PATH path ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
127 file(MAKE_DIRECTORY ${ARTIFACTS_DIR}/${path})
128 set(file_logger -o ${ARTIFACTS_DIR}/${path}/test${COMPONENT_NAME}.xml,xunitxml)
129 else()
130 set(file_logger -o ${CMAKE_CURRENT_BINARY_DIR}/test${COMPONENT_NAME}.xml,xunitxml)
131 endif()
133 bake_arguments("${QMLTEST_ARG_PREFIX}" args ${iterations} ${file_logger} ${STDOUT_LOGGER})
135 set(qmltest_command
136 $<TARGET_FILE:${TARGET}>
137 ${QMLTEST_ARGS}
138 ${args}
139 )
141 add_qmltest_target(test${COMPONENT_NAME} ${TARGET}
142 COMMAND ${qmltest_command}
143 ${depends}
144 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
145 ${add_test}
146 ${targets}
147 )
149 if(TARGET xvfb-run)
150 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
151 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
152 ${depends}
153 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1
154 TARGETS ${xvfb_targets}
155 )
156 endif()
158 if(TARGET gdb)
159 add_qmltest_target(gdbtest${COMPONENT_NAME} ${TARGET}
160 COMMAND $<TARGET_FILE:gdb> -ex run -args ${qmltest_command}
161 ${depends}
162 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
163 )
164 endif()
165endfunction()
168# add_manual_test(target component_name
169# [DEPENDS target1 [target2 [...]]] # make this test depend on the specified targets
170# [IMPORT_PATHS import_path1 [import_path2 [...]] # use these QML import paths
171# # (they're searched first to last)
172# [ENVIRONMENT var1=value1 [var2=value2 [...]]] # set these environment variables
173# )
175# Two targets will be created:
176# - try${component_name} - Runs the test for manual interaction
177# - gdbtry${component_name} - Runs the test under gdb
179function(add_manual_test COMPONENT_NAME TARGET)
180 import_executables(gdb OPTIONAL)
182 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
183 mangle_arguments()
185 bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768)
187 set(qmltry_command
188 $<TARGET_FILE:${TARGET}>
189 ${QMLTEST_ARGS}
190 ${args}
191 )
193 add_qmltest_target(try${COMPONENT_NAME} ${TARGET}
194 COMMAND ${qmltry_command}
195 ${depends}
196 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
197 )
199 if(TARGET gdb)
200 add_qmltest_target(gdbtry${COMPONENT_NAME} ${TARGET}
201 COMMAND $<TARGET_FILE:gdb> -ex run -args ${qmltry_command}
202 ${depends}
203 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
204 )
205 endif()
206endfunction()
209################### INTERNAL ####################
211# add_qmltest_target(target_name target
212# COMMAND test_exe [arg1 [...]] # execute this test with arguments
213# [...] # see above for available arguments:
214# # ADD_TEST, ENVIRONMENT, DEPENDS and TARGETS
215# )
217function(add_qmltest_target TARGET_NAME TARGET)
218 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "COMMAND;${QMLTEST_MULTI}" ${ARGN})
219 mangle_arguments()
221 # Additional arguments
222 string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_lower)
223 if(cmake_generator_lower STREQUAL "unix makefiles")
224 set(function "$(FUNCTION)")
225 endif()
227 add_custom_target(${TARGET_NAME}
228 env ${QMLTEST_ENVIRONMENT}
229 ${QMLTEST_COMMAND} ${function}
230 DEPENDS ${TARGET} ${QMLTEST_DEPENDS}
231 )
233 if(QMLTEST_ADD_TEST)
234 add_test(
235 NAME ${TARGET_NAME}
236 COMMAND ${QMLTEST_COMMAND}
237 )
239 foreach(ENV ${QMLTEST_ENVIRONMENT})
240 set_property(TEST ${TARGET_NAME} APPEND PROPERTY ENVIRONMENT ${ENV})
241 endforeach()
243 set_property(TEST ${TARGET_NAME} APPEND PROPERTY DEPENDS ${TARGET})
244 foreach(DEPEND ${DEPENDS})
245 set_property(TEST ${TARGET_NAME} APPEND PROPERTY DEPENDS ${DEPEND})
246 endforeach()
247 endif()
249 foreach(UPSTREAM_TARGET ${QMLTEST_TARGETS})
250 add_dependencies(${UPSTREAM_TARGET} ${TARGET_NAME})
251 endforeach()
252endfunction()
255# mangle_arguments(${ARGN})
257# Verify there were no unparsed arguments and
258# mangle the known ones for further processing.
260macro(mangle_arguments)
261 if(QMLTEST_UNPARSED_ARGUMENTS)
262 message(FATAL_ERROR "Unexpected arguments: ${QMLTEST_UNPARSED_ARGUMENTS}")
263 endif()
265 if(QMLTEST_ADD_TEST)
266 set(add_test ADD_TEST)
267 endif()
269 if(QMLTEST_IMPORT_PATHS)
270 string(REPLACE ";" ":" imports "${QMLTEST_IMPORT_PATHS}")
271 endif()
273 if(QMLTEST_ITERATIONS)
274 set(iterations -iterations ${QMLTEST_ITERATIONS})
275 endif()
277 if(QMLTEST_DEPENDS)
278 set(depends DEPENDS ${QMLTEST_DEPENDS})
279 endif()
281 if(QMLTEST_TARGETS)
282 set(targets TARGETS ${QMLTEST_TARGETS})
283 endif()
285 set(xvfb_targets "")
286 foreach(target ${QMLTEST_TARGETS})
287 if(TARGET xvfb${target})
288 list(APPEND xvfb_targets xvfb${target})
289 endif()
290 endforeach()
291 set(xvfb_targets "${xvfb_targets}" PARENT_SCOPE)
292endmacro()
295# bake_arguments(prefix output
296# arg1 [arg2 [...]]
297# )
299# If set, add the argument prefix before every passed
300# argument and store the result in ${OUTPUT} variable.
302function(bake_arguments PREFIX OUTPUT)
303 set(args "${ARGN}")
304 if(PREFIX)
305 set(args "")
306 foreach(arg ${ARGN})
307 list(APPEND args ${PREFIX})
308 list(APPEND args ${arg})
309 endforeach()
310 endif()
311 set(${OUTPUT} "${args}" PARENT_SCOPE)
312endfunction()