diff --git a/bitnami/apache/test.sh b/bitnami/apache/test.sh index b8b6e458a407..e269b2ebeaa4 100644 --- a/bitnami/apache/test.sh +++ b/bitnami/apache/test.sh @@ -1,83 +1,86 @@ #!/usr/bin/env bats -CONTAINER_NAME=bitnami-apache-test -IMAGE_NAME=bitnami/apache +# source the helper script +APP_NAME=apache +VOL_PREFIX=/bitnami/$APP_NAME +VOLUMES=/app:$VOL_PREFIX/conf:$VOL_PREFIX/logs SLEEP_TIME=2 -VOL_PREFIX=/bitnami/apache +load tests/docker_helper -cleanup_running_containers() { - if [ "$(docker ps -a | grep $CONTAINER_NAME)" ]; then - docker rm -fv $CONTAINER_NAME - fi -} - -setup() { - cleanup_running_containers +# Cleans up all running/stopped containers and host mounted volumes +cleanup_environment() { + container_remove default } +# Teardown called at the end of each test teardown() { - cleanup_running_containers -} - -create_container(){ - docker run -d --name $CONTAINER_NAME \ - --expose 81 $IMAGE_NAME - sleep $SLEEP_TIME -} - -add_vhost() { - docker exec $CONTAINER_NAME sh -c "echo 'Listen 81 - - ServerName default - Redirect 405 / -' > $VOL_PREFIX/conf/vhosts/test.conf" + cleanup_environment } +# cleanup the environment before starting the tests +cleanup_environment @test "We can connect to the port 80 and 443" { - create_container - run docker run --link $CONTAINER_NAME:apache --rm bitnami/apache curl -L -i --noproxy apache http://apache:80 - [[ "$output" =~ "200 OK" ]] - [ $status = 0 ] + container_create default -d - run docker run --link $CONTAINER_NAME:apache --rm bitnami/apache curl -L -i --noproxy apache -k https://apache:443 + # http connection + run curl_client default -i http://$APP_NAME:80 + [[ "$output" =~ "200 OK" ]] + + # https connection + run curl_client default -i -k https://$APP_NAME:443 [[ "$output" =~ "200 OK" ]] - [ $status = 0 ] } @test "Returns default page" { - create_container - run docker run --link $CONTAINER_NAME:apache --rm bitnami/apache curl -L -i --noproxy apache http://apache:80 - [[ "$output" =~ "It works!" ]] - [ $status = 0 ] + container_create default -d - run docker run --link $CONTAINER_NAME:apache --rm bitnami/apache curl -L -i --noproxy apache -k https://apache:443 + # http connection + run curl_client default -i http://$APP_NAME:80 + [[ "$output" =~ "It works!" ]] + + # https connections + run curl_client default -i -k https://$APP_NAME:443 [[ "$output" =~ "It works!" ]] - [ $status = 0 ] } @test "Logs to stdout" { - create_container - docker run --link $CONTAINER_NAME:apache --rm bitnami/apache curl -L -i --noproxy apache http://apache:80 - run docker logs $CONTAINER_NAME + container_create default -d + + # make sample request + curl_client default -i http://$APP_NAME:80 + + # check if our request is logged in the container logs + run container_logs default [[ "$output" =~ "GET / HTTP/1.1" ]] - [ $status = 0 ] } @test "All the volumes exposed" { - create_container - run docker inspect $CONTAINER_NAME + container_create default -d + + # inspect container to check if volumes are exposed + run container_inspect default --format {{.Mounts}} [[ "$output" =~ "$VOL_PREFIX/logs" ]] [[ "$output" =~ "$VOL_PREFIX/conf" ]] } @test "Vhosts directory is imported" { - create_container - add_vhost - docker restart $CONTAINER_NAME - sleep $SLEEP_TIME - docker run --link $CONTAINER_NAME:apache --rm bitnami/apache curl -L -i --noproxy apache http://apache:81 | { - run grep "405 Method Not Allowed" - [ $status = 0 ] - } + # create container and exposing TCP port 81 + container_create default -d --expose 81 + + # create a vhost config for accepting connections on TCP port 81 + container_exec default sh -c "cat > $VOL_PREFIX/conf/vhosts/test.conf < + ServerName default + Redirect 405 / + +EOF" + + # restart the container for the vhost config to take effect + container_restart default + + # check http connections on port 81 + run curl_client default -i http://$APP_NAME:81 + [[ "$output" =~ "405 Method Not Allowed" ]] } diff --git a/bitnami/apache/tests/docker_helper.bash b/bitnami/apache/tests/docker_helper.bash new file mode 100644 index 000000000000..2458bff7ddd1 --- /dev/null +++ b/bitnami/apache/tests/docker_helper.bash @@ -0,0 +1,177 @@ +#!/bin/bash + +## +# Reusable helper script to do docker things in your tests +## +# The following variables should be defined in you BATS script for this helper +# script to work correctly. +# +# APP_NAME - app name, also used as the link alias in container_link_and_run_command +# CONTAINER_NAME - prefix for the name of containers that will be created (default: bitnami-$APP_NAME-test) +# IMAGE_NAME - the docker image name (default: bitnami/$APP_NAME) +# SLEEP_TIME - time in seconds to wait for containers to start (default: 5) +# VOL_PREFIX - prefix of volumes inside the container (default: /bitnami/$APP_NAME) +# VOLUMES - colon separated list of container volumes (default: $VOL_PREFIX/data:$VOL_PREFIX/conf:$VOL_PREFIX/logs) +# HOST_VOL_PREFIX - prefix of volumes mounted from the host (default: /tmp/bitnami/$CONTAINER_NAME) +# container_link_and_run_command_DOCKER_ARGS - optional arguments passed to docker run in container_link_and_run_command (default: none) +## + +CONTAINER_NAME=bitnami-$APP_NAME-test +IMAGE_NAME=${IMAGE_NAME:-bitnami/$APP_NAME} +SLEEP_TIME=${SLEEP_TIME:-5} +VOL_PREFIX=${VOL_PREFIX:-/bitnami/$APP_NAME} +VOLUMES=${VOLUMES:-$VOL_PREFIX/data:$VOL_PREFIX/conf:$VOL_PREFIX/logs} +HOST_VOL_PREFIX=${HOST_VOL_PREFIX:-/tmp/bitnami/$CONTAINER_NAME} + +# Creates a container whose name has the prefix $CONTAINER_NAME +# $1: name for the new container +# ${@:2}: additional arguments for docker run while starting the container +container_create() { + docker run --name $CONTAINER_NAME-$1 "${@:2}" $IMAGE_NAME + sleep $SLEEP_TIME +} + +# Creates a container with host mounted volumes for volumes listed in VOLUMES +# $1: name for the new container +# ${@:2}: additional arguments for docker run while starting the container +container_create_with_host_volumes() { + # populate volume mount arguments from VOLUMES variable + VOLUME_ARGS= + OLD_IFS=${IFS} + IFS=":" + for VOLUME in $VOLUMES + do + VOL_NAME=$(basename $VOLUME) + VOLUME_ARGS+="-v $HOST_VOL_PREFIX/$1/$VOL_NAME:$VOLUME " + done + IFS=${OLD_IFS} + + container_create $1 "${@:2}" $VOLUME_ARGS +} + +# Start a stopped container +# $1: name of the container +container_start() { + if docker ps -a | grep -q $CONTAINER_NAME-$1; then + docker start $CONTAINER_NAME-$1 + sleep $SLEEP_TIME + else + return 1 + fi +} + +# Stop a running container +# $1: name of the container +container_stop() { + if docker ps | grep -q $CONTAINER_NAME-$1; then + docker stop $CONTAINER_NAME-$1 + else + return 1 + fi +} + +# Restart a running container (stops the container and then starts it) +# $1: name of the container +container_restart() { + if docker ps | grep -q $CONTAINER_NAME-$1; then + docker stop $CONTAINER_NAME-$1 + docker start $CONTAINER_NAME-$1 + sleep $SLEEP_TIME + fi +} + +# Remove a running/stopped container +# $1: name of the container +container_remove() { + if docker ps -a | grep -q $CONTAINER_NAME-$1; then + docker stop $CONTAINER_NAME-$1 + docker rm -v $CONTAINER_NAME-$1 + fi +} + +# Remove a running/stopped container and clear host volumes +# $1: name of the container +container_remove_full() { + container_remove $1 + + # populate volume mount and rm arguments from VOLUMES variable + VOLUME_ARGS= + RM_ARGS= + OLD_IFS=${IFS} + IFS=":" + for VOLUME in $VOLUMES + do + VOL_NAME=$(basename $VOLUME) + VOLUME_ARGS+="-v $HOST_VOL_PREFIX/$1/$VOL_NAME:$VOLUME " + RM_ARGS+="$VOLUME/* $VOLUME/.[^.]* " + done + IFS=${OLD_IFS} + + docker run --rm --entrypoint bash $VOLUME_ARGS \ + $IMAGE_NAME -c "rm -rf $RM_ARGS" +} + +# Get the logs of a container +# $1: name of the container +container_logs() { + if docker ps -a | grep -q $CONTAINER_NAME-$1; then + docker logs $CONTAINER_NAME-$1 + else + return 1 + fi +} + +# Docker inspect a container +# $1: name of the container +container_inspect() { + if docker ps -a | grep -q $CONTAINER_NAME-$1; then + # docker inspect "${@:2}" $CONTAINER_NAME-$1 # requires docker >= 1.9.0 + docker inspect $CONTAINER_NAME-$1 + else + return 1 + fi +} + +# Execute a command in a running container using docker exec +# $1: name of the container +container_exec() { + if docker ps | grep -q $CONTAINER_NAME-$1; then + docker exec $CONTAINER_NAME-$1 "${@:2}" + else + return 1 + fi +} + +# Execute a command in a running container using docker exec (detached) +# $1: name of the container +container_exec_detached() { + if docker ps | grep -q $CONTAINER_NAME-$1; then + docker exec -d $CONTAINER_NAME-$1 "${@:2}" + else + return 1 + fi +} + +# Generates docker link parameter for linking to a container +# $1: name of the container to link +# $2: alias for the link +container_link() { + if docker ps -a | grep -q $CONTAINER_NAME-$1; then + echo "--link $CONTAINER_NAME-$1:$2" + fi +} + +# Link to container and execute command +# $1: name of the container to link to +# ${@:2}: command to execute +container_link_and_run_command() { + # launch command as the entrypoint to skip the s6 init sequence (speeds up the tests) + docker run --rm $(container_link $1 $APP_NAME) $container_link_and_run_command_DOCKER_ARGS --entrypoint ${2} $IMAGE_NAME "${@:3}" +} + +# Link to container and execute curl +# $1: name of the container to link to +# ${@:2}: arguments to curl +curl_client() { + container_link_and_run_command $1 curl --noproxy $APP_NAME --retry 5 -L "${@:2}" +}