Add the SIMULATE_IN_SOURCE argument to _qt_internal_test_expect_pass

test_QFINDTESTDATA builds the project in the source tree, this is
necessary because the test requires relative paths to the source file
names. This function could be useful for other tests, so it makes sense
to extend the _qt_internal_test_expect_pass/fail macros to support
build in the source tree.
Note that, the SIMULATE_IN_SOURCE argument doesn't build the test in
the existing source tree, but copies source files to the build tree
first to do not litter the source directory.

Change-Id: I16e790d74be2a0c5ca0593e0f88580dbe09882b9
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Alexey Edelev 2021-03-25 11:10:47 +01:00
parent 89a0ed1009
commit cbdce59cd2
2 changed files with 74 additions and 39 deletions

View File

@ -113,44 +113,95 @@ function(_qt_internal_set_up_test_run_environment testname)
endfunction()
# Checks if the test project can be built successfully.
# Checks if the test project can be built successfully. Arguments:
#
# SIMULATE_IN_SOURCE: If the option is specified, the function copies sources of the tests to the
# CMAKE_CURRENT_BINARY_DIR directory, creates internal build directory in the
# copied sources and uses this directory to build and test the project.
# This makes possible to have relative paths to the source files in the
# generated ninja rules.
#
# BINARY: Path to the test artifact that will be executed after the build is complete. If a
# relative path is specified, it will be counted from the build directory.
#
# TESTNAME: a custom test name to use instead of the one derived from the source directory name
#
# BUILD_OPTIONS: a list of -D style CMake definitions to pass to ctest's --build-options (which
# are ultimately passed to the CMake invocation of the test project)
macro(_qt_internal_test_expect_pass _dir)
cmake_parse_arguments(_ARGS "" "BINARY;TESTNAME" "BUILD_OPTIONS" ${ARGN})
cmake_parse_arguments(_ARGS "SIMULATE_IN_SOURCE" "BINARY;TESTNAME" "BUILD_OPTIONS" ${ARGN})
if(_ARGS_TESTNAME)
set(testname "${_ARGS_TESTNAME}")
else()
string(REPLACE "(" "_" testname "${_dir}")
string(REPLACE ")" "_" testname "${testname}")
string(REPLACE "/" "_" testname "${testname}")
endif()
set(__expect_pass__prefixes "${CMAKE_PREFIX_PATH}")
string(REPLACE ";" "\;" __expect_pass__prefixes "${__expect_pass__prefixes}")
set(__expect_pass_prefixes "${CMAKE_PREFIX_PATH}")
string(REPLACE ";" "\;" __expect_pass_prefixes "${__expect_pass_prefixes}")
set(ctest_command_args
--build-and-test
"${CMAKE_CURRENT_SOURCE_DIR}/${_dir}"
"${CMAKE_CURRENT_BINARY_DIR}/${_dir}"
--build-config "${CMAKE_BUILD_TYPE}"
--build-generator "${CMAKE_GENERATOR}"
--build-makeprogram "${CMAKE_MAKE_PROGRAM}"
--build-project "${_dir}"
--build-options "-DCMAKE_PREFIX_PATH=${__expect_pass__prefixes}" ${BUILD_OPTIONS_LIST}
${_ARGS_BUILD_OPTIONS}
--test-command ${_ARGS_BINARY})
add_test(${testname} ${CMAKE_CTEST_COMMAND} ${ctest_command_args})
if(_ARGS_BINARY)
_qt_internal_set_up_test_run_environment("${testname}")
endif()
set(__expect_pass_build_dir "${CMAKE_CURRENT_BINARY_DIR}/${_dir}")
set(__expect_pass_source_dir "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}")
if(_ARGS_SIMULATE_IN_SOURCE)
set(__expect_pass_in_source_build_dir "${CMAKE_CURRENT_BINARY_DIR}/in_source")
set(__expect_pass_build_dir "${__expect_pass_in_source_build_dir}/${_dir}/build")
set(__expect_pass_source_dir "${__expect_pass_in_source_build_dir}/${_dir}")
unset(__expect_pass_in_source_build_dir)
endif()
if(_ARGS_BINARY AND NOT IS_ABSOLUTE "${_ARGS_BINARY}")
set(_ARGS_BINARY "${__expect_pass_build_dir}/${_ARGS_BINARY}")
endif()
if(_ARGS_SIMULATE_IN_SOURCE)
add_test(NAME ${testname}_cleanup
COMMAND ${CMAKE_COMMAND} -E remove_directory "${__expect_pass_source_dir}"
)
set_tests_properties(${testname}_cleanup PROPERTIES
FIXTURES_SETUP "${testname}SIMULATE_IN_SOURCE_FIXTURE"
)
add_test(${testname}_copy_sources ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/${_dir}" "${__expect_pass_source_dir}"
)
set_tests_properties(${testname}_copy_sources PROPERTIES
FIXTURES_SETUP "${testname}SIMULATE_IN_SOURCE_FIXTURE"
DEPENDS ${testname}_cleanup
)
endif()
set(ctest_command_args
--build-and-test
"${__expect_pass_source_dir}"
"${__expect_pass_build_dir}"
--build-config "${CMAKE_BUILD_TYPE}"
--build-generator "${CMAKE_GENERATOR}"
--build-makeprogram "${CMAKE_MAKE_PROGRAM}"
--build-project "${_dir}"
--build-options "-DCMAKE_PREFIX_PATH=${__expect_pass_prefixes}" ${BUILD_OPTIONS_LIST}
${_ARGS_BUILD_OPTIONS}
--test-command ${_ARGS_BINARY}
)
add_test(${testname} ${CMAKE_CTEST_COMMAND} ${ctest_command_args})
if(_ARGS_SIMULATE_IN_SOURCE)
set_tests_properties(${testname} PROPERTIES
FIXTURES_REQUIRED "${testname}SIMULATE_IN_SOURCE_FIXTURE")
endif()
if(_ARGS_BINARY)
_qt_internal_set_up_test_run_environment("${testname}")
endif()
unset(__expect_pass_source_dir)
unset(__expect_pass_build_dir)
unset(__expect_pass_prefixes)
endmacro()
# Checks if the build of the test project fails.
# This test passes if the test project fails either at the
# configuring or build steps.
# Arguments: See _qt_internal_test_expect_pass
macro(_qt_internal_test_expect_fail)
_qt_internal_test_expect_pass(${ARGV})
set_tests_properties(${testname} PROPERTIES WILL_FAIL TRUE)

View File

@ -108,26 +108,10 @@ _qt_internal_test_expect_pass(test_platform_defs_include)
_qt_internal_test_expect_pass(test_qtmainwin_library)
if (CMAKE_GENERATOR STREQUAL Ninja AND UNIX AND NOT WIN32)
set(qfindtestdata_build_dir "${CMAKE_CURRENT_SOURCE_DIR}/test_QFINDTESTDATA/build")
add_test(test_QFINDTESTDATA ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMAKE_CURRENT_SOURCE_DIR}/test_QFINDTESTDATA"
# Build in a subdir of the source dir.
# This causes Ninja to use relative paths.
"${qfindtestdata_build_dir}"
--build-config "${CMAKE_BUILD_TYPE}"
--build-generator "${CMAKE_GENERATOR}"
--build-makeprogram "${CMAKE_MAKE_PROGRAM}"
--build-options "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${BUILD_OPTIONS_LIST}
_qt_internal_test_expect_pass(test_QFINDTESTDATA
BINARY "tests/test_QFINDTESTDATA"
SIMULATE_IN_SOURCE
)
set_tests_properties(test_QFINDTESTDATA PROPERTIES FIXTURES_SETUP QFINDTESTDATA)
add_test(NAME run_test_QFINDTESTDATA COMMAND sh -c "cd \"${qfindtestdata_build_dir}/tests\" && ./test_QFINDTESTDATA -v2")
set_tests_properties(run_test_QFINDTESTDATA PROPERTIES FIXTURES_REQUIRED QFINDTESTDATA)
# source dir should be untouched by build, so remove build results
add_test(NAME cleanup_test_QFINDTESTDATA COMMAND sh -c "rm -rf \"${qfindtestdata_build_dir}\"")
set_tests_properties(cleanup_test_QFINDTESTDATA PROPERTIES FIXTURES_CLEANUP QFINDTESTDATA)
endif()
if (NOT NO_DBUS)