#!/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=( $(echo ${DOCKER_BUILD_PKGS[@]/#/$builderDir\/}) )
	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"
