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}"
+}