1
0
Fork 0
mirror of synced 2024-11-22 16:25:34 -05:00

added script to run tests with docker; changed test/README.md accordingly

This commit is contained in:
dein0s 2017-03-25 18:05:33 +03:00
parent ef558f85d9
commit 7b0f22beec
3 changed files with 157 additions and 14 deletions

View file

@ -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

View file

@ -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
View 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}