#! /bin/sh # Global library file. Methods prefixed by '__dtf_' are internal, for example # __dtf_is_testdir. Other methods prefixed by 'dtf_' are API. # This file must never be used as template for 'dg' because it is used both on # maintainer machine and on tested machine. : ${SHELL=/bin/sh} __dtf_is_testdir () { test -d "$1" || return 1 case "$1" in DTF_OUTPUT|DTF_RESULT|library) return 1 ;; esac : } __dtf_internal_fail () { __dtf_control_msg "internal fail: $*" __dtf_rc=1 } __dtf_run_testcase () { resultdir="$outputdir/$testname" test "$testname" = ROOT && resultdir="$outputdir" stdout="$resultdir/stdout" stderr="$resultdir/stderr" mkdir -p "$resultdir" && cd "$resultdir" set dummy \ __DTF_TOP_TEST=false \ outputdir="$outputdir" \ "$@" shift __save_rc=1 if $__DTF_TOP_TEST; then eval "$@" 4>&2 3>&1 \ 2>> "$stderr" \ 1>> "$stdout" __save_rc=$? else for _d_i in stdout stderr do _d_fifo=$resultdir/fifo-$_d_i eval "_d_fifo_$_d_i=\$_d_fifo" test -e "$_d_fifo" && continue mkfifo "$_d_fifo" && continue __dtf_internal_fail "can't create $_d_fifo fifo" return 1 done tee -a "$stdout" < "$_d_fifo_stdout" >&1 & tee -a "$stderr" < "$_d_fifo_stderr" >&2 & eval "$@" 2> $_d_fifo_stderr >$_d_fifo_stdout __save_rc=$? rm "$_d_fifo_stdout" "$_d_fifo_stderr" || { __dtf_internal_fail "can't remove fifos" return 1 } fi case $__save_rc in 0|77) return 0 ;; *) __dtf_rc=1 return 1 ;; esac } __dtf_control_msg () { echo >&4 "$*" } __dtf_nl_control_msg () { __dtf_control_msg " ** $* ** " } __dtf_top_control_msg () { $__DTF_TOP_TEST && return __dtf_nl_control_msg "$*" } __dtf_toplevel_result_msg () { $__DTF_TOP_TEST || return case $1 in 0) __dtf_nl_control_msg "Success." ;; *) __dtf_nl_control_msg "Fail." ;; esac }