#!/bin/bash
# This script is run by Travis, to execute tests in the CI environment.

set -e

PASSENGER_ROOT=`dirname "$0"`
PASSENGER_ROOT=`cd "$PASSENGER_ROOT/../.." && pwd`
PASSENGER_ROOT_ON_DOCKER_HOST=${PASSENGER_ROOT_ON_DOCKER_HOST:-$PASSENGER_ROOT}

if [[ "$CACHE_DIR_ON_DOCKER_HOST" != "" ]]; then
	CACHE_DIR=/host_cache
else
	CACHE_DIR="$PWD/cache"
	CACHE_DIR_ON_DOCKER_HOST="$PWD/cache"
fi

COMPILE_CONCURRENCY=${COMPILE_CONCURRENCY:-2}

TEST_DYNAMIC_WITH_NGINX_VERSION=1.9.15

export VERBOSE=1
export TRACE=1
export DEVDEPS_DEFAULT=no
export rvmsudo_secure_path=1
export LC_CTYPE=C.UTF-8
export DEPS_TARGET="$CACHE_DIR/bundle"
export USE_CCACHE=true
export CCACHE_DIR="$CACHE_DIR/ccache"
export CCACHE_COMPRESS=1
export CCACHE_COMPRESS_LEVEL=3
unset BUNDLE_GEMFILE

