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
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.")
32 set_target_properties(${NAME} PROPERTIES IMPORTED_LOCATION ${${NAME}_exe})
39# add_qml_test(path component_name
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})
53 add_qml_unittest(${ARGV})
54 add_manual_qml_test(${ARGV})
58# add_qml_test_data(path component_name
62# Install file called ${component_name} (or ${component_name}.qml) under
65function(add_qml_test_data PATH COMPONENT_NAME)
66 cmake_parse_arguments(TEST "" "DESTINATION" "" ${ARGN})
68 set(filename "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/${COMPONENT_NAME}")
70 if (IS_DIRECTORY "${filename}")
71 # As a convenience, allow specifying a directory and we will install
72 # all files in the dir. We do it this way rather than passing
73 # DIRECTORY to install() because we want to process any qml files.
74 file(GLOB subfiles RELATIVE "${filename}" "${filename}/*")
75 foreach(subfile ${subfiles})
76 add_qml_test_data("${PATH}/${COMPONENT_NAME}" "${subfile}")
81 if (NOT EXISTS "${filename}")
82 set(filename "${filename}.qml")
83 set(COMPONENT_NAME "${COMPONENT_NAME}.qml")
86 if ("${filename}" MATCHES "\\.qml$")
87 file(READ "${filename}" contents)
88 string(REGEX REPLACE "(\"[./]*)/qml(/|\")" "\\1\\2" contents "${contents}")
89 # this is for (at least) cardcreatortest which pulls in an architecture-specific
90 # import into the plugins directory (which is a 'qml' once installed).
91 string(REGEX REPLACE "(import \"[./]*)/plugins(/|\")" "\\1/qml\\2" contents "${contents}")
92 set(filename "${CMAKE_CURRENT_BINARY_DIR}/${PATH}/${COMPONENT_NAME}")
93 file(WRITE "${filename}" "${contents}")
97 set(DESTINATION "${TEST_DESTINATION}")
99 file(RELATIVE_PATH relcurpath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
100 set(DESTINATION "${SHELL_APP_DIR}/${relcurpath}/${PATH}")
103 install(FILES "${filename}" DESTINATION "${DESTINATION}")
107# add_qml_unittest(path component_name
111# Add test targets for ${component_name} under ${path}. It's assumed
112# that the test file is named ${path}/tst_${component_name}.qml.
114# This function wraps add_executable_test, see below for available arguments.
116function(add_qml_unittest PATH COMPONENT_NAME)
117 import_executables(qmltestrunner)
119 add_executable_test(${COMPONENT_NAME} qmltestrunner
121 ARGS -input ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
124 if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml")
125 add_qml_test_data("${PATH}" "tst_${COMPONENT_NAME}.qml")
130# add_manual_qml_test(path component_name
134# Add manual test targets for ${component_name} under ${path}. It's assumed
135# that the test file is named ${path}/tst_${component_name}.qml.
137# This function wraps add_manual_test, see below for available arguments.
139function(add_manual_qml_test PATH COMPONENT_NAME)
140 import_executables(qmlscene)
141 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
143 add_manual_test(${COMPONENT_NAME} qmlscene
145 ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
148 if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml")
149 add_qml_test_data("${PATH}" "tst_${COMPONENT_NAME}.qml")
154# add_executable_test(target component_name
155# [...] # see doc for add_manual_qml_test for common arguments
156# [ADD_TEST] # whether to add to the "test" target
157# [ARG_PREFIX arg_prefix] # prefix logging arguments with this string
158# [ARGS] arg1 [arg2 [...]] # pass these arguments to the test executable
159# [TARGETS target1 [target2 [...]]] # make the listed targets depend on this test
160# # if a corresponding xvfbtarget1, xvfbtarget2 etc. exists,
161# # this test running under xvfb will be added as a dependency
163# [ITERATIONS count] # run this test as a benchmark for ${count} iterations
166# Logging options in the standard form of "-o filename,format"
167# will be appended to the arguments list, prefixed with ARG_PREFIX.
168# XUnitXML files will be stored in current binary dir.
170# Three targets will be created:
171# - test${component_name} - Runs the test
172# - xvfbtest${component_name} - Runs the test under xvfb
173# - gdbtest${component_name} - Runs the test under gdb
175function(add_executable_test COMPONENT_NAME TARGET)
176 import_executables(gdb xvfb-run OPTIONAL)
178 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
181 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
182 set(file_logger -o ${CMAKE_CURRENT_BINARY_DIR}/test${COMPONENT_NAME}.xml,xunitxml)
184 bake_arguments("${QMLTEST_ARG_PREFIX}" args ${iterations} ${file_logger} ${STDOUT_LOGGER})
187 $<TARGET_FILE:${TARGET}>
192 add_qmltest_target(test${COMPONENT_NAME} ${TARGET}
193 COMMAND ${qmltest_command}
195 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
201 add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
202 COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
204 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1
205 TARGETS ${xvfb_targets}
210 add_qmltest_target(gdbtest${COMPONENT_NAME} ${TARGET}
211 COMMAND $<TARGET_FILE:gdb> -ex run -args ${qmltest_command}
213 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
219# add_manual_test(target component_name
220# [DEPENDS target1 [target2 [...]]] # make this test depend on the specified targets
221# [IMPORT_PATHS import_path1 [import_path2 [...]] # use these QML import paths
222# # (they're searched first to last)
223# [ENVIRONMENT var1=value1 [var2=value2 [...]]] # set these environment variables
226# Two targets will be created:
227# - try${component_name} - Runs the test for manual interaction
228# - gdbtry${component_name} - Runs the test under gdb
230function(add_manual_test COMPONENT_NAME TARGET)
231 import_executables(gdb OPTIONAL)
233 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
236 bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768,3800)
239 $<TARGET_FILE:${TARGET}>
244 add_qmltest_target(try${COMPONENT_NAME} ${TARGET}
245 COMMAND ${qmltry_command}
247 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
251 add_qmltest_target(gdbtry${COMPONENT_NAME} ${TARGET}
252 COMMAND $<TARGET_FILE:gdb> -ex run -args ${qmltry_command}
254 ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
260# add_meta_test(target)
262# Adds a test target that will run one of our "meta" test targets, like
263# xvfbuitests. This script will run the specified suite of tests on an
266function(add_meta_test TARGET_NAME)
267 cmake_parse_arguments(TEST "" "" "DEPENDS" ${ARGN})
269 add_custom_target(${TARGET_NAME})
271 set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${TARGET_NAME}.sh")
272 file(WRITE "${filename}" "#!/usr/bin/parallel --shebang --no-notice\n\n")
274 add_meta_dependencies(${TARGET_NAME} DEPENDS ${TEST_DEPENDS})
275 # else we will write the rest of the script as we add cmake targets
277 install(FILES "${filename}"
278 PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE
279 GROUP_EXECUTE GROUP_READ
280 WORLD_EXECUTE WORLD_READ
281 DESTINATION "${SHELL_PRIVATE_LIBDIR}/tests/scripts"
286################### INTERNAL ####################
288function(install_test_script TARGET_NAME)
289 cmake_parse_arguments(TEST "" "" "COMMAND;ENVIRONMENT" ${ARGN})
291 # Now write the above test into a shell script that we can run on an
293 set(script "#!/bin/sh\n\nset -x\n\n")
294 foreach(ONE_ENV ${TEST_ENVIRONMENT})
295 set(script "${script}export ${ONE_ENV}\n")
297 set(script "${script}export UNITY_TESTING_DATADIR=\"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}\"\n")
298 set(script "${script}export UNITY_TESTING_LIBDIR=\"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\"\n")
299 set(script "${script}\n")
300 set(script "${script}XML_ARGS=\n")
301 set(script "${script}if [ -n \"\$ARTIFACTS_DIR\" ]; then\n")
302 set(script "${script} XML_ARGS=\"@XML_ARGS@\"\n")
303 set(script "${script} mkdir -p \"@XML_DIR@\"\n")
304 set(script "${script} touch \"@XML_FILE@\"\n")
305 set(script "${script}fi\n")
306 set(script "${script}\n")
307 foreach(ONE_CMD ${TEST_COMMAND})
308 set(script "${script}'${ONE_CMD}' ")
311 set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${TARGET_NAME}.sh")
313 # Generate script to file then read it back to resolve any generator
314 # expressions before we try to replace paths.
320 # Do replacement at install time to save needless work and to make sure
321 # we are modifying file after generate step above (which doesn't happen
322 # immediately). We can't use a custom-defined function or macro here...
323 # So instead we use a giant ugly code block.
325 # START OF CODE BLOCK --------------------------------------------------
327 file(READ \"${filename}\" replacestr)
329 # Now some replacements...
330 # tests like to write xml output to our builddir; we don't need that, but we do want them in ARTIFACTS_DIR
331 string(REGEX MATCH \"( '--parameter')? '-o'( '--parameter')? '[^']*,xunitxml' \" xmlargs \"\${replacestr}\")
332 string(REGEX REPLACE \"( '--parameter')? '-o'( '--parameter')? '[^']*,xunitxml' \" \" \\\$XML_ARGS \" replacestr \"\${replacestr}\")
333 string(REGEX REPLACE \"'[^']*/tests/\" \"'\\\$ARTIFACTS_DIR/tests/\" xmlargs \"\${xmlargs}\")
334 string(REGEX REPLACE \".*'([^']*),xunitxml'.*\" \"\\\\1\" xmlfile \"\${xmlargs}\")
335 string(REGEX REPLACE \"(.*)/[^/]*\" \"\\\\1\" xmldir \"\${xmlfile}\")
336 string(REGEX REPLACE \"'\" \"\" xmlargs \"\${xmlargs}\") # strip single quotes
337 string(REGEX REPLACE \"@XML_ARGS@\" \"\${xmlargs}\" replacestr \"\${replacestr}\")
338 string(REGEX REPLACE \"@XML_DIR@\" \"\${xmldir}\" replacestr \"\${replacestr}\")
339 string(REGEX REPLACE \"@XML_FILE@\" \"\${xmlfile}\" replacestr \"\${replacestr}\")
340 # replace build/source roots with their install paths
341 string(REPLACE \"${CMAKE_BINARY_DIR}/libs\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\" replacestr \"\${replacestr}\")
342 string(REPLACE \"${CMAKE_BINARY_DIR}/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}\" replacestr \"\${replacestr}\")
343 string(REPLACE \"${CMAKE_BINARY_DIR}/tests/libs\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/libs\" replacestr \"\${replacestr}\")
344 string(REPLACE \"${CMAKE_BINARY_DIR}/tests/mocks\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}/mocks\" replacestr \"\${replacestr}\")
345 string(REPLACE \"${CMAKE_BINARY_DIR}/tests/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/plugins\" replacestr \"\${replacestr}\")
346 string(REPLACE \"${CMAKE_BINARY_DIR}/tests/qmltests\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/qmltests\" replacestr \"\${replacestr}\")
347 string(REPLACE \"${CMAKE_BINARY_DIR}/tests/uqmlscene\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\" replacestr \"\${replacestr}\")
348 string(REPLACE \"${CMAKE_BINARY_DIR}/tests/utils/modules\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}/utils\" replacestr \"\${replacestr}\")
349 string(REPLACE \"${CMAKE_SOURCE_DIR}/tests/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}/tests/plugins\" replacestr \"\${replacestr}\")
350 string(REPLACE \"${CMAKE_SOURCE_DIR}/tests/qmltests\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}/tests/qmltests\" replacestr \"\${replacestr}\")
352 file(WRITE \"${filename}\" \"\${replacestr}\")
354 # END OF CODE BLOCK --------------------------------------------------
356 install(FILES "${filename}"
357 PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE
358 GROUP_EXECUTE GROUP_READ
359 WORLD_EXECUTE WORLD_READ
360 DESTINATION "${SHELL_PRIVATE_LIBDIR}/tests/scripts"
364function(add_meta_dependencies UPSTREAM_TARGET)
365 cmake_parse_arguments(TEST "" "" "DEPENDS" ${ARGN})
367 foreach(depend ${TEST_DEPENDS})
368 add_dependencies(${UPSTREAM_TARGET} ${depend})
370 # add depend to the meta test script that we will install on system
371 set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${UPSTREAM_TARGET}.sh")
372 if (EXISTS "${filename}")
373 file(APPEND "${filename}" "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/scripts/${depend}.sh\n")
378# add_qmltest_target(target_name target
379# COMMAND test_exe [arg1 [...]] # execute this test with arguments
380# [...] # see above for available arguments:
381# # ADD_TEST, ENVIRONMENT, DEPENDS and TARGETS
384function(add_qmltest_target TARGET_NAME TARGET)
385 cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "COMMAND;${QMLTEST_MULTI}" ${ARGN})
388 # Additional arguments
389 string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_lower)
390 if(cmake_generator_lower STREQUAL "unix makefiles")
391 set(function "$(FUNCTION)")
394 add_custom_target(${TARGET_NAME}
395 env ${QMLTEST_ENVIRONMENT}
396 ${QMLTEST_COMMAND} ${function}
397 DEPENDS ${TARGET} ${QMLTEST_DEPENDS}
400 install_test_script(${TARGET_NAME}
401 ENVIRONMENT ${QMLTEST_ENVIRONMENT}
402 COMMAND ${QMLTEST_COMMAND}
408 COMMAND ${QMLTEST_COMMAND}
411 foreach(ENV ${QMLTEST_ENVIRONMENT})
412 set_property(TEST ${TARGET_NAME} APPEND PROPERTY ENVIRONMENT ${ENV})
415 set_property(TEST ${TARGET_NAME} APPEND PROPERTY DEPENDS ${TARGET})
416 foreach(DEPEND ${DEPENDS})
417 set_property(TEST ${TARGET_NAME} APPEND PROPERTY DEPENDS ${DEPEND})
421 foreach(UPSTREAM_TARGET ${QMLTEST_TARGETS})
422 add_meta_dependencies(${UPSTREAM_TARGET} DEPENDS ${TARGET_NAME})
427# mangle_arguments(${ARGN})
429# Verify there were no unparsed arguments and
430# mangle the known ones for further processing.
432macro(mangle_arguments)
433 if(QMLTEST_UNPARSED_ARGUMENTS)
434 message(FATAL_ERROR "Unexpected arguments: ${QMLTEST_UNPARSED_ARGUMENTS}")
438 set(add_test ADD_TEST)
441 if(QMLTEST_IMPORT_PATHS)
442 string(REPLACE ";" ":" imports "${QMLTEST_IMPORT_PATHS}")
445 if(QMLTEST_ITERATIONS)
446 set(iterations -iterations ${QMLTEST_ITERATIONS})
450 set(depends DEPENDS ${QMLTEST_DEPENDS})
454 set(targets TARGETS ${QMLTEST_TARGETS})
458 foreach(target ${QMLTEST_TARGETS})
459 if(TARGET xvfb${target})
460 list(APPEND xvfb_targets xvfb${target})
463 set(xvfb_targets "${xvfb_targets}" PARENT_SCOPE)
467# bake_arguments(prefix output
471# If set, add the argument prefix before every passed
472# argument and store the result in ${OUTPUT} variable.
474function(bake_arguments PREFIX OUTPUT)
479 list(APPEND args ${PREFIX})
480 list(APPEND args ${arg})
483 set(${OUTPUT} "${args}" PARENT_SCOPE)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list