-#### check_string() 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.
-check_string() {
- #### Invert exit status to prevent triggering immediate exit due to set -e.
- ! actual_output=`$1 2>&1`
- if test "$actual_output" != "$2"; then
- echo "$0: \"$1\" should have produced:" 1>&2
- echo " $2" 1>&2
- echo "but instead produced:" 1>&2
- echo " $actual_output" 1>&2
+
+#### Shortcut to enable use of valgrind: set NMH_VALGRIND environment
+#### variable (to anything) so run_* will use valgrind.
+if [ "${NMH_VALGRIND}" -a -z "${NMH_TEST_PREFIX}" ]; then
+ #### Need absolute path to valgrind.supp in case the test does a cd.
+ NMH_TEST_PREFIX="valgrind --quiet --error-exitcode=1 \
+ --suppressions=`cd ${srcdir} && pwd`/test/valgrind.supp"
+fi
+
+#### Run test under another program by setting NMH_TEST_PREFIX
+#### environment variable to, e.g., 'valgrind --quiet'.
+run_prog() {
+ case $1 in
+ #### Don't run valgrind on shell built-in.
+ eval\ *) "$@" ;;
+ *) ${NMH_TEST_PREFIX} "$@" ;;
+ esac
+}
+
+
+#### 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
+ case $1 in
+ #### Don't run valgrind on shell built-in.
+ eval\ *) actual_output=`$1 2>&1` ;;
+ *) actual_output=`${NMH_TEST_PREFIX} $1 2>&1` ;;
+ esac
+ 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