#!/bin/bash
#check for a text in a docker volume log
function check( ) {
if test $( docker inspect -f { { .State.Running} } $1 ) = "false" ; then
echo
echo " **** ERROR: container $1 not running "
exit 1
fi
docker logs $1 2>& 1 | grep -q " $2 "
}
# call with volume name
function wait_for_mysql( ) {
check $1 "mysqld: ready for connections"
}
# run a countdown and call a check function
# $1: expected time in seconds
# $2-: check function
function countdown( ) {
set +x
expect = $1
shift
max = $1
shift
for ( ( i = 0; i<$(( expect+max)) ; ++i) ) ; do
echo -en " \rPlease wait: $(( expect-i)) s "
$* && break || sleep 1
done
echo -e " \rdone in ${ i } s: $* "
echo
set -x
}
# should not be called with sudo root
if test " $( whoami) " = "root" ; then
echo "**** ERROR: call as non root user"
exit 1
fi
# option checks
NEED_XVFB = 0
NEED_DOCKER = 1
NEED_WEBTESTER = 0
PORT =
while test $# -gt 0; do
case " $1 " in
( --help| -h)
echo " $0 [OPTIONS] "
echo
echo "OPTIONS:"
echo
echo " -p <PORT> don't run, just prepare test on port <PORT>"
echo
exit 0
; ;
( -p| --port)
shift
PORT = $1
; ;
( *) echo " **** ERROR: unknown option ' $1 ', try --help " ; exit 1; ;
esac
if test $# -eq 0; then
echo "**** ERROR: missing value, try --help" ; exit 1;
fi
shift
done
error = 0;
# test for xvfb (needed by webtester)
if test ${ NEED_XVFB } -eq 1 -a \! -e " $( which xvfb-run) " ; then
echo "**** ERROR: XVFB Not Installed"
echo "you need to install xvfb"
echo "please execute as root:"
echo " apt-get install xvfb"
error = 1
fi
# test for docker if needed
if test ${ NEED_DOCKER } -eq 1 -a \! -e " $( which docker) " ; then
echo "**** ERROR: Docker Not Installed"
echo "you need to install the latest docker"
echo "please execute as root:"
echo " apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 \\"
echo " --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9"
echo " echo 'deb https://get.docker.io/ubuntu docker main' \\"
echo " > /etc/apt/sources.list.d/docker.list"
echo " apt-get update"
echo " apt-get install lxc-docker"
echo " adduser $( whoami) docker "
echo "you need to add the following line to /etc/default/docker:"
echo ' DOCKER_OPTS="--insecure-registry dev0004:5000"'
echo " logout $( whoami) and login again to run $( whoami) with group docker "
echo "additionals note:"
echo " if you run docker inside a VM (not recommended), you probably"
echo " need to foollow the instructions in chapter \"Changing Bridge"
echo " Subnetwork\" on https://marc.wäckerlin.ch/computer/docker-overview"
echo "introduction to docker, see:"
echo " https://marc.wäckerlin.ch/computer/docker-overview"
error = 1
fi
# check for webtester
if test ${ NEED_WEBTESTER } -eq 1 -a \! -e " $( which webrunner) " ; then
echo "**** ERROR: Webtester Not Installed"
echo "you need to install webtester"
echo "please execute as root:"
echo " apt-get install -y wget software-properties-common apt-transport-https"
echo " apt-add-repository https://dev.marc.waeckerlin.org/repository"
echo " wget -O- https://dev.marc.waeckerlin.org/repository/PublicKey \\"
echo " | apt-key add -"
echo " apt-get update -y"
echo " apt-get install -y webtester"
echo "more information, see:"
echo " https://dev.marc.waeckerlin.org/redmine/projects/webtester"
error = 1
fi
if test " $error " = "1" ; then
exit 1
fi
set -x
# Add tests here
MYSQL = $( docker run -d -e MYSQL_ROOT_PASSWORD = TopSecretLOL mysql)
PHP = $( docker run -d --volume $( pwd ) /../html:/usr/share/nginx/html:ro --link ${ MYSQL } :mysql mwaeckerlin/php-fpm)
if test -z " ${ PORT } " ; then
NGINX = $( docker run -d --volumes-from ${ PHP } --link ${ PHP } :php mwaeckerlin/nginx)
trap " docker rm -f ${ NGINX } ${ PHP } ${ MYSQL } " INT TERM EXIT
docker pull mwaeckerlin/webtester
set -e
countdown 10 20 wait_for_mysql ${ MYSQL }
docker run --rm --link ${ NGINX } :safechat -u $( id -u) -v $( pwd ) :/tests -e WEBRUNNER_SCRIPTS = "settings.wt testcase.wt" mwaeckerlin/webtester
else
NGINX = $( docker run -d -p ${ PORT } :80 --volumes-from ${ PHP } --link ${ PHP } :php mwaeckerlin/nginx)
trap " docker rm -f ${ NGINX } ${ PHP } ${ MYSQL } " INT TERM EXIT
set +x
echo "Ready to test; press enter to end"
read
set -x
fi