#!/bin/bash
## CONFIG ##
srcdir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) || exit 1
export DTF_LIBDIR=${DTF_LIBDIR-$srcdir/libdtf}
export DTF_TASKS=${DTF_TASKS-$srcdir/tasks}
export DTF_RESULTDIR=${DTF_RESULTDIR-/var/tmp/dtf}
# when exists per-testsuite config.sh, source it here
test -r "$srcdir/config.sh" && . "$srcdir/config.sh"
export dtf_resultxml_file="$DTF_RESULTDIR/dtf.xml"
export dtf_option_verbose=0
export dtf_option_force=0
export dtf_option_testids=""
export dtf_option_listonly=0
. "$DTF_LIBDIR/libdtf.sh" || exit 1
## F.DEFS ##
info()
{
echo " * $@"
}
die()
{
echo "$@" >&2
exit 1
}
dist()
(
cd "$srcdir/../"
dir="$(basename "$srcdir")"
test -t 1 && die "can't put tarball to stdout"
if test -f "$dir/dist.include"; then
cmd="tar -ch"
while read line; do
cmd+=" $dir/$line"
done <"$srcdir/dist.include"
$cmd
elif declare -f "dtf_cb_dist_tasks" >/dev/null; then
dtf_cb_dist_tasks
else
tar -ch "$dir"
fi
)
# run TESTDIR
# -----------
# source the $TESTDIR/runtest.sh
run()
{
export dtf_workdir=$1
export dtf_test_id=$(basename "$dtf_workdir")
dtf_resultxml_cache "$( cd "$dtf_workdir"
. ./config.sh
echo ""
echo "$DTF_TEST_ID"
echo ""
echo "$DTF_TEST_DESCRIPTION"
echo ""
)"
( cd "$dtf_workdir"
outlog="$DTF_RESULTDIR/tasks/$dtf_test_id.log"
output_wrapper="cat > $outlog"
test $dtf_option_verbose = 1 \
&& output_wrapper="tee $outlog"
test ! -e ./config.sh -o ! -e ./config.sh \
&& echo "can not find one of {config,runtest}.sh" \
&& exit 1
. ./config.sh
if test "$dtf_option_listonly" -eq 1; then
echo "$DTF_TEST_ID"
exit 0
fi
if test -n "$dtf_option_testids"; then
[[ "$dtf_option_testids" = *\ $DTF_TEST_ID\ * ]] || exit 0
fi
printf "%-40s" "RUN $DTF_TEST_ID ..."
set -o pipefail
( . ./config.sh
. ./runtest.sh
rv=$?
test -n "$DTF_RESULT_TARBALL" \
&& cp "$DTF_RESULT_TARBALL" "$DTF_RESULTDIR/tasks/$dtf_test_id.tar.gz"
{ echo "---"
echo "exit_status: $rv"
echo "finished: \"$(date)\""
} >> "$DTF_RESULTDIR/tasks/$dtf_test_id.result"
exit $rv
) 2>&1 | eval "$output_wrapper"
rv=$?
test $rv -eq 0 && echo "[ OK ]" || echo "[ FAIL ]"
exit $rv
)
}
prepare_resultdir()
{
if test -e "$DTF_RESULTDIR"; then
test $dtf_option_force -eq 0 && die "result dir $DTF_RESULTDIR exits"
rm -rf "$DTF_RESULTDIR" || die "can not remove $DTF_RESULTDIR"
fi
mkdir -p "$DTF_RESULTDIR/tasks" || die "can not create $DTF_RESULTDIR"
}
show_help()
{
cat <&2
Usage: $0 [OPTIONS]
Script is aimed to perform set of tests in subdirectories.
Options:
--force Overwrite result dir if exists
--listonly List the available test ids
--testid=TESTID Perform this test only
--verbose Show complete output from each test
--help Show this help
EOHELP
test -n "$1" && exit "$1"
}
longopts="verbose,help,force,testid:,listonly,dist"
ARGS=$(getopt -o "v" -l "$longopts" -n "getopt" -- "$@")
if [ $? -ne 0 ]; then
echo "getopt error"
exit 1
fi
eval set -- "$ARGS"
while true; do
case "$1" in
--verbose)
dtf_option_verbose=1
shift
;;
--force)
dtf_option_force=1
shift
;;
--listonly)
dtf_option_listonly=1
shift
;;
--testid)
dtf_option_testids="$dtf_option_testids $2 "
shift 2
;;
--help)
show_help 0
;;
--dist)
dist
exit $?
;;
--)
shift
break
;;
esac
done
test $dtf_option_listonly -ne 1 && prepare_resultdir
dtf_resultxml_init "$dtf_resultxml_file"
result=0
while read i; do
testdir=$(dirname "$i")
run "$testdir" || result=1
if test $result -eq 0; then
dtf_resultxml_cache "Success"
else
dtf_resultxml_cache "Fail"
fi
done <<<"$(find "$DTF_TASKS" -name runtest.sh)"
dtf_resultxml_finish
exit $result