added script to run tests with docker; changed test/README.md accordingly
This commit is contained in:
parent
ef558f85d9
commit
7b0f22beec
3 changed files with 157 additions and 14 deletions
|
@ -1,27 +1,45 @@
|
||||||
Testing
|
Testing
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Dotbot testing code uses [Vagrant][vagrant] to run all tests inside a virtual
|
Dotbot testing code can use [Docker][docker] or [Vagrant][vagrant] to run all tests inside a virtual
|
||||||
machine to have tests be completely isolated from the host machine. The test
|
environment to have tests be completely isolated from the host machine. The tests are deterministic,
|
||||||
driver relies on the [Sahara][sahara] plugin to snapshot and roll back virtual
|
and each test is run in a virtual environment with fresh state, ensuring that tests that modify
|
||||||
machine state. The tests are deterministic, and each test is run in a virtual
|
system state are easily repeatable.
|
||||||
machine with fresh state, ensuring that tests that modify system state are
|
|
||||||
easily repeatable.
|
**NOTE:** [Vagrant][vagrant] test driver relies on the [Sahara][sahara] plugin to snapshot and roll back virtual
|
||||||
|
machine state.
|
||||||
|
|
||||||
Running the Tests
|
Running the Tests
|
||||||
-----------------
|
-----------------
|
||||||
|
### Vagrant
|
||||||
Before running the tests, the virtual machine must be running. It can be
|
Before running the tests, the virtual machine must be running. It can be
|
||||||
started by running `vagrant up`.
|
started by running ```vagrant up```.
|
||||||
|
|
||||||
The test suite can be run by running `./test`. Selected tests can be run by
|
The test suite can be executed by running ```./test```.
|
||||||
passing paths to the tests as arguments to `./test`.
|
|
||||||
|
|
||||||
Tests can be run with a specific Python version by running `./test --version
|
Selected tests can be run by passing paths to the tests as arguments to ```./test```. Example: ```./test defaults.bash```
|
||||||
<version>` - for example, `./test --version 3.4.3`.
|
|
||||||
|
Tests can be run with a specific Python version by passing it's version as argument with key ```--version``` or ```-v```. Examples: ```./test --version 2.7.13```, ```./test -v 3.5```.
|
||||||
|
|
||||||
|
You can also combine both of this for sure. Example: ```./test --version 3.6.0 clean-outsude.bash```.
|
||||||
|
|
||||||
When finished with testing, it is good to shut down the virtual machine by
|
When finished with testing, it is good to shut down the virtual machine by
|
||||||
running `vagrant halt`.
|
running ```vagrant halt```.
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
Before running the tests, ensure that you have [Docker][docker] installed.
|
||||||
|
|
||||||
|
The test suite can be executed by running ```./test_docker``` (with appropriate rights for running docker binary).
|
||||||
|
|
||||||
|
Selected tests can be run by passing paths to the tests as arguments to ```./test_docker```. Example: ```./test defaults.bash```
|
||||||
|
|
||||||
|
Tests can be run with a specific Python version by passing it's version as argument with key ```--version``` or ```-v```. Examples: ```./test_docker --version 2.7.13```, ```./test_docker -v 3.5```.
|
||||||
|
|
||||||
|
You can also combine both of this for sure. Example: ```./test_docker --version 3.6.0 clean-outsude.bash```.
|
||||||
|
|
||||||
|
When finished, container will be deleted. But you have to manually remove unnecessary docker images (```docker rmi python:tag```), where *tag* - version of Python, that you've passed to the script (```docker rmi python:2.7.9``` by default, if no version was specified).
|
||||||
|
|
||||||
|
|
||||||
|
[docker]: https://www.docker.com/
|
||||||
[vagrant]: https://www.vagrantup.com/
|
[vagrant]: https://www.vagrantup.com/
|
||||||
[sahara]: https://github.com/jedi4ever/sahara
|
[sahara]: https://github.com/jedi4ever/sahara
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
DEBUG=${DEBUG:-false}
|
DEBUG=${DEBUG:-false}
|
||||||
USE_VAGRANT=${USE_VAGRANT:-true}
|
USE_VAGRANT=${USE_VAGRANT:-true}
|
||||||
DOTBOT_EXEC=${DOTBOT_EXEC:-"/dotbot/bin/dotbot"}
|
DOTBOT_EXEC=${DOTBOT_EXEC:-"/dotbot/bin/dotbot"}
|
||||||
DOTFILES="/home/$(whoami)/dotfiles"
|
DOTFILES="${HOME:-/home/$(whoami)}/dotfiles"
|
||||||
INSTALL_CONF='install.conf.yaml'
|
INSTALL_CONF='install.conf.yaml'
|
||||||
INSTALL_CONF_JSON='install.conf.json'
|
INSTALL_CONF_JSON='install.conf.json'
|
||||||
|
|
||||||
|
|
125
test/test_docker
Executable file
125
test/test_docker
Executable file
|
@ -0,0 +1,125 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DEBUG=false
|
||||||
|
# set -x
|
||||||
|
# set -v
|
||||||
|
|
||||||
|
|
||||||
|
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
cd $BASE_DIR
|
||||||
|
. "${BASE_DIR}/driver-lib.bash"
|
||||||
|
|
||||||
|
start="$(date +%s)"
|
||||||
|
|
||||||
|
CONTAINER="dotbot_test"
|
||||||
|
|
||||||
|
system_check_docker () {
|
||||||
|
if [[ ! "$(which docker)" ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
container_command_remove () {
|
||||||
|
docker rm -f ${CONTAINER} > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
container_command_run () {
|
||||||
|
docker run \
|
||||||
|
-v $PWD/../:/dotbot \
|
||||||
|
-e USE_VAGRANT='false' \
|
||||||
|
-e DEBUG="${DEBUG:-false}" \
|
||||||
|
--name "${CONTAINER}" \
|
||||||
|
-d "python:${1}" \
|
||||||
|
tail -f /dev/null \
|
||||||
|
> /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
container_execute () {
|
||||||
|
docker exec $CONTAINER /bin/bash -c "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
>&2 echo $@
|
||||||
|
>&2 echo "Aborting..."
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
docker_start_container () {
|
||||||
|
IMAGE_TAG="${1}"
|
||||||
|
if [[ $(docker ps -q -f name=${CONTAINER}) ]]; then
|
||||||
|
container_command_remove
|
||||||
|
fi
|
||||||
|
system_check_docker || die "Could not find docker binary"
|
||||||
|
container_command_run "${IMAGE_TAG}" || die "Could not find python image with tag: ${IMAGE_TAG}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while [[ $# > 1 ]]
|
||||||
|
do
|
||||||
|
key="${1}"
|
||||||
|
case $key in
|
||||||
|
-v|--version)
|
||||||
|
VERSION="${2}"
|
||||||
|
shift && shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# unknown option
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
initialize () {
|
||||||
|
echo "Initializing"
|
||||||
|
docker_start_container "${2}"
|
||||||
|
tests_run=0
|
||||||
|
tests_passed=0
|
||||||
|
tests_failed=0
|
||||||
|
tests_total="${1}"
|
||||||
|
local plural="" && [ "${tests_total}" -gt 1 ] && plural="s"
|
||||||
|
printf -- "Running %d test%s...\n\n" "${tests_total}" "${plural}"
|
||||||
|
}
|
||||||
|
|
||||||
|
run_test() {
|
||||||
|
tests_run=$((tests_run + 1))
|
||||||
|
printf '[%d/%d] (%s)\n' "${tests_run}" "${tests_total}" "${1}"
|
||||||
|
docker_start_container "${2}"
|
||||||
|
if container_execute "cd /dotbot/test/tests && bash ${1}" 2>/dev/null; then
|
||||||
|
pass
|
||||||
|
else
|
||||||
|
fail
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
VERSION="${VERSION:-2.7.9}"
|
||||||
|
|
||||||
|
declare -a tests=()
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
while read file; do
|
||||||
|
tests+=("${file}")
|
||||||
|
done < <(find ${BASE_DIR}/tests -type f -name '*.bash')
|
||||||
|
else
|
||||||
|
tests=("$@")
|
||||||
|
fi
|
||||||
|
|
||||||
|
initialize "${#tests[@]}" "${VERSION}"
|
||||||
|
|
||||||
|
|
||||||
|
for file in "${tests[@]}"; do
|
||||||
|
run_test "$(basename "${file}")" "${VERSION}"
|
||||||
|
done
|
||||||
|
|
||||||
|
container_command_remove
|
||||||
|
|
||||||
|
if report; then
|
||||||
|
ret=0
|
||||||
|
else
|
||||||
|
ret=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "(tests run in $(($(date +%s) - start)) seconds)"
|
||||||
|
exit ${ret}
|
Loading…
Reference in a new issue