#!/usr/bin/env bash
#
# Run unit tests and create report
#
# TESTFLAGS - add additional test flags. Ex:
#
#   TESTFLAGS='-v -run TestBuild' hack/test/unit
#
# TESTDIRS - run tests for specified packages. Ex:
#
#   TESTDIRS='./pkg/term' hack/test/unit
#
set -eux -o pipefail

BUILDFLAGS=(-tags 'netgo journald')
TESTFLAGS+=" -test.timeout=${TIMEOUT:-5m}"
TESTDIRS="${TESTDIRS:-./...}"

: "${api_pkg_list:=}"
: "${client_pkg_list:=}"
: "${pkg_list:=}"
: "${libnetwork_pkg_list:=}"

mkdir -p bundles

case "$TESTDIRS" in
	"./api"* | "./...")
		api_pkg_list=$(go -C ./api list -mod=readonly "${TESTDIRS/#\.\/api/\.}")
		;;
esac
if [ -n "${api_pkg_list}" ]; then
	# These are tests for a separate module. Run tests for this module with
	# '-mod=readonly' to prevent the "vendor/" directory being used, which
	# does have a copy of these files, but does not contain test files.
	#
	# From the Go documentation https://golang.org/ref/mod:
	#
	# - `-mod=mod` tells the go command to ignore the vendor directory and to
	#   automatically update `go.mod`, for example, when an imported package
	#   is not provided by any known module.
	# - `-mod=readonly` tells the go command to ignore the vendor directory
	#   and to report an error if `go.mod` needs to be updated.
	(
		cd api
		gotestsum --format=standard-quiet --jsonfile=../bundles/api-go-test-report.json --junitfile=../bundles/api-junit-report.xml -- \
			"${BUILDFLAGS[@]}" \
			-cover \
			-coverprofile=../bundles/api-coverage.out \
			-covermode=atomic \
			-mod=readonly \
			${TESTFLAGS} \
			${api_pkg_list} || exit $?
	)
fi

case "$TESTDIRS" in
	"./client"* | "./...")
		client_pkg_list=$(go -C ./client list -mod=readonly "${TESTDIRS/#\.\/client/\.}")
		;;
esac
if [ -n "${client_pkg_list}" ]; then
	# These are tests for a separate module. Run tests for this module with
	# '-mod=readonly' to prevent the "vendor/" directory being used, which
	# does have a copy of these files, but does not contain test files.
	#
	# From the Go documentation https://golang.org/ref/mod:
	#
	# - `-mod=mod` tells the go command to ignore the vendor directory and to
	#   automatically update `go.mod`, for example, when an imported package
	#   is not provided by any known module.
	# - `-mod=readonly` tells the go command to ignore the vendor directory
	#   and to report an error if `go.mod` needs to be updated.
	(
		cd client
		gotestsum --format=standard-quiet --jsonfile=../bundles/client-go-test-report.json --junitfile=../bundles/client-junit-report.xml -- \
			"${BUILDFLAGS[@]}" \
			-cover \
			-coverprofile=../bundles/client-coverage.out \
			-covermode=atomic \
			-mod=readonly \
			${TESTFLAGS} \
			${client_pkg_list} || exit $?
	)
fi

case "$TESTDIRS" in
	"./api"* | "./client"*)
		# modules are handled above
		;;
	*)
		exclude_paths='/vendor/|/integration'
		pkgs=$(go list "$TESTDIRS" | grep -vE "($exclude_paths)")

		pkg_list=$(echo "${pkgs}" | grep --fixed-strings -v "/libnetwork" || :)
		libnetwork_pkg_list=$(echo "${pkgs}" | grep --fixed-strings "/libnetwork" || :)

		echo "${libnetwork_pkg_list}" | grep --fixed-strings "libnetwork/drivers/bridge" \
			&& if ! type docker-proxy; then
				hack/make.sh binary-proxy install-proxy
			fi
		;;
esac

if [ -n "${pkg_list}" ]; then
	gotestsum --format=standard-quiet --jsonfile=bundles/go-test-report.json --junitfile=bundles/junit-report.xml -- \
		"${BUILDFLAGS[@]}" \
		-cover \
		-coverprofile=bundles/coverage.out \
		-covermode=atomic \
		${TESTFLAGS} \
		${pkg_list}
fi

if [ -n "${libnetwork_pkg_list}" ]; then
	rerun_flaky=1

	gotest_extra_flags="-skip=TestFlaky.*"
	# Custom -run passed, don't run flaky tests separately.
	if echo "$TESTFLAGS" | grep -Eq '(-run|-test.run)[= ]'; then
		rerun_flaky=0
		gotest_extra_flags=""
	fi

	# libnetwork tests invoke iptables, and cannot be run in parallel. Execute
	# tests within /libnetwork with '-p=1' to run them sequentially. See
	# https://github.com/moby/moby/issues/42458#issuecomment-873216754 for details.
	gotestsum --format=standard-quiet --jsonfile=bundles/libnetwork-go-test-report.json --junitfile=bundles/libnetwork-junit-report.xml \
		-- "${BUILDFLAGS[@]}" \
		-cover \
		-coverprofile=bundles/libnetwork-coverage.out \
		-covermode=atomic \
		-p=1 \
		${gotest_extra_flags} \
		${TESTFLAGS} \
		${libnetwork_pkg_list}

	if [ $rerun_flaky -eq 1 ]; then
		gotestsum --format=standard-quiet --jsonfile=bundles/libnetwork-flaky-go-test-report.json --junitfile=bundles/libnetwork-flaky-junit-report.xml \
			--packages "${libnetwork_pkg_list}" \
			--rerun-fails=4 \
			-- "${BUILDFLAGS[@]}" \
			-cover \
			-coverprofile=bundles/libnetwork-flaky-coverage.out \
			-covermode=atomic \
			-p=1 \
			-test.run 'TestFlaky.*' \
			${TESTFLAGS}
	fi
fi
