#!/bin/bash
# This script is used for testing install.sh and that it works for
# each of component of our apt and yum repos
set -e

: ${DEB_DIR:="$(pwd)/bundles/$(cat VERSION)/build-deb"}

if [[ ! -d "${DEB_DIR}" ]]; then
	echo "you must first run `make deb` or hack/make/build-deb"
	exit 1
fi

test_deb_install(){
	# test for each Dockerfile in contrib/builder

	builderDir="contrib/builder/deb/${PACKAGE_ARCH}"
	pkgs=( $(find "${builderDir}/"*/ -type d) )
	if [ ! -z "$DOCKER_BUILD_PKGS" ]; then
		pkgs=()
		for p in $DOCKER_BUILD_PKGS; do
			pkgs+=( "$builderDir/$p" )
		done
	fi
	for dir in "${pkgs[@]}"; do
		[ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; }
		local from="$(awk 'toupper($1) == "FROM" { print $2; exit }' "$dir/Dockerfile")"
		local dir=$(basename "$dir")

		if [[ ! -d "${DEB_DIR}/${dir}" ]]; then
			echo "No deb found for ${dir}"
			exit 1
		fi

		local script=$(mktemp /tmp/install-XXXXXXXXXX.sh)
		cat <<-EOF > "${script}"
		#!/bin/bash
		set -e
		set -x

		apt-get update && apt-get install -y apparmor

		dpkg -i /root/debs/*.deb || true

		apt-get install -yf

		/etc/init.d/apparmor start

		# this will do everything _except_ load the profile into the kernel
		(
		cd /etc/apparmor.d
		/sbin/apparmor_parser --skip-kernel-load docker-engine
		)
		EOF

		chmod +x "${script}"

		echo "testing deb install for ${from}"
		docker run --rm -i --privileged \
			-v ${DEB_DIR}/${dir}:/root/debs \
			-v ${script}:/install.sh \
			${from} /install.sh

		rm -f ${script}
	done
}

(
	bundle .integration-daemon-start
	test_deb_install
	bundle .integration-daemon-stop
) 2>&1 | tee -a "$DEST/test.log"
