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