librempeg/tests/fate.sh
Martin Storsjö 77294b2774 fate: Allow running multiple rounds of tests with differing settings
This can be used to run tests multple times, with e.g. differing
QEMU settings, by adding something like this to the FATE configuration
file:

    target_exec="qemu-aarch64-static"
    fate_targets="fate-checkasm fate-cpu"

    fate_environments="sve128 sve256 sve512"
    sve128_env="QEMU_CPU=max,sve128=on"
    sve256_env="QEMU_CPU=max,sve256=on"
    sve512_env="QEMU_CPU=max,sve512=on"

It's also possible to customize the target_exec command further
by injecting a sufficiently quoted variable into it, which then can
be updated for each run, e.g. target_exec="\$(CUR_EXEC_CMD)".

For each of the environment names in fate_environments, the tests
that are run get the name suffixed on the fate tests in the
test log and fate report, e.g. "fate-checkasm-h264dsp_sve128".

Signed-off-by: Martin Storsjö <martin@martin.st>
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2023-12-19 21:26:54 +01:00

136 lines
4.1 KiB
Bash
Executable File

#! /bin/sh
config=$1
die(){
echo "$@"
exit 1
}
test -r "$config" || die "usage: fate.sh <config>"
workdir=$(cd $(dirname $config) && pwd)
make=make
tar='tar c'
. "$config"
test -n "$slot" || die "slot not specified"
test -n "$repo" || die "repo not specified"
test -d "$samples" || die "samples location not specified"
: ${branch:=master}
lock(){
lock=$1/fate.lock
(set -C; exec >$lock) 2>/dev/null || return
trap 'rm $lock' EXIT
}
checkout(){
case "$repo" in
file:*|/*) src="${repo#file:}" ;;
git:*) git clone --quiet --branch "$branch" "$repo" "$src" ;;
esac
}
update()(
cd ${src} || return
case "$repo" in
git:*) git fetch --quiet --force && git reset --quiet --hard "origin/$branch" ;;
esac
)
configure()(
cd ${build} || return
${shell} ${src}/configure \
--prefix="${inst}" \
--samples="${samples}" \
--enable-gpl \
--enable-memory-poisoning \
${ignore_tests:+--ignore-tests="$ignore_tests"} \
${arch:+--arch=$arch} \
${cpu:+--cpu="$cpu"} \
${toolchain:+--toolchain="$toolchain"} \
${cross_prefix:+--cross-prefix="$cross_prefix"} \
${as:+--as="$as"} \
${cc:+--cc="$cc"} \
${ld:+--ld="$ld"} \
${target_os:+--target-os="$target_os"} \
${sysroot:+--sysroot="$sysroot"} \
${target_exec:+--target-exec="$target_exec"} \
${target_path:+--target-path="$target_path"} \
${target_samples:+--target-samples="$target_samples"} \
${extra_cflags:+--extra-cflags="$extra_cflags"} \
${extra_ldflags:+--extra-ldflags="$extra_ldflags"} \
${extra_libs:+--extra-libs="$extra_libs"} \
${extra_conf}
)
compile()(
cd ${build} || return
${make} ${makeopts} && ${make} install
)
fate()(
test "$build_only" = "yes" && return
cd ${build} || return
if [ -n "${fate_environments}" ]; then
ret=0
for e in ${fate_environments}; do
eval "curenv=\${${e}_env}"
echo Testing environment ${e}: ${curenv}
${make} ${makeopts_fate-${makeopts}} -k ${fate_targets} FATE_SUFFIX=_${e} ${curenv}
cur_ret=$?
test $cur_ret != 0 && ret=$cur_ret
done
return $ret
else
${make} ${makeopts_fate-${makeopts}} -k ${fate_targets}
fi
)
clean(){
rm -rf ${build} ${inst}
}
report(){
date=$(date -u +%Y%m%d%H%M%S)
echo "fate:1:${date}:${slot}:${version}:$1:$2:${branch}:${comment}" >report
cat ${build}/ffbuild/config.fate >>report
cat ${build}/tests/data/fate/*.rep >>report 2>/dev/null || for i in ${build}/tests/data/fate/*.rep ; do cat "$i" >>report 2>/dev/null; done
test -n "$fate_recv" && $tar report *.log | gzip | $fate_recv
}
fail(){
report "$@"
clean
exit
}
mkdir -p ${workdir} || die "Error creating ${workdir}"
lock ${workdir} || die "${workdir} locked"
cd ${workdir} || die "cd ${workdir} failed"
src=${workdir}/src
: ${build:=${workdir}/build}
: ${inst:=${workdir}/install}
: ${fate_targets:=fate}
test -d "$src" && update || checkout || die "Error fetching source"
cd ${workdir}
version=$(${src}/ffbuild/version.sh ${src})
test "$version" = "$(cat version-$slot 2>/dev/null)" && exit 0
echo ${version} >version-$slot
rm -rf "${build}" *.log
mkdir -p ${build}
configure >configure.log 2>&1 || fail 3 "error configuring"
compile >compile.log 2>&1 || fail 2 "error compiling"
fate >test.log 2>&1 || fail 1 "error testing"
report 0 success
clean