# Common helper routines for test shell scripts -- intended to be sourced by them # @configure_input@ #### The following exported variables are set by "make check". Ensure #### that they are set here so that individual tests can be run #### outside of make. Requires that MH_OBJ_DIR be set on entry. test -z "$MH_TEST_DIR" && MH_TEST_DIR="$MH_OBJ_DIR/test/testdir" test -z "$prefix" && prefix=@prefix@ test -z "$datarootdir" && datarootdir=@datarootdir@ test -z "$exec_prefix" && exec_prefix=@exec_prefix@ test -z "$auxexecdir" && auxexecdir="@libdir@" test -z "$bindir" && bindir="@bindir@" test -z "$mandir" && mandir="@mandir@" test -z "$sysconfdir" && sysconfdir="@sysconfdir@" test -z "$pagerpath" && pagerpath="@pagerpath@" test -z "$MULTIBYTE_ENABLED" && MULTIBYTE_ENABLED="@MULTIBYTE_ENABLED@" export MH_TEST_DIR auxexecdir bindir mandir sysconfdir pagerpath export MULTIBYTE_ENABLED test -z "$MH_INST_DIR" && MH_INST_DIR="${MH_TEST_DIR}/inst" export MH_INST_DIR unset MHBUILD MHCONTEXT MHMTSUSERCONF MHN MHSHOW MHSTORE MHTMPDIR unset MHLDEBUG MHPDEBUG MHWDEBUG MM_CHARSET PAGER output_md5() { #### Output just the checksum. If the filename needs to appear on #### the same line, the caller needs to add it. This avoids #### differences due to a leading '*' binary file indicator, for #### text files, on some platforms (Cygwin). @MD5SUM@ $* | @MD5FMT@ | cut -d ' ' -f 1 } #### Use built-in $((...)) in test suite if shell supports it. #### Borrowed from configure's as_fn_arith. The result is placed #### in global arith_val. #### Detected at run-time instead of by configure to allow testing #### with different shells. if (eval "test \$(( 1 + 1 )) = 2" 2>/dev/null); then eval 'arith_eval () { arith_val=$(( $* )); }' else arith_eval () { arith_val=`expr "$@" || test $? -eq 1`; } fi test_skip () { WHY="$1" echo "$Test $0 SKIP ($WHY)" exit 77 } # portable implementation of 'which' utility findprog() { PROG="$1" #### Don't need to save current IFS because this function is run in #### a subshell. IFS=: for D in $PATH; do if [ -z "$D" ]; then D=. fi if [ -f "$D/$PROG" -a -x "$D/$PROG" ]; then printf '%s\n' "$D/$PROG" break fi done } require_prog () { if [ -z "`findprog $1`" ]; then test_skip "missing $1" fi } # Some stuff for doing silly progress indicators progress_update () { THIS="$1" FIRST="$2" LAST="$3" arith_eval $LAST - $FIRST; RANGE=$arith_val arith_eval $THIS - $FIRST; PROG=$arith_val # this automatically rounds to nearest integer arith_eval 100 \* $PROG / $RANGE; PERC=$arith_val # note \r so next update will overwrite printf '%3d%%\r' $PERC } progress_done () { printf '100%%\n' } check_for_hard_links () { set +e printf '' > "${MH_TEST_DIR}/$$-1" if link "${MH_TEST_DIR}/$$-1" "${MH_TEST_DIR}/$$-2" 2>/dev/null; then hard_links_supported=1 else hard_links_supported=0 fi rm -f "${MH_TEST_DIR}/$$-1" "${MH_TEST_DIR}/$$-2" set -e } #### check() requires two arguments, each the name of a file to be #### diff'ed. #### If the same, the second file is removed. And the first file is #### removed unless the optional third argument has a value of #### 'keep first'. #### If different, global variable "failed" is incremented. check() { #### POSIX diff should support -c. if diff -c "$1" "$2"; then test $# -lt 3 -o "$3" != 'keep first' && rm -f "$1" rm -f "$2" else echo "$0: test failed, outputs are in $1 and $2." failed=`expr ${failed:-0} + 1` fi } #### run_test() requires two arguments, the first is a program and #### arguments, the second is its expected one-line output string. #### If the actual output does not match that string: #### an error message is printed and global variable "failed" is incremented; #### if there is an optional third argument, it is used in the error message. run_test() { set +e actual_output=`$1 2>&1` set -e if test x"$actual_output" != x"$2"; then echo "$0: ${3:-\"$1\"} expected:" 1>&2 echo " '$2'" 1>&2 echo "but instead got:" 1>&2 echo " '$actual_output'" 1>&2 failed=`expr ${failed:-0} + 1` fi } setup_test () { MH="${MH_TEST_DIR}/Mail/.mh_profile" MHMTSCONF="${MH_INST_DIR}${sysconfdir}/mts.conf" PATH="${MH_INST_DIR}${bindir}:${PATH}" MH_LIB_DIR="${MH_INST_DIR}${auxexecdir}" export MH MHMTSCONF MH_LIB_DIR PATH # # Only install once # if [ -d "${MH_INST_DIR}${bindir}" ]; then : else (cd "${MH_OBJ_DIR}" && make DESTDIR="${MH_INST_DIR}" SETGID_MAIL= install) || exit 1 #### Don't test with sendmail because it would really send the #### mail. If configured to use sendmail, change to smtp instead #### so that we use fakesmtp. #### And set up the maildrop in the test directory so tests don't #### use the user's real maildrop. sed -e 's/mts: *.*/mts: smtp/' \ -e "s%mmdfldir: *.*%mmdfldir: ${MH_TEST_DIR}/Mail%" \ -e 's%mmdflfil: *.*%mmdflfil: maildrop%' \ "${MHMTSCONF}" >"${MHMTSCONF}.new" mv -f "${MHMTSCONF}.new" "${MHMTSCONF}" fi # clean old test data trap "rm -rf '$MH_TEST_DIR/Mail'" 0 # setup test data mkdir "$MH_TEST_DIR/Mail" || exit 1 cat > "$MH" < /dev/null # create 10 basic messages for i in 1 2 3 4 5 6 7 8 9 10; do cat > $MH_TEST_DIR/Mail/inbox/$i < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Subject: Testing message $i This is message number $i EOF done }