86aea653c8
Since [1] some timings seem to have changed. This caused the unit tests
to fail intermittently, from my testings especially on Ubuntu systems
(much less often on e.g. Arch).
This commit adds the `dockergen_wait_for_event` helper-function to try
and wait for the configuration to be generated by docker-gen before
continuing on with the actual tests themselves.
Additionally, at the end of every test file, all containers spun up by
the bats-tests will be stopped. This required adding the `bats-type`
label to every container started during the bats-tests.
The stopping of the containers reduces the amount of events docker-gen
has to process, thus resulting in lower wait times for the generation to
happen.
[1]: 50435652b1
167 lines
4.2 KiB
Bash
167 lines
4.2 KiB
Bash
# Test if requirements are met
|
|
(
|
|
type docker &>/dev/null || ( echo "docker is not available"; exit 1 )
|
|
)>&2
|
|
|
|
|
|
# set a few global variables
|
|
SUT_IMAGE=jwilder/nginx-proxy:bats
|
|
TEST_FILE=$(basename $BATS_TEST_FILENAME .bats)
|
|
|
|
|
|
# load the Bats stdlib (see https://github.com/sstephenson/bats/pull/110)
|
|
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
|
export BATS_LIB="${DIR}/lib/bats"
|
|
load "${BATS_LIB}/batslib.bash"
|
|
|
|
|
|
# load additional bats helpers
|
|
load ${DIR}/lib/helpers.bash
|
|
load ${DIR}/lib/docker_helpers.bash
|
|
|
|
|
|
# Define functions specific to our test suite
|
|
|
|
# run the SUT docker container
|
|
# and makes sure it remains started
|
|
# and displays the nginx-proxy start logs
|
|
#
|
|
# $1 container name
|
|
# $@ other options for the `docker run` command
|
|
function nginxproxy {
|
|
local -r container_name=$1
|
|
shift
|
|
docker_clean $container_name \
|
|
&& docker run -d \
|
|
--label bats-type="nginx-proxy" \
|
|
--name $container_name \
|
|
"$@" \
|
|
$SUT_IMAGE \
|
|
&& wait_for_nginxproxy_container_to_start $container_name \
|
|
&& docker logs $container_name
|
|
}
|
|
|
|
|
|
# wait until the nginx-proxy container is ready to operate
|
|
#
|
|
# $1 container name
|
|
function wait_for_nginxproxy_container_to_start {
|
|
local -r container_name=$1
|
|
sleep .5s # give time to eventually fail to initialize
|
|
|
|
function is_running {
|
|
run docker_running_state $container_name
|
|
assert_output "true"
|
|
}
|
|
retry 3 1 is_running
|
|
}
|
|
|
|
|
|
# Send a HTTP request to container $1 for path $2 and
|
|
# Additional curl options can be passed as $@
|
|
#
|
|
# $1 container name
|
|
# $2 HTTP path to query
|
|
# $@ additional options to pass to the curl command
|
|
function curl_container {
|
|
local -r container=$1
|
|
local -r path=$2
|
|
shift 2
|
|
docker run --label bats-type="curl" appropriate/curl --silent \
|
|
--connect-timeout 5 \
|
|
--max-time 20 \
|
|
"$@" \
|
|
http://$(docker_ip $container)${path}
|
|
}
|
|
|
|
|
|
# start a container running (one or multiple) webservers listening on given ports
|
|
#
|
|
# $1 container name
|
|
# $2 container port(s). If multiple ports, provide them as a string: "80 90" with a space as a separator
|
|
# $@ `docker run` additional options
|
|
function prepare_web_container {
|
|
local -r container_name=$1
|
|
local -r ports=$2
|
|
shift 2
|
|
local -r options="$@"
|
|
|
|
local expose_option=""
|
|
IFS=$' \t\n' # See https://github.com/sstephenson/bats/issues/89
|
|
for port in $ports; do
|
|
expose_option="${expose_option}--expose=$port "
|
|
done
|
|
|
|
( # used for debugging purpose. Will be display if test fails
|
|
echo "container_name: $container_name"
|
|
echo "ports: $ports"
|
|
echo "options: $options"
|
|
echo "expose_option: $expose_option"
|
|
)>&2
|
|
|
|
docker_clean $container_name
|
|
|
|
# GIVEN a container exposing 1 webserver on ports 1234
|
|
run docker run -d \
|
|
--label bats-type="web" \
|
|
--name $container_name \
|
|
$expose_option \
|
|
-w /var/www/ \
|
|
$options \
|
|
-e PYTHON_PORTS="$ports" \
|
|
python:3 bash -c "
|
|
trap '[ \${#PIDS[@]} -gt 0 ] && kill -TERM \${PIDS[@]}' TERM
|
|
declare -a PIDS
|
|
for port in \$PYTHON_PORTS; do
|
|
echo starting a web server listening on port \$port;
|
|
mkdir /var/www/\$port
|
|
cd /var/www/\$port
|
|
echo \"answer from port \$port\" > data
|
|
python -m http.server \$port &
|
|
PIDS+=(\$!)
|
|
done
|
|
wait \${PIDS[@]}
|
|
trap - TERM
|
|
wait \${PIDS[@]}
|
|
"
|
|
assert_success
|
|
|
|
# THEN querying directly port works
|
|
IFS=$' \t\n' # See https://github.com/sstephenson/bats/issues/89
|
|
for port in $ports; do
|
|
run retry 5 1s docker run --label bats-type="curl" appropriate/curl --silent --fail http://$(docker_ip $container_name):$port/data
|
|
assert_output "answer from port $port"
|
|
done
|
|
}
|
|
|
|
# stop all containers with the "bats-type" label (matching the optionally supplied value)
|
|
#
|
|
# $1 optional label value
|
|
function stop_bats_containers {
|
|
local -r value=$1
|
|
|
|
if [ -z "$value" ]; then
|
|
CIDS=( $(docker ps -q --filter "label=bats-type") )
|
|
else
|
|
CIDS=( $(docker ps -q --filter "label=bats-type=$value") )
|
|
fi
|
|
|
|
if [ ${#CIDS[@]} -gt 0 ]; then
|
|
docker stop ${CIDS[@]} >&2
|
|
fi
|
|
}
|
|
|
|
# wait for a docker-gen container to receive a specified event from a
|
|
# container with the specified ID/name
|
|
#
|
|
# $1 docker-gen container name
|
|
# $2 event
|
|
# $3 ID/name of container to receive event from
|
|
function dockergen_wait_for_event {
|
|
local -r container=$1
|
|
local -r event=$2
|
|
local -r other=$3
|
|
local -r did=$(docker_id "$other")
|
|
docker_wait_for_log "$container" 9 "Received event $event for container ${did:0:12}"
|
|
}
|
|
|