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
123 lines
3.6 KiB
Bash
123 lines
3.6 KiB
Bash
#!/usr/bin/env bats
|
|
load test_helpers
|
|
|
|
|
|
@test "[$TEST_FILE] start 2 web containers" {
|
|
prepare_web_container bats-web1 81 -e VIRTUAL_HOST=web1.bats
|
|
prepare_web_container bats-web2 82 -e VIRTUAL_HOST=web2.bats
|
|
}
|
|
|
|
|
|
@test "[$TEST_FILE] -v /var/run/docker.sock:/tmp/docker.sock:ro" {
|
|
SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}-1
|
|
|
|
# WHEN nginx-proxy runs on our docker host using the default unix socket
|
|
run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/tmp/docker.sock:ro
|
|
assert_success
|
|
docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
|
|
|
|
# THEN
|
|
assert_nginxproxy_behaves $SUT_CONTAINER
|
|
}
|
|
|
|
|
|
@test "[$TEST_FILE] -v /var/run/docker.sock:/f00.sock:ro -e DOCKER_HOST=unix:///f00.sock" {
|
|
SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}-2
|
|
|
|
# WHEN nginx-proxy runs on our docker host using a custom unix socket
|
|
run nginxproxy $SUT_CONTAINER -v /var/run/docker.sock:/f00.sock:ro -e DOCKER_HOST=unix:///f00.sock
|
|
assert_success
|
|
docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
|
|
|
|
# THEN
|
|
assert_nginxproxy_behaves $SUT_CONTAINER
|
|
}
|
|
|
|
|
|
@test "[$TEST_FILE] -e DOCKER_HOST=tcp://..." {
|
|
SUT_CONTAINER=bats-nginx-proxy-${TEST_FILE}-3
|
|
# GIVEN a container exposing our docker host over TCP
|
|
run docker_tcp bats-docker-tcp
|
|
assert_success
|
|
sleep 1s
|
|
|
|
# WHEN nginx-proxy runs on our docker host using tcp to connect to our docker host
|
|
run nginxproxy $SUT_CONTAINER -e DOCKER_HOST="tcp://bats-docker-tcp:2375" --link bats-docker-tcp:bats-docker-tcp
|
|
assert_success
|
|
docker_wait_for_log $SUT_CONTAINER 9 "Watching docker events"
|
|
|
|
# THEN
|
|
assert_nginxproxy_behaves $SUT_CONTAINER
|
|
}
|
|
|
|
|
|
@test "[$TEST_FILE] separated containers (nginx + docker-gen + nginx.tmpl)" {
|
|
docker_clean bats-nginx
|
|
docker_clean bats-docker-gen
|
|
|
|
# GIVEN a simple nginx container
|
|
run docker run -d \
|
|
--label bats-type="nginx" \
|
|
--name bats-nginx \
|
|
-v /etc/nginx/conf.d/ \
|
|
-v /etc/nginx/certs/ \
|
|
nginx:latest
|
|
assert_success
|
|
run retry 5 1s docker run --label bats-type="curl" appropriate/curl --silent --fail --head http://$(docker_ip bats-nginx)/
|
|
assert_output -l 0 $'HTTP/1.1 200 OK\r'
|
|
|
|
# WHEN docker-gen runs on our docker host
|
|
run docker run -d \
|
|
--label bats-type="docker-gen" \
|
|
--name bats-docker-gen \
|
|
-v /var/run/docker.sock:/tmp/docker.sock:ro \
|
|
-v $BATS_TEST_DIRNAME/../nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro \
|
|
--volumes-from bats-nginx \
|
|
jwilder/docker-gen:0.7.0 \
|
|
-notify-sighup bats-nginx \
|
|
-watch \
|
|
-only-exposed \
|
|
/etc/docker-gen/templates/nginx.tmpl \
|
|
/etc/nginx/conf.d/default.conf
|
|
assert_success
|
|
docker_wait_for_log bats-docker-gen 9 "Watching docker events"
|
|
|
|
# Give some time to the docker-gen container to notify bats-nginx so it
|
|
# reloads its config
|
|
sleep 2s
|
|
|
|
run docker_running_state bats-nginx
|
|
assert_output "true" || {
|
|
docker logs bats-docker-gen
|
|
false
|
|
} >&2
|
|
|
|
# THEN
|
|
assert_nginxproxy_behaves bats-nginx
|
|
}
|
|
|
|
@test "[$TEST_FILE] stop all bats containers" {
|
|
stop_bats_containers
|
|
}
|
|
|
|
|
|
# $1 nginx-proxy container
|
|
function assert_nginxproxy_behaves {
|
|
local -r container=$1
|
|
|
|
# Querying the proxy without Host header → 503
|
|
run curl_container $container / --head
|
|
assert_output -l 0 $'HTTP/1.1 503 Service Temporarily Unavailable\r'
|
|
|
|
# Querying the proxy with Host header → 200
|
|
run curl_container $container /data --header "Host: web1.bats"
|
|
assert_output "answer from port 81"
|
|
|
|
run curl_container $container /data --header "Host: web2.bats"
|
|
assert_output "answer from port 82"
|
|
|
|
# Querying the proxy with unknown Host header → 503
|
|
run curl_container $container /data --header "Host: webFOO.bats" --head
|
|
assert_output -l 0 $'HTTP/1.1 503 Service Temporarily Unavailable\r'
|
|
}
|
|
|