#!/bin/bash
#
# .travis-functions.sh:
#   - helper functions to be sourced from .travis.yml
#   - designed to respect travis' environment but testing locally is possible
#   - modified copy from util-linux project
#

if [ ! -f "configure.ac" ]; then
	echo ".travis-functions.sh must be sourced from source dir" >&2
	return 1 || exit 1
fi

## some config settings
# travis docs say we get 1.5 CPUs
MAKE="make -j2"
DUMP_CONFIG_LOG="short"
export TS_OPT_parsable="yes"

function configure_travis
{
	./configure "$@"
	err=$?
	if [ "$DUMP_CONFIG_LOG" = "short" ]; then
		grep -B1 -A10000 "^## Output variables" config.log | grep -v "_FALSE="
	elif [ "$DUMP_CONFIG_LOG" = "full" ]; then
		cat config.log
	fi
	return $err
}

function check_nonroot
{
	local cfg_opts="$1"

	[ -z "$cfg_opts" ] && return

	configure_travis \
		--enable-python \
		--enable-cryptsetup-reencrypt \
		--enable-internal-sse-argon2 \
		"$cfg_opts" \
		|| return

	$MAKE || return

	make check
}

function check_root
{
	local cfg_opts="$1"

	[ -z "$cfg_opts" ] && return

    configure_travis \
		--enable-python \
		--enable-cryptsetup-reencrypt \
		--enable-internal-sse-argon2 \
		"$cfg_opts" \
		|| return

	$MAKE || return

	# FIXME: we should use -E option here
	sudo make check
}

function check_nonroot_compile_only
{
	local cfg_opts="$1"

	[ -z "$cfg_opts" ] && return

	configure_travis \
		--enable-python \
		--enable-cryptsetup-reencrypt \
		--enable-internal-sse-argon2 \
		"$cfg_opts" \
		|| return

	$MAKE
}

function travis_install_script
{
	# install some packages from Ubuntu's default sources
	sudo apt-get -qq update
	sudo apt-get install -qq >/dev/null \
		python-dev \
		sharutils \
		libgcrypt20-dev \
		libssl-dev \
		libdevmapper-dev \
		libpopt-dev \
		uuid-dev \
		libsepol1-dev \
		libtool \
		dmsetup \
		autoconf \
		automake \
		pkg-config \
		autopoint \
		gettext \
		expect \
		keyutils \
		libjson-c-dev \
		libblkid-dev \
		|| return
}

function travis_before_script
{
	set -o xtrace

	./autogen.sh
	ret=$?

	set +o xtrace
	return $ret
}

function travis_script
{
	local ret
	set -o xtrace

	case "$MAKE_CHECK" in
	gcrypt)
		check_nonroot "--with-crypto_backend=gcrypt" && \
		check_root "--with-crypto_backend=gcrypt"
		;;
	gcrypt_compile)
		check_nonroot_compile_only "--with-crypto_backend=gcrypt"
		;;
	openssl)
		check_nonroot "--with-crypto_backend=openssl" && \
		check_root "--with-crypto_backend=openssl"
		;;
	openssl_compile)
		check_nonroot_compile_only "--with-crypto_backend=openssl"
		;;
	*)
		echo "error, check environment (travis.yml)" >&2
		false
		;;
	esac

	ret=$?
	set +o xtrace
	return $ret
}

function travis_after_script
{
	return 0
}
