summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2020-09-16 14:50:18 +0200
committerAlexandru Croitor <alexandru.croitor@qt.io>2020-09-17 00:11:04 +0000
commit0aa4b33b92da6a95d29caee62e4ac5e4c53a84ff (patch)
tree3a822608b4e76718657439fafb0784f230e1167a /cmake
parent7aacc8144e7da6b1ec48ab7c1e5c431d78c99c5f (diff)
CMake Build: Add qtnetwork docker testserver support
qt_add_test supports now QT_TEST_SERVER_LIST, which will add the test servers as docker test fixtures. The docker server will be started before the test is run, and stopped after the test is run. Running the tests in parallel is not supported. Docker tests are currently only supported on Linux hosts. Task-number: QTBUG-85034 Change-Id: If3cefe05c5dec19c14b05d2fa8b01a0b6d95e259 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/QtTestHelpers.cmake73
1 files changed, 72 insertions, 1 deletions
diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake
index a7d6d9d849..e9ecf6857a 100644
--- a/cmake/QtTestHelpers.cmake
+++ b/cmake/QtTestHelpers.cmake
@@ -72,13 +72,80 @@ function(qt_add_manual_test target)
endfunction()
+# This function will configure the fixture for the network tests that require docker network services
+# qmake counterpart: qtbase/mkspecs/features/unsupported/testserver.prf
+function(qt_internal_setup_docker_test_fixture name)
+ # Only Linux is provisioned with docker at this time
+ if (NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
+ return()
+ endif()
+
+ set(QT_TEST_SERVER_LIST ${ARGN})
+ set(DNSDOMAIN test-net.qt.local)
+
+ find_program(QT_DOCKER_COMPOSE docker-compose)
+ if (NOT QT_DOCKER_COMPOSE)
+ message(WARNING "docker-compose was not found. Docker network tests will not be run.")
+ return()
+ endif()
+ if (NOT DEFINED QT_DOCKER_COMPOSE_VERSION)
+ execute_process(COMMAND "${QT_DOCKER_COMPOSE}" --version OUTPUT_VARIABLE QT_DOCKER_COMPOSE_VERSION)
+ string(REPLACE "\n" "" QT_DOCKER_COMPOSE_VERSION "${QT_DOCKER_COMPOSE_VERSION}")
+ set(QT_DOCKER_COMPOSE_VERSION "${QT_DOCKER_COMPOSE_VERSION}" CACHE STRING "docker compose version")
+ endif()
+
+ find_program(QT_DOCKER docker)
+ if (NOT QT_DOCKER)
+ message(WARNING "docker was not found. Docker network tests will not be run.")
+ return()
+ endif()
+ if (NOT DEFINED QT_DOCKER_TEST_SERVER)
+ execute_process(COMMAND "${QT_DOCKER}" images -aq "qt-test-server-*" OUTPUT_VARIABLE QT_DOCKER_TEST_SERVER)
+ if (NOT QT_DOCKER_TEST_SERVER)
+ message(WARNING
+ "Docker image qt-test-server-* not found.\n"
+ "Run the provisioning script (coin/provisioning/.../testserver/docker_testserver.sh) in advance\n"
+ "Docker network tests will not be run.")
+ return()
+ endif()
+ set(QT_DOCKER_TEST_SERVER "ON" CACHE BOOL "docker qt-test-server-* present")
+ endif()
+
+ target_compile_definitions("${name}"
+ PRIVATE
+ QT_TEST_SERVER QT_TEST_SERVER_NAME QT_TEST_SERVER_DOMAIN=\"${DNSDOMAIN}\"
+ )
+
+ set(TESTSERVER_COMPOSE_FILE "${QT_SOURCE_TREE}/tests/testserver/docker-compose-bridge-network.yml")
+
+ # Bring up test servers and make sure the services are ready.
+ add_test(NAME ${name}-setup COMMAND
+ "${QT_DOCKER_COMPOSE}" -f ${TESTSERVER_COMPOSE_FILE} up --build -d --force-recreate --timeout 1 ${QT_TEST_SERVER_LIST}
+ )
+ # Stop and remove test servers after testing.
+ add_test(NAME ${name}-cleanup COMMAND
+ "${QT_DOCKER_COMPOSE}" -f ${TESTSERVER_COMPOSE_FILE} down --timeout 1
+ )
+
+ set_tests_properties(${name}-setup PROPERTIES FIXTURES_SETUP ${name}-docker)
+ set_tests_properties(${name}-cleanup PROPERTIES FIXTURES_CLEANUP ${name}-docker)
+ set_tests_properties(${name} PROPERTIES FIXTURES_REQUIRED ${name}-docker)
+
+ foreach(test_name ${name} ${name}-setup ${name}-cleanup)
+ set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT "testserver=${QT_DOCKER_COMPOSE_VERSION}")
+ set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT TEST_DOMAIN=${DNSDOMAIN})
+ set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT "SHARED_DATA=${QT_SOURCE_TREE}/mkspecs/features/data/testserver")
+ set_property(TEST "${test_name}" APPEND PROPERTY ENVIRONMENT SHARED_SERVICE=bridge-network)
+ endforeach()
+
+endfunction()
# This function creates a CMake test target with the specified name for use with CTest.
function(qt_add_test name)
qt_parse_all_arguments(arg "qt_add_test"
"RUN_SERIAL;EXCEPTIONS;GUI;QMLTEST;CATCH;LOWDPI"
"OUTPUT_DIRECTORY;WORKING_DIRECTORY;TIMEOUT;VERSION"
- "QML_IMPORTPATH;TESTDATA;${__default_private_args};${__default_public_args}" ${ARGN}
+ "QML_IMPORTPATH;TESTDATA;QT_TEST_SERVER_LIST;${__default_private_args};${__default_public_args}" ${ARGN}
)
if (NOT arg_OUTPUT_DIRECTORY)
@@ -191,6 +258,10 @@ function(qt_add_test name)
endif()
add_test(NAME "${name}" COMMAND ${test_executable} ${extra_test_args} ${test_outputs} WORKING_DIRECTORY "${test_working_dir}")
+
+ if (arg_QT_TEST_SERVER_LIST)
+ qt_internal_setup_docker_test_fixture(${name} ${arg_QT_TEST_SERVER_LIST})
+ endif()
endif()
set_tests_properties("${name}" PROPERTIES RUN_SERIAL "${arg_RUN_SERIAL}" LABELS "${label}")
if (arg_TIMEOUT)