if [[ -e /etc/workaround-docker-2267 ]]; then
	HOSTS_FILE=/etc/workaround-docker-2267/hosts
	sudo ln -s /etc/hosts /etc/workaround-docker-2267/hosts
	sudo workaround-docker-2267
	find /usr/local/rvm/rubies/*/lib/ruby -name resolv.rb | sudo xargs sed -i 's|/etc/hosts|/cte/hosts|g'
else
	HOSTS_FILE=/etc/hosts
fi

mkdir -p "$DEPS_TARGET"
mkdir -p "$CCACHE_DIR"

sudo sh -c "cat >> $HOSTS_FILE" <<EOF
127.0.0.1 passenger.test
127.0.0.1 mycook.passenger.test
127.0.0.1 zsfa.passenger.test
127.0.0.1 norails.passenger.test
127.0.0.1 1.passenger.test 2.passenger.test 3.passenger.test
127.0.0.1 4.passenger.test 5.passenger.test 6.passenger.test
127.0.0.1 7.passenger.test 8.passenger.test 9.passenger.test
EOF

function run()
{
	echo "$ $@"
	"$@"
}

function retry_run()
{
	local reset='\x1B[0m'
	local red='\x1B[31m'
	local yellow='\x1B[33m'

	local max_tries="$1"
	local number=2
	shift

	echo "$ $@"
	while true; do
		if "$@"; then
			return 0
		elif [[ $number -le $max_tries ]]; then
			echo -e "${yellow}The command \"$@\" failed. Retrying, $number of $max_tries:${reset}"
			(( number++ ))
		else
			echo -e "${red}The command \"$@\" failed after $max_tries attempts. Giving up.${reset}"
			return 1
		fi
	done
}

function apt_get_update() {
	if [[ "$apt_get_updated" = "" ]]; then
		apt_get_updated=1
		run sudo apt-get update
	fi
}

function rake_test_install_deps()
{
	# We do not use Bundler here because the goal might be to
	# install the Rake version as specified in the Gemfile,
	# which we may not have yet.
	run env NOEXEC_DISABLE=1 rake test:install_deps "$@"
	local code=$?
	if [[ $code != 0 ]]; then
		return $code
	fi

	local bundle_path
	if ! bundle_path=`bundle show rake`; then
		bundle_path=`bundle show nokogiri`
	fi
	bundle_path=`dirname "$bundle_path"`
	bundle_path=`dirname "$bundle_path"`
	echo "Adding bundle path $bundle_path to GEM_PATH"
	export GEM_PATH="$bundle_path:$GEM_PATH"
}

function install_test_deps_with_doctools()
{
	if [[ "$install_test_deps_with_doctools" = "" ]]; then
		install_test_deps_with_doctools=1
		retry_run 3 rake_test_install_deps BASE_DEPS=yes DOCTOOLS=yes
	fi
}

function install_base_test_deps()
{
	if [[ "$install_base_test_deps" = "" ]]; then
		install_base_test_deps=1
		retry_run 3 rake_test_install_deps BASE_DEPS=yes
	fi
}

function install_node_and_modules()
{
	if [[ "$install_node_and_modules" = "" ]]; then
		install_node_and_modules=1
		if [[ -e /host_cache ]]; then
			if [[ ! -e /host_cache/node-v0.10.20-linux-x64.tar.gz ]]; then
				run curl --fail -L -o /host_cache/node-v0.10.20-linux-x64.tar.gz \
					https://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar.gz
			fi
			run tar xzf /host_cache/node-v0.10.20-linux-x64.tar.gz
		else
			run curl --fail -L -O https://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar.gz
			run tar xzf node-v0.10.20-linux-x64.tar.gz
		fi
		export PATH=`pwd`/node-v0.10.20-linux-x64/bin:$PATH
		retry_run 3 rake_test_install_deps NODE_MODULES=yes
	fi
}

run uname -a
run lsb_release -a
run sudo tee /etc/dpkg/dpkg.cfg.d/02apt-speedup >/dev/null <<<"force-unsafe-io"
run cp test/config.json.travis test/config.json

# Relax permissions on home directory so that the application root
# permission checks pass.
run chmod g+x,o+x $HOME

if [[ "$TEST_RUBY_VERSION" != "" ]]; then
	echo "$ rvm use $TEST_RUBY_VERSION"
	if [[ -f ~/.rvm/scripts/rvm ]]; then
		source ~/.rvm/scripts/rvm
	else
		source /usr/local/rvm/scripts/rvm
	fi
	rvm use $TEST_RUBY_VERSION
	if [[ "$TEST_RUBYGEMS_VERSION" = "" ]]; then
		run gem --version
	fi
fi

if [[ "$TEST_RUBYGEMS_VERSION" != "" ]]; then
	retry_run 3 rvm install rubygems $TEST_RUBYGEMS_VERSION
	run gem --version
fi

ORIG_GEM_PATH="$GEM_PATH"


if [[ "$INSTALL_ALL_DEPS" = 1 ]]; then
	run rake_test_install_deps DEVDEPS_DEFAULT=yes
	INSTALL_DEPS=0
fi

if [[ "$TEST_CXX" = 1 ]]; then
	install_base_test_deps
	run bundle exec drake -j$COMPILE_CONCURRENCY test:cxx
	run bundle exec rake test:oxt
fi

if [[ "$TEST_RUBY" = 1 ]]; then
	retry_run 3 rake_test_install_deps BASE_DEPS=yes
	run bundle exec drake -j$COMPILE_CONCURRENCY test:ruby
fi

if [[ "$TEST_USH" = 1 ]]; then
	retry_run 3 rake_test_install_deps BASE_DEPS=yes USH_BUNDLES=yes
	export PASSENGER_CONFIG="$PWD/bin/passenger-config"
	run "$PASSENGER_CONFIG" install-standalone-runtime --auto

	pushd src/ruby_supportlib/phusion_passenger/vendor/union_station_hooks_core
	bundle exec rake spec:travis TRAVIS_WITH_SUDO=1
	popd

	pushd src/ruby_supportlib/phusion_passenger/vendor/union_station_hooks_rails
	bundle exec rake spec:travis GEM_BUNDLE_PATH="$DEPS_TARGET"
	popd
fi

if [[ "$TEST_NODE" = 1 ]]; then
	install_node_and_modules
	run bundle exec drake -j$COMPILE_CONCURRENCY test:node
fi

if [[ "$TEST_NGINX" = 1 ]]; then
	install_base_test_deps
	install_node_and_modules
	run ./bin/passenger-install-nginx-module --auto --prefix=/tmp/nginx --auto-download
	run bundle exec drake -j$COMPILE_CONCURRENCY test:integration:nginx

	run curl -sSLO http://www.nginx.org/download/nginx-$TEST_DYNAMIC_WITH_NGINX_VERSION.tar.gz
	run tar zxf nginx-$TEST_DYNAMIC_WITH_NGINX_VERSION.tar.gz
	run cd nginx-$TEST_DYNAMIC_WITH_NGINX_VERSION
	run ./configure --add-dynamic-module=$(../bin/passenger-config --nginx-addon-dir)
	run make
	run cd ..
fi

if [[ "$TEST_APACHE2" = 1 ]]; then
	apt_get_update
	run sudo apt-get install -y --no-install-recommends \
		apache2-mpm-worker apache2-threaded-dev
	install_base_test_deps
	install_node_and_modules
	run ./bin/passenger-install-apache2-module --auto #--no-update-config
	run rvmsudo ./bin/passenger-install-apache2-module --auto --no-compile
	run bundle exec drake -j$COMPILE_CONCURRENCY test:integration:apache2
fi

if [[ "$TEST_STANDALONE" = 1 ]]; then
	install_base_test_deps
	run bundle exec drake -j$COMPILE_CONCURRENCY test:integration:standalone
fi

if [[ "$TEST_SOURCE_PACKAGING" = 1 ]]; then
	apt_get_update
	run sudo apt-get install -y --no-install-recommends source-highlight
	install_test_deps_with_doctools
	run bundle exec rspec -f s -c test/integration_tests/source_packaging_test.rb
fi
