mirror of
				https://github.com/thib8956/nginx-proxy
				synced 2025-11-04 02:59:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			183 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			4.6 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}
 | 
						|
}
 | 
						|
 | 
						|
# 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}"
 | 
						|
}
 | 
						|
 |