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