123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- # 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}
- }
- # Send a HTTPS request to container $1 for path $2 and
- # Additional curl options can be passed as $@
- #
- # $1 container name
- # $2 HTTPS path to query
- # $@ additional options to pass to the curl command
- function curl_container_https {
- 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 \
- --insecure \
- "$@" \
- https://$(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/ \
- -v $DIR/web_helpers:/var/www:ro \
- $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;
- ./webserver.py \$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/port
- 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}"
- }
|