4bd30f5d2c
This test suite is implemented using [bats](https://github.com/sstephenson/bats). Not all features are tested. For instance ssl features and custom nginx config are missing. Probably others. This test suite won't work with TravisCI. Too many evenings were wasted trying to overcome [issues](http://stackoverflow.com/questions/32846800/travis-fails-to-stop-docker-containers) that arises only on the TravisCI platform. However it runs on [CircleCI](https://circleci.com) which is also free for opensource projects.
117 lines
3.4 KiB
Bash
117 lines
3.4 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 3 "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 3 "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 3 "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 \
|
|
--name bats-nginx \
|
|
-v /etc/nginx/conf.d/ \
|
|
-v /etc/nginx/certs/ \
|
|
nginx:latest
|
|
assert_success
|
|
run retry 5 1s curl --silent --fail -A "before-docker-gen" --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 \
|
|
--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:latest \
|
|
-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 6 "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
|
|
}
|
|
|
|
|
|
# $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'
|
|
}
|
|
|