#!/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