#!/bin/sh

set -e

login="root"
nntp=
ostype=
port=

usage() {
	local opt="$1"

	xargs <<-EOF
	Usage $(basename "$0")
	-H host
	[-l login]
	-o ostype
	[-p ssh_port]
	[-T]
	[-t tarball]
	EOF
	[ "$opt" = "h" ]
	exit
} >&2

while getopts "H:hl:o:p:t:T" opt; do
	case "$opt" in
	l)	login="$OPTARG";;
	o)	ostype="$OPTARG";;
	p)	port="$OPTARG";;
	t)	tarball="$OPTARG";;
	T)	sync_nntp=1;;
	H)	host="$OPTARG";;
	*)	usage "$opt"
	esac
done
shift $((OPTIND - 1))

trap usage EXIT

: "${host:?missing host (-H)}"

atexit() {
	local ex="$?"

	[ -z "$control_path" ] || rm -f "$control_path"

	case "$ex" in
	0)	printf >&2 "test succeded!\n";;
	*)	printf >&2 "test failed (exit:%d)\n" "$ex";;
	esac

	exit "$ex"
}
trap atexit EXIT
trap exit INT

ssh() {
	local cmd

	# Enforcing the use of sh if no command is specified.  This is needed
	# for operating systems that will not use sh by default (e.g. freebsd
	# will use csh)
	cmd="$1"
	if [ -z "$cmd" ]; then
		cmd=sh
	else
		shift
	fi

	command ssh \
		${port:+-p "$port"} \
		-l "$login" \
		-T \
		${control_path:+ \
			-o ControlPath="$control_path" \
			-o ControlMaster=auto \
			-o ControlPersist=120 \
		} \
		"$host" \
		"$cmd" "$@"
}

ssh_copy() {
	local dst

	dst="${1:?dst}"; shift

	# home-made scp, which happens not to be bogus.
	tar -cf- "$@" | ssh tar -C "$dst" -xf-
}

control_path="$(mktemp)"
local_wd="$(dirname "$0")"
remote_wd="$(ssh mktemp -d)"

installer="install.${ostype:?specify -o}.sh"
if ! [ -e "$local_wd/$installer" ]; then
	printf >&2 "unavailable test script for os '%s'\n" "$ostype"
	exit 1
fi

list_tests() (
	cd "$local_wd"
	find . -name 'test.*.sh'
)

[ -z "$tarball" ] || ssh_copy "$remote_wd" "$tarball"

ssh_copy "$remote_wd" \
	-C "$local_wd" \
	"$installer" \
	"common.sh" \
	"assets" \
	$(list_tests)

{ cat <<-END_SETTINGS; cat <<-'END_SCRIPT'; } | ssh
	PS4="$login@$host $ostype> "
	installer="$installer"
	tarball="$tarball"
	workdir="$remote_wd"
	crossbow_version="$(
		printf %s "$tarball" |
		sed "s/^.*crossbow-\(.*\)\.tar.*$/\1/"
	)"
	tests="$(list_tests)"
	sync_nntp="$sync_nntp"
END_SETTINGS
	set -e

	log_tarball="$PWD/testing_logs.tar"
	mark_failure="$PWD/test_failed"
	rm -f "$mark_failure"

	trap rm\ -rf\ '$workdir' EXIT
	cd "$workdir"
	[ -z "$tarball" ] || env \
		sync_nntp="$sync_nntp" \
		tarball="$tarball" \
		sh -x "$installer"

	export crossbow_version
	export workdir

	mkdir -p ./testing_logs

	for t in $tests; do
		printf >&2 "[ ] %s\r" "$t"

		if sh -ex "$t" \
			1>"./testing_logs/${t%.sh}.log" 2>&1
		then
			printf >&2 "[*] %s\n" "$t"
		else
			printf >&2 "[!] %s\n" "$t"
			touch "$mark_failure"
		fi
	done

	tar -cf "$log_tarball" ./testing_logs
END_SCRIPT

ssh test ! -e test_failed || {
	ssh cat testing_logs.tar | tar -xf -
	printf >&2 " ** failure! **\nCheck ./testing_logs\n"
	exit 1
}
