xref: /minix/minix/tests/run (revision 90b80121)
1#!/bin/sh
2
3# Are we running as root?
4unset ROOT
5if [ "`id -u`" = 0 ]
6then	ROOT=yes
7fi
8
9# Initialization
10PATH=:/bin:/usr/bin:/sbin
11export PATH
12
13rm -rf DIR*			# remove any old junk lying around
14passed=`expr 0`			# count number of tests run correctly
15failed=`expr 0`			# count number of tests that failed
16skipped=`expr 0`		# count number of tests that were skipped
17total=`expr 0`			# total number of tests tried
18badones=			# list of tests that failed
19export USENETWORK		# set to "yes" for test48+82 to use the network
20
21# In the lists below, shell scripts should be listed without ".sh" suffix
22
23# Programs that require setuid
24setuids="test11 test33 test43 test44 test46 test56 test60 test61 test65 \
25	 test69 test73 test74 test78 test83 test85 test87 test88 test89"
26# Scripts that require to be run as root
27rootscripts="testisofs testvnd testrmib testrelpol"
28
29alltests="1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 \
30         21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
31         41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
32         61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
33         81 82 83 84 85 86 87 88 89 90 \
34	 sh1 sh2 interp mfs isofs vnd rmib"
35tests_no=`expr 0`
36
37# If root, make sure the setuid tests have the correct permissions
38# and make the dir bin-owned.
39if [ "$ROOT" ]
40then	/usr/sbin/chown bin .
41	/usr/sbin/chown root ${setuids}
42	chmod 4755 ${setuids}
43fi
44
45tests=$alltests
46
47# Are we given any args? If so, we might have to give
48# or change our testlist
49while getopts 'lt:T' opt
50do
51	case $opt in
52	l)	echo "$alltests"
53		exit 0
54		;;
55	t)      tests="$OPTARG"
56		;;
57	T)	tapmode=yes
58		diagprefix="# "
59		;;
60	?)      echo "Usage: run [-l] [-t testlist] [-T]" >&2
61		echo "	-l: list tests, exit" >&2
62		echo "	-t: execute given set of tests, default: all" >&2
63		echo "	-T: produce TAP-format output" >&2
64		exit 1
65	esac
66done
67
68# Count tests
69for i in `echo $tests`; do
70   if [ -x ./test$i -o -x ./test${i}.sh ]; then
71      tests_no=`expr $tests_no + 1`
72   fi
73done
74
75if [  $tests_no -eq 0 ]
76then
77	echo "No test binaries found. did you compile?"
78	exit 1
79fi
80
81# Print tests list whenever user asks for TAP mode. It is up
82# to the caller to make sure it makes sense, i.e. he knows what it
83# represents.
84if [ "$tapmode" ]
85then	echo "1..$tests_no"
86fi
87
88if [ "$tests" = "$alltests" ]
89then	# Print test welcome message
90	if [ ! "$tapmode" ]; then clear; fi
91	echo -n "${diagprefix}Running POSIX compliance test suite. "
92	echo "There are $tests_no tests in total."
93	echo "${diagprefix}"
94fi
95
96# Provide an argument for test63
97ARGS_63=`pwd`/mod
98
99runtest() {
100	i=$1
101	ARG=$2
102	# setuid doesn't work with scripts, so we can only run those as root
103	if echo "$rootscripts" | tr ' ' '\n' | grep "^test${i}\$" >/dev/null
104	then needroot=1
105	else needroot=0
106	fi
107	# depending on where we are, scripts might have a .sh suffix or not
108	if [ -x test${i}.sh ]
109	then NAME=./test${i}.sh
110	else NAME=./test$i
111	fi
112	if [ "$ROOT" ]
113	then
114		if [ $needroot -eq 1 ]
115		then $NAME $ARG || return 1
116		else su bin -c "$NAME $ARG" || return 1
117		fi
118	else
119		if [ $needroot -eq 1 ]
120		then echo "skipping test$i, not root." >&2 && return 0
121		else $NAME $ARG || return 1
122		fi
123	fi
124	return 0
125}
126
127# Run all the tests, keeping track of who failed.
128for i in `echo $tests`
129do
130   if [ -x ./test$i -o -x ./test${i}.sh ]
131   then
132      total=`expr $total + 1`
133      FAIL=0
134      ARG=`eval echo "\\${ARGS_$i}"`
135
136      if [ "$tapmode" ]
137      then	out=out.$$
138		rm -f $out
139		runtest $i $ARG >$out 2>&1
140      else	runtest $i $ARG
141      fi
142
143      FAIL=$?
144
145      if [ $FAIL -eq 0 ]
146         then	if [ "$tapmode" ]
147		then	echo "ok test $i"
148		fi
149		passed=`expr $passed + 1`
150         else	if [ "$tapmode" ]
151		then	echo "not ok test $i"
152		fi
153		failed=`expr $failed + 1`
154		badones=`echo $badones " " $i`
155      fi
156
157      if [ "$tapmode" ]
158      then	cat $out | sed "s/^/$diagprefix/"
159		rm -f $out
160      fi
161   else
162      echo "${diagprefix}warning: skipping test$i"
163      skipped=`expr $skipped + 1`
164   fi
165done
166
167# Print results of the tests.
168if [ "$tests" = "$alltests" ]
169then	echo "${diagprefix}"
170	if test $total = $passed
171	   then echo "${diagprefix}All $passed tests completed without error ($skipped skipped)."
172	   else echo "${diagprefix}Testing completed. Score: $passed passed, $failed failed, skipped $skipped"
173	        echo "${diagprefix}The following tests failed: $badones"
174	fi
175fi
176
177# if any test failed return an error
178if [ $failed -gt 0 ]
179then
180	exit 1
181fi
182
183# echo " "
184