d688514ad8c23696b6c834afd1de89b6d4f9e8b7
[plcapi.git] / tests / ci / vm.sh
1 #!/bin/sh
2
3 # @todo support getting the 2 vars as cli options as well as via env vars?
4
5 set -e
6
7 ACTION="${1}"
8
9 # Valid values: 'default', 5.6, 7.0 .. 7.4, 8.0
10 export PHP_VERSION=${PHP_VERSION:-default}
11 # Valid values: precise (12), trusty (14), xenial (16), bionic (18), focal (20)
12 # We default to the same version we use on Travis
13 export UBUNTU_VERSION=${UBUNTU_VERSION:-xenial}
14
15 CONTAINER_USER=docker
16 CONTAINER_BUILD_DIR="/home/${CONTAINER_USER}/build"
17 ROOT_DIR="$(dirname -- "$(dirname -- "$(dirname -- "$(readlink -f "$0")")")")"
18 IMAGE_NAME=phpxmlrpc:${UBUNTU_VERSION}-${PHP_VERSION}
19 CONTAINER_NAME=phpxmlrpc_${UBUNTU_VERSION}_${PHP_VERSION}
20
21 cd "$(dirname -- "$(readlink -f "$0")")"
22
23 help() {
24 printf "Usage: vm.sh [OPTIONS] ACTION [OPTARGS]
25
26 Manages the Test Environment Docker Stack
27
28 Commands:
29     build             build or rebuild the containers and set up the test env
30     cleanup           removes the docker containers and their images
31     enter             enter the test container
32     inspect
33     logs
34     ps
35     runtests [\$suite] execute the test suite using the test container (or a single test scenario eg. tests/1ParsingBugsTest.php)
36     runcoverage       execute the test suite and generate a code coverage report (in build/coverage)
37     start             start the containers
38     stop              stop containers
39     top
40
41 Options:
42     -h                print help
43
44 Environment variables: to be set before the 'build' action
45     PHP_VERSION       default value: 'default', ie. the stock php version from the Ubuntu version in use. Other possible values: 7.0 .. 8.0
46     UBUNTU_VERSION    default value: xenial. Other possible values: bionic, focal
47 "
48 }
49
50 build() {
51     stop
52     docker build --build-arg PHP_VERSION --build-arg UBUNTU_VERSION -t "${IMAGE_NAME}" .
53     if docker inspect "${CONTAINER_NAME}" >/dev/null 2>/dev/null; then
54         docker rm "${CONTAINER_NAME}"
55     fi
56     docker run -d \
57         -p 80:80 -p 443:443 -p 8080:8080 \
58         --name "${CONTAINER_NAME}" \
59         --env CONTAINER_USER_UID=$(id -u) --env CONTAINER_USER_GID=$(id -g) \
60         --env TESTS_ROOT_DIR=${CONTAINER_BUILD_DIR} \
61         --env HTTPSERVER=localhost \
62         --env HTTPURI=/demo/server/server.php \
63         --env HTTPSSERVER=localhost \
64         --env HTTPSURI=/demo/server/server.php \
65         --env PROXYSERVER=localhost:8080 \
66         --env HTTPSVERIFYHOST=0 \
67         --env HTTPSIGNOREPEER=1 \
68         --env SSLVERSION=0 \
69         --env DEBUG=0 \
70         -v "${ROOT_DIR}":"${CONTAINER_BUILD_DIR}" \
71          "${IMAGE_NAME}"
72 }
73
74 start() {
75     if docker inspect "${CONTAINER_NAME}" >/dev/null 2>/dev/null; then
76         docker start "${CONTAINER_NAME}"
77     else
78         build
79     fi
80 }
81
82 stop() {
83     if docker inspect "${CONTAINER_NAME}" >/dev/null 2>/dev/null; then
84         docker stop "${CONTAINER_NAME}"
85     fi
86 }
87
88 case "${ACTION}" in
89
90     build)
91         build
92         stop
93         ;;
94
95     cleanup)
96         docker rm "${CONTAINER_NAME}"
97         docker rmi "${IMAGE_NAME}"
98         ;;
99
100     enter | shell | cli)
101         # @todo allow login as root
102         docker exec -it "${CONTAINER_NAME}" su "${CONTAINER_USER}"
103         ;;
104
105     # @todo implement
106     #exec)
107     #    ;;
108
109     restart)
110         stop
111         start
112         ;;
113
114     runcoverage)
115         # @todo clean up /tmp/phpxmlrpc and .phpunit.result.cache
116         if [ ! -d build ]; then mkdir build; fi
117         docker exec -t "${CONTAINER_NAME}" /home/${CONTAINER_USER}/build/tests/ci/setup/setup_code_coverage.sh enable
118         docker exec -it "${CONTAINER_NAME}" su "${CONTAINER_USER}" -c "./vendor/bin/phpunit --coverage-html build/coverage -v tests"
119         docker exec -t "${CONTAINER_NAME}" /home/${CONTAINER_USER}/build/tests/ci/setup/setup_code_coverage.sh disable
120         ;;
121
122     runtests)
123         docker exec -it "${CONTAINER_NAME}" su "${CONTAINER_USER}" -c "./vendor/bin/phpunit -v tests"
124         ;;
125
126     start)
127         start
128         ;;
129
130     #status)
131     #    :
132     #    ;;
133
134     stop)
135         stop
136         ;;
137
138     ps)
139         docker ps --filter "name=${CONTAINER_NAME}"
140         ;;
141
142     diff | inspect | kill | logs | pause | port | stats | top | unpause)
143         docker container "${ACTION}" "${CONTAINER_NAME}"
144         ;;
145
146     *)
147         printf "\n\e[31mERROR:\e[0m unknown action '${ACTION}'\n\n" >&2
148         help
149         exit 1
150         ;;
151 esac