1#!/bin/sh 2# Usage: 3# runtest [applet1] [applet2...] 4 5. ./testing.sh 6 7total_failed=0 8 9# Run one old-style test. 10# Tests are stored in applet/testcase shell scripts. 11# They are run using "sh -x -e applet/testcase". 12# Option -e will make testcase stop on the first failed command. 13run_applet_testcase() 14{ 15 applet="$1" 16 testcase="$2" 17 18 status=0 19 uc_applet=$(echo "$applet" | tr a-z A-Z) 20 testname="$testcase" 21 22 testname="${testname##*/}" # take basename 23 if grep "^# CONFIG_$uc_applet is not set$" "$bindir/.config" >/dev/null; then 24 echo "UNTESTED: $testname" 25 return 0 26 fi 27 28 if grep "^# FEATURE: " "$testcase" >/dev/null; then 29 local feature=$(sed -ne 's/^# FEATURE: //p' "$testcase") 30 31 for f in $feature; do 32 if grep "^# $f is not set$" "$bindir/.config" >/dev/null; then 33 echo "UNTESTED: $testname" 34 return 0 35 fi 36 done 37 fi 38 39 rm -rf ".tmpdir.$applet" 40 mkdir -p ".tmpdir.$applet" 41 cd ".tmpdir.$applet" || return 1 42 43# echo "Running testcase $testcase" 44 d="$tsdir" \ 45 sh -x -e "$testcase" >"$testname.stdout.txt" 2>&1 || status=$? 46 if [ $status -ne 0 ]; then 47 echo "FAIL: $testname" 48 if [ x"$VERBOSE" != x ]; then 49 cat "$testname.stdout.txt" 50 fi 51 else 52 echo "PASS: $testname" 53 fi 54 55 cd .. 56 rm -rf ".tmpdir.$applet" 57 58 return $status 59} 60 61# Run all old-style tests for given applet 62run_oldstyle_applet_tests() 63{ 64 local applet="$1" 65 local status=0 66 67 for testcase in "$tsdir/$applet"/*; do 68 # switch on basename of $testcase 69 case "${testcase##*/}" in 70 .*) continue ;; # .svn, .git etc 71 *~) continue ;; # backup files 72 "CVS") continue ;; 73 \#*) continue ;; # CVS merge residues 74 *.mine) continue ;; # svn-produced junk 75 *.r[0-9]*) continue ;; # svn-produced junk 76 esac 77 run_applet_testcase "$applet" "$testcase" || { 78 status=1 79 total_failed=$((total_failed + 1)) 80 } 81 done 82 return $status 83} 84 85 86 87lcwd=$(pwd) 88[ x"$tsdir" != x"" ] || tsdir="$lcwd" 89[ x"$bindir" != x"" ] || bindir="${lcwd%/*}" # one directory up from $lcwd 90PATH="$bindir:$PATH" 91export bindir # some tests need to look at $bindir/.config 92 93if [ x"$VERBOSE" = x ]; then 94 export VERBOSE= 95fi 96 97if [ x"$1" = x"-v" ]; then 98 export VERBOSE=1 99 shift 100fi 101 102implemented=$( 103 printf "busybox " # always implemented 104 "$bindir/busybox" 2>&1 | 105 while read line; do 106 if [ x"$line" = x"Currently defined functions:" ]; then 107 xargs | sed 's/,//g' 108 break 109 fi 110 done 111 ) 112 113applets="$implemented" 114if [ $# -ne 0 ]; then 115 applets="$@" 116fi 117 118# Populate a directory with links to all busybox applets 119 120LINKSDIR="$bindir/runtest-tempdir-links" 121 122# Comment this line out if you have put a different binary in $LINKSDIR 123# (say, a "standard" tool's binary) in order to run tests against it: 124rm -rf "$LINKSDIR" 2>/dev/null 125 126mkdir "$LINKSDIR" 2>/dev/null 127for i in $implemented; do 128 # Note: if $LINKSDIR/applet exists, we do not overwrite it. 129 # Useful if one wants to run tests against a standard utility, 130 # not an applet. 131 ln -s "$bindir/busybox" "$LINKSDIR/$i" 2>/dev/null 132done 133 134# Set up option flags so tests can be selective. 135export OPTIONFLAGS=:$( 136 sed -nr 's/^CONFIG_//p' "$bindir/.config" | 137 sed 's/=.*//' | xargs | sed 's/ /:/g' 138 ): 139 140status=0 141for applet in $applets; do 142 # Any old-style tests for this applet? 143 if [ -d "$tsdir/$applet" ]; then 144 run_oldstyle_applet_tests "$applet" || status=1 145 fi 146 147 # Is this a new-style test? 148 if [ -f "$applet.tests" ]; then 149 if [ ! -e "$LINKSDIR/$applet" ]; then 150 # (avoiding bash'ism "${applet:0:4}") 151 if ! echo "$applet" | grep "^all_" >/dev/null; then 152 echo "SKIPPED: $applet (not built)" 153 continue 154 fi 155 fi 156# echo "Running test $tsdir/$applet.tests" 157 PATH="$LINKSDIR:$tsdir:$bindir:$PATH" \ 158 "$tsdir/$applet.tests" 159 rc=$? 160 total_failed=$((total_failed + rc)) 161 test $rc -ne 0 && status=1 162 fi 163done 164 165# Leaving the dir makes it somewhat easier to run failed test by hand 166#rm -rf "$LINKSDIR" 167 168if [ $status -ne 0 ] && [ x"$VERBOSE" = x ]; then 169 echo "$total_failed failure(s) detected; running with -v (verbose) will give more info" 170fi 171exit $status 172