# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2

# @ECLASS: tast-bundle.eclass
# @MAINTAINER:
# The Chromium OS Authors <chromium-os-dev@chromium.org>
# @BUGREPORTS:
# Please report bugs via https://crbug.com/new (with component "Tests>Tast")
# @VCSURL: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/eclass/@ECLASS@
# @BLURB: Eclass for building and installing Tast test bundles.
# @DESCRIPTION:
# Installs Tast integration test bundles.
# See https://chromium.googlesource.com/chromiumos/platform/tast/ for details.
# The bundle name (e.g. "cros") and type ("local" or "remote") are derived from
# the package name, which should be of the form "tast-<type>-tests-<name>".

# @ECLASS-VARIABLE: TAST_BUNDLE_PRIVATE
# @DESCRIPTION:
# If set to "1", this test bundle is not installed to images, but is downloaded
# at run time by local_test_runner. Otherwise this test bundle is installed to
# images.
# Only local tests can be marked private; remote test bundles are always
# installed to the chroot.
: ${TAST_BUNDLE_PRIVATE:=0}

# @ECLASS-VARIABLE: TAST_BUNDLE_EXCLUDE_DATA_FILES
# @DESCRIPTION:
# If set to "1", test data files are not copied.
# This must be set to 1 if the ebuild inherits tast-bundle-data.eclass
# and that eclass copies the data files instead.
: "${TAST_BUNDLE_EXCLUDE_DATA_FILES:=0}"

inherit cros-go

DEPEND="dev-go/crypto"
RDEPEND="app-arch/tar"

if ! [[ "${PN}" =~ ^tast-(local|remote)-tests-[a-z]+$ ]]; then
	die "Package \"${PN}\" not of form \"tast-<type>-tests-<name>\""
fi

# @FUNCTION: tast-bundle_pkg_setup
# @DESCRIPTION:
# Parses package name to extract bundle info and sets binary target.
tast-bundle_pkg_setup() {
	# Strip off the "tast-" prefix and the "-tests-*" suffix to get the type
	# ("local" or "remote").
	local tmp=${PN#tast-}
	TAST_BUNDLE_TYPE=${tmp%-tests-*}

	# Strip off everything preceding the bundle name.
	TAST_BUNDLE_NAME=${PN#tast-*-tests-}

	# Decide if this is a private bundle.
	TAST_BUNDLE_PREFIX=/usr
	if [[ "${TAST_BUNDLE_PRIVATE}" = 1 ]]; then
		if [[ "${TAST_BUNDLE_TYPE}" != local ]]; then
			die "Remote test bundles can not be marked private"
		fi
		TAST_BUNDLE_PREFIX=/build
	fi

	# The path to the test bundle code relative to the src/ directory.
	TAST_BUNDLE_PATH="chromiumos/tast/${TAST_BUNDLE_TYPE}/bundles/${TAST_BUNDLE_NAME}"

	# Install the bundle under /{usr|build}/libexec/tast/bundles/<type>.
	CROS_GO_BINARIES=(
		"chromiumos/tast/${TAST_BUNDLE_TYPE}/bundles/${TAST_BUNDLE_NAME}:${TAST_BUNDLE_PREFIX}/libexec/tast/bundles/${TAST_BUNDLE_TYPE}/${TAST_BUNDLE_NAME}"
	)

	CROS_GO_VET_FLAGS=(
		# Check printf-style arguments passed to testing.State methods.
		"-printf.funcs=Log,Logf,Error,Errorf,Fatal,Fatalf,Wrap,Wrapf"
		# Check the result of a function without side effects is used.
		"-unusedresult.funcs=errors.New,errors.Wrap,errors.Wrapf,fmt.Errorf,fmt.Sprint,fmt.Sprintf,sort.Reverse"
	)
}

# @FUNCTION: tast-bundle_src_prepare
# @DESCRIPTION:
# Sets up environment variables for the Go toolchain.
tast-bundle_src_prepare() {
	# Disable cgo and PIE on building Tast binaries. See:
	# https://crbug.com/976196
	# https://github.com/golang/go/issues/30986#issuecomment-475626018
	export CGO_ENABLED=0
	export GOPIE=0

	default
}

# @FUNCTION: tast-bundle_src_compile
# @DESCRIPTION:
# Compiles test bundle executables and generate associated misc files.
tast-bundle_src_compile() {
	cros-go_src_compile

	local i
	for (( i = 0; i < ${#CROS_WORKON_PROJECT[@]}; i++ )); do
		echo "${CROS_WORKON_REPO[i]}/${CROS_WORKON_PROJECT[i]} ${CROS_WORKON_COMMIT[i]}"
	done | jq -s -R -S 'split("\n") |
		map(split(" ") | select(.[0]) | {(.[0]): .[1]}) |
		add' > "${TAST_BUNDLE_NAME}.sig.json" || die "Generating signatures failed"

	# Build bundle executable for the host arch and get metadata dump.
	local source="chromiumos/tast/${TAST_BUNDLE_TYPE}/bundles/${TAST_BUNDLE_NAME}"
	local host_exec="host_${TAST_BUNDLE_NAME}"
	GOPATH="$(cros-go_gopath)" go build -v \
		${CROS_GO_VERSION:+"-ldflags=-X main.Version=${CROS_GO_VERSION}"} \
		-o "${host_exec}" \
		"${source}" || die "Generating bundle for host"
	"./${host_exec}" -exportmetadata > "${TAST_BUNDLE_NAME}.pb" || die "Exporting test metadata"
}

# @FUNCTION: tast-bundle_src_test
# @DESCRIPTION:
# Runs unit tests.
tast-bundle_src_test() {
	# Some unit tests write to /proc/self/comm to test interaction with
	# external processes.
	addwrite /proc/self/comm

	cros-go_src_test
}

# @FUNCTION: tast-bundle_src_install
# @DESCRIPTION:
# Installs test bundle executables, associated data files and other misc files.
tast-bundle_src_install() {
	cros-go_src_install

	insinto "${TAST_BUNDLE_PREFIX}/share/tast/signature/${TAST_BUNDLE_TYPE}"
	newins "${TAST_BUNDLE_NAME}.sig.json" "${TAST_BUNDLE_NAME}.json"

	if [[ "${TAST_BUNDLE_EXCLUDE_DATA_FILES}" -ne 1 ]]; then
		# The base directory where test data files are installed.
		local basedatadir="${TAST_BUNDLE_PREFIX}/share/tast/data"

		# Install each test category's data dir.
		pushd src >/dev/null || die "failed to pushd src"
		local datadir dest
		for datadir in "${TAST_BUNDLE_PATH}"/*/data; do
			[[ -e "${datadir}" ]] || break

			# Dereference symlinks to support shared files: https://crbug.com/927424
			dest=${ED%/}/${basedatadir#/}/${datadir%/*}
			mkdir -p "${dest}" || die "Failed to create ${dest}"
			cp --preserve=mode --dereference -R "${datadir}" "${dest}" || \
				die "Failed to copy ${datadir} to ${dest}"
			chmod -R u=rwX,go=rX "${dest}" || die "Failed to chmod ${dest}"
		done
		popd >/dev/null || die
	fi

	insinto ${TAST_BUNDLE_PREFIX}/share/tast/metadata/${TAST_BUNDLE_TYPE}
	doins "${TAST_BUNDLE_NAME}.pb"
}

EXPORT_FUNCTIONS pkg_setup src_prepare src_compile src_test src_install
