blob: ca58c0b04ac96c97e7edaaa2625bc4924e258625 [file] [log] [blame]
# 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_EXTERNAL_DATA_URLS
# @DESCRIPTION:
# URLs for external data files listed in files/external_data.conf:
# TAST_BUNDLE_EXTERNAL_DATA_URLS=(
# "gs://chromiumos-test-assets-public/tast/cros/example/file1.txt"
# "gs://chromiumos-test-assets-public/tast/cros/example/file2.txt"
# )
# This ensures that the ebuild file is updated whenever external_data.conf is
# changed, which is needed to make Portage generate and use an updated Manifest
# file.
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
# Mangles an external test data URL so it can be used as a destination filename
# in SRC_URI. Slashes are URL-escaped and the package name and an underscore are
# prepended.
_mangle_data_url() {
local url=$1
echo "${PN}_${url//\//%2F}"
}
# Reads the supplied external_data.conf file if it exists and prints
# whitespace-separated external data file paths and URLs, one per line. The
# config file also contains whitespace-separated paths and URLs, but may
# additionally contain '#'-prefixed comments.
_get_external_data_paths_and_urls() {
local conf_file=$1
[[ -f "${conf_file}" ]] || return
# Wrap 'sed' and 'grep' in 'command' to avoid Portage QA warnings. It's
# possible to parse the file only using bash, but sed/grep make for
# more-readable code.
local lines=$(command sed -e '/^\s*$/d' -e '/^\s*#/d' "${conf_file}")
local bad_lines=$(echo "${lines}" | command grep -E -v '^\s*\S+\s+\S+\s*$')
[[ -n "${bad_lines}" ]] && die "bad line(s) in ${conf_file}:\n${bad_lines}"
echo "${lines}"
}
# Adds additional entries to SRC_URI for external test data files.
_add_external_data_urls() {
local basedir="$(dirname "${EBUILD}")"
local conf="${basedir}/files/external_data.conf"
local path url
while read path url; do
if [[ " ${TAST_BUNDLE_EXTERNAL_DATA_URLS[@]} " != *" ${url} "* ]]; then
die "'${url}' in ${conf} but not in TAST_BUNDLE_EXTERNAL_DATA_URLS"
fi
# Include the package name and the URL in the destination filename to
# avoid conflicts if multiple tests use files with the same name and to
# force a re-download when a file's URL changes.
SRC_URI+=" ${url} -> $(_mangle_data_url "${url}")"
done < <(_get_external_data_paths_and_urls "${conf}")
for url in "${TAST_BUNDLE_EXTERNAL_DATA_URLS[@]}"; do
if [[ " ${SRC_URI} " != *" ${url} "* ]]; then
die "'${url}' in TAST_BUNDLE_EXTERNAL_DATA_URLS but not in ${conf}"
fi
done
}
# @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-}
# 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/libexec/tast/bundles/<type>.
CROS_GO_BINARIES=(
"chromiumos/tast/${TAST_BUNDLE_TYPE}/bundles/${TAST_BUNDLE_NAME}:/usr/libexec/tast/bundles/${TAST_BUNDLE_TYPE}/${TAST_BUNDLE_NAME}"
)
}
# @FUNCTION: tast-bundle_src_install
# @DESCRIPTION:
# Installs test bundle executable and associated data files.
tast-bundle_src_install() {
cros-go_src_install
# The base directory where test data files are installed.
local basedatadir=/usr/share/tast/data
# Install each test category's data dir.
pushd src >/dev/null || die "failed to pushd src"
local datadir
for datadir in "${TAST_BUNDLE_PATH}"/*/data; do
[[ -e "${datadir}" ]] || break
(insinto "${basedatadir}/${datadir%/*}" && doins -r "${datadir}")
done
popd >/dev/null
# Install external data files that were previously downloaded via SRC_URI.
local conf="${FILESDIR}/external_data.conf"
local path url srcpath destdir
while read path url; do
srcpath="${DISTDIR}/$(_mangle_data_url "${url}")"
[[ -e "${srcpath}" ]] || die "external data file ${srcpath} does not exist"
# Follow symlinks in DISTDIR to the real file since newins preserves symlinks.
srcpath=$(readlink -e "${srcpath}")
destdir="${basedatadir}/${TAST_BUNDLE_PATH}/$(dirname "${path}")"
(insinto "${destdir}" && newins "${srcpath}" "$(basename "${path}")")
done < <(_get_external_data_paths_and_urls "${conf}")
}
EXPORT_FUNCTIONS pkg_setup src_install
# Update SRC_URI to include URLs of external test data.
_add_external_data_urls