2018-02-28 15:48:38 +00:00
|
|
|
# Integrating docker-based test servers into Qt Test framework
|
|
|
|
#
|
|
|
|
# This file adds support for docker-based test servers built by testcase
|
|
|
|
# projects that need them. To enable this feature, any automated test can
|
|
|
|
# include testserver.pri in its project file. This instructs qmake to insert
|
|
|
|
# additional targets into the generated Makefile. The 'check' target then brings
|
|
|
|
# up test servers before running the testcase, and shuts them down afterwards.
|
|
|
|
#
|
|
|
|
# TESTSERVER_COMPOSE_FILE
|
|
|
|
# - Contains the path of docker-compose file
|
|
|
|
# This configuration file defines the services used for autotests. It tells the
|
|
|
|
# docker engine how to build up the docker images and containers. In qtbase, a
|
|
|
|
# shared docker-compose file is located in the tests folder.
|
|
|
|
# Example: TESTSERVER_COMPOSE_FILE = \
|
|
|
|
# $$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose.yml
|
|
|
|
#
|
|
|
|
# The user must run the provisioning scripts in advance before attempting to
|
|
|
|
# build the test servers. The docker_testserver.sh script is used to build up
|
|
|
|
# the docker images into the docker-cache. It handles the immutable parts of the
|
|
|
|
# server installation that rarely need adjustment, such as downloading packages.
|
|
|
|
# Example: qt5/coin/provisioning/.../testserver/docker_testserver.sh
|
|
|
|
#
|
|
|
|
# QT_TEST_SERVER_LIST
|
|
|
|
# - A list of test servers to bring up for this testcase
|
|
|
|
# These test servers should be defined in $$TESTSERVER_COMPOSE_FILE. Each
|
|
|
|
# testcase can define the test servers it depends on.
|
|
|
|
# Example: QT_TEST_SERVER_LIST = apache2 squid vsftpd ftp-proxy danted
|
|
|
|
#
|
|
|
|
# Pre-processor defines needed for the application:
|
|
|
|
# QT_TEST_SERVER
|
|
|
|
# - A preprocessor macro used for testcase to change testing parameters at
|
|
|
|
# compile time
|
|
|
|
# This macro is predefined for docker-based test servers and is passed as a
|
|
|
|
# compiler option (-DQT_TEST_SERVER). The testcase can then check whether
|
|
|
|
# docker-based servers are in use and change the testing parameters, such as
|
|
|
|
# host name or port number, at compile time. An example can be found in
|
|
|
|
# network-settings.h.
|
|
|
|
#
|
|
|
|
# Example:
|
|
|
|
# #if defined(QT_TEST_SERVER)
|
|
|
|
# Change the testing parameters at compile time
|
|
|
|
# #endif
|
|
|
|
#
|
|
|
|
# QT_TEST_SERVER_DOMAIN
|
|
|
|
# - A preprocessor macro that holds the server domain name
|
|
|
|
# Provided for the helper functions in network-settings.h. Use function
|
|
|
|
# serverDomainName() in your application instead.
|
|
|
|
#
|
|
|
|
# Additional make targets:
|
|
|
|
# 1. check_network - A renamed target from the check target of testcase feature.
|
|
|
|
# 2. testserver_clean - Clean up server containers/images and tidy away related
|
|
|
|
# files.
|
|
|
|
|
|
|
|
TESTSERVER_VERSION = $$system(docker-compose --version)
|
|
|
|
|
2018-08-15 07:55:46 +00:00
|
|
|
equals(QMAKE_HOST.os, Windows)|isEmpty(TESTSERVER_VERSION) {
|
2018-02-28 15:48:38 +00:00
|
|
|
# Make check with server "qt-test-server.qt-test-net" as a fallback
|
|
|
|
message("testserver: qt-test-server.qt-test-net")
|
|
|
|
} else {
|
|
|
|
# Make check with test servers
|
2018-09-20 13:16:57 +00:00
|
|
|
equals(QMAKE_HOST.os, Darwin) {
|
|
|
|
# There is no docker bridge on macOS. It is impossible to ping a container.
|
|
|
|
# Docker docs recommends using port mapping to connect to a container;
|
|
|
|
# but it causes a port conflict if the user is running a service that
|
|
|
|
# binds the same port on the host. An alternative solution is to deploy
|
|
|
|
# the docker environment into VirtualBox using docker-machine.
|
|
|
|
TESTSERVER_COMPOSE_FILE = \
|
|
|
|
$$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose-for-macOS.yml
|
|
|
|
|
|
|
|
# The connection configuration for the target machine
|
|
|
|
MACHINE_CONFIG = $(shell docker-machine config qt-test-server)
|
|
|
|
|
|
|
|
# The environment variables passed to the docker-compose file
|
|
|
|
TEST_ENV = 'MACHINE_IP=$(shell docker-machine ip qt-test-server)'
|
|
|
|
} else {
|
|
|
|
TESTSERVER_COMPOSE_FILE = $$dirname(_QMAKE_CONF_)/tests/testserver/docker-compose.yml
|
|
|
|
DEFINES += QT_TEST_SERVER_NAME
|
|
|
|
}
|
2018-02-28 15:48:38 +00:00
|
|
|
|
|
|
|
# Ensure that the docker-compose file is provided. It is a configuration
|
|
|
|
# file which is mandatory for all docker-compose commands. You can get more
|
|
|
|
# detail from the description of TESTSERVER_COMPOSE_FILE above. There is
|
|
|
|
# also an example showing how to configure it manually.
|
2018-08-28 21:04:08 +00:00
|
|
|
FILE_PRETEST_MSG = "Project variable 'TESTSERVER_COMPOSE_FILE' is not set"
|
2018-09-20 13:16:57 +00:00
|
|
|
testserver_pretest.commands = $(info "testserver:" $$TESTSERVER_VERSION)
|
|
|
|
testserver_pretest.commands += $(if $$TESTSERVER_COMPOSE_FILE,,$(error $$FILE_PRETEST_MSG))
|
2018-02-28 15:48:38 +00:00
|
|
|
|
2018-10-20 09:59:34 +00:00
|
|
|
# Make sure docker-machine is both created and running. The docker_machine
|
|
|
|
# script is used to deploy the docker environment into VirtualBox.
|
|
|
|
# Example: qt5/coin/provisioning/common/shared/testserver/docker_machine.sh
|
|
|
|
!isEmpty(MACHINE_CONFIG) {
|
|
|
|
MACHINE_LIST_CMD = docker-machine ls -q --filter "Name=^qt-test-server$"
|
|
|
|
MACHINE_LIST_MSG = "Docker machine qt-test-server not found"
|
|
|
|
testserver_pretest.commands += \
|
|
|
|
$(if $(shell $$MACHINE_LIST_CMD),,$(error $$MACHINE_LIST_MSG))
|
|
|
|
|
|
|
|
MACHINE_STATE_CMD = \
|
|
|
|
docker-machine ls -q --filter "State=Running" --filter "Name=^qt-test-server$"
|
|
|
|
MACHINE_START_CMD = docker-machine start qt-test-server
|
|
|
|
testserver_pretest.commands += \
|
|
|
|
$(if $(shell $$MACHINE_STATE_CMD),,$(shell $$MACHINE_START_CMD > /dev/null))
|
|
|
|
}
|
|
|
|
|
2018-02-28 15:48:38 +00:00
|
|
|
# Before starting the test servers, it requires the user to run the setup
|
|
|
|
# script (coin/provisioning/.../testserver/docker_testserver.sh) in advance.
|
2018-09-20 13:16:57 +00:00
|
|
|
IMAGE_PRETEST_CMD = docker $$MACHINE_CONFIG images -aq "qt-test-server-*"
|
2018-08-28 21:04:08 +00:00
|
|
|
IMAGE_PRETEST_MSG = "Docker image qt-test-server-* not found"
|
|
|
|
testserver_pretest.commands += $(if $(shell $$IMAGE_PRETEST_CMD),,$(error $$IMAGE_PRETEST_MSG))
|
2018-02-28 15:48:38 +00:00
|
|
|
|
|
|
|
# The domain name is relevant to https keycert (qnetworkreply/crts/qt-test-net-cacert.pem).
|
2018-07-02 13:13:12 +00:00
|
|
|
DNSDOMAIN = test-net.qt.local
|
2018-02-28 15:48:38 +00:00
|
|
|
DEFINES += QT_TEST_SERVER QT_TEST_SERVER_DOMAIN=$$shell_quote(\"$${DNSDOMAIN}\")
|
|
|
|
|
|
|
|
# Rename the check target of testcase feature
|
|
|
|
check.target = check_network
|
|
|
|
testserver_test.target = check
|
|
|
|
|
2018-08-28 21:04:08 +00:00
|
|
|
# Pretesting test servers environment
|
|
|
|
testserver_test.depends = testserver_pretest
|
|
|
|
|
2018-02-28 15:48:38 +00:00
|
|
|
# Bring up test servers and make sure the services are ready.
|
2018-09-20 13:16:57 +00:00
|
|
|
!isEmpty(TEST_ENV): testserver_test.commands = env $$TEST_ENV
|
|
|
|
testserver_test.commands += docker-compose $$MACHINE_CONFIG -f $$TESTSERVER_COMPOSE_FILE up \
|
|
|
|
--detach --force-recreate --timeout 1 $${QT_TEST_SERVER_LIST} &&
|
2018-02-28 15:48:38 +00:00
|
|
|
|
|
|
|
# Check test cases with docker-based test servers.
|
|
|
|
testserver_test.commands += $(MAKE) check_network;
|
|
|
|
|
|
|
|
# Stop and remove test servers after testing.
|
2018-09-20 13:16:57 +00:00
|
|
|
testserver_test.commands += docker-compose $$MACHINE_CONFIG -f $$TESTSERVER_COMPOSE_FILE down \
|
2018-02-28 15:48:38 +00:00
|
|
|
--timeout 1
|
|
|
|
|
|
|
|
# Destroy test servers and tidy away related files.
|
2018-09-20 13:16:57 +00:00
|
|
|
testserver_clean.commands = docker-compose $$MACHINE_CONFIG -f $$TESTSERVER_COMPOSE_FILE down \
|
2018-02-28 15:48:38 +00:00
|
|
|
--rmi all
|
|
|
|
|
2018-08-28 21:04:08 +00:00
|
|
|
QMAKE_EXTRA_TARGETS += testserver_pretest testserver_test testserver_clean
|
2018-02-28 15:48:38 +00:00
|
|
|
}
|