1#!/usr/local/bin/bash
2#	testframe.sh DIR
3# bare-bones testing framework.
4# run the test suites in the given DIR;
5# exit with nonzero status if any of them failed.
6# see README.testframe.txt for details.
7#
8
9# echo labelled error/warning message to stderr
10report()
11{
12	echo $PROG: $* 1>&2
13}
14
15# echo OK or BAD depending on argument (0 or not)
16status_word()
17{
18	if [ "$1" -eq 0 ]; then
19		echo OK
20	else
21		echo BAD
22	fi
23}
24
25# run the given testsuite, return nonzero if any testcase failed.
26run_testsuite()
27{
28	typeset testsuite="$1"
29
30	NFAIL=0
31	NSUCC=0
32
33	# add testsuite dir to PATH for convenience
34	typeset dir=$(dirname $testsuite)
35	PATH=$dir:$PATH
36	. testframe.inc
37	if [ -f $dir/common.inc ]; then
38		. $dir/common.inc
39	fi
40	. $testsuite
41	export TESTSUITE_NAME=$testsuite
42
43	echo ""
44	echo "# Begin $testsuite"
45
46	run
47	typeset runstat=$?
48
49	echo "# $testsuite summary: $NSUCC succeeded, $NFAIL failed"
50	if [ $runstat -ne 0 ]; then
51		((NFAIL++))
52		report "error: $testsuite run exit_status=$runstat!"
53	fi
54	echo "# End $testsuite -" $(status_word $NFAIL)
55	[ $NFAIL -eq 0 ]
56}
57
58#
59# list all testsuite scripts in the given directories.
60# a testsuite file must be a bash script whose name is of the form test_*.sh .
61#
62list_testsuites()
63{
64	for dir in "$@"; do
65		ls $dir/test_*.sh 2>/dev/null
66	done
67}
68
69main()
70{
71	TS_NFAIL=0
72	TS_NSUCC=0
73
74	echo "# Begin Test Suites in $*"
75	typeset testsuites=$(list_testsuites "$@")
76
77	if [ -z "$testsuites" ]; then
78		report "error: no testsuites found"
79		exit 1
80	fi
81
82	for testsuite in $testsuites; do
83		if run_testsuite $testsuite; then
84			((TS_NSUCC++))
85		else
86			((TS_NFAIL++))
87		fi
88	done
89
90	echo ""
91	echo "# Test Suites summary: $TS_NSUCC succeeded, $TS_NFAIL failed"
92	echo "# End Test Suites -" $(status_word $TS_NFAIL)
93	[ $TS_NFAIL -eq 0 ]
94}
95
96# ----- start of mainline code
97PROG=${0##*/}
98
99main "${@:-.}"
100