#!/bin/bash # # tester.sh - reads testcases from file and tests busybox applets vs GNU # counterparts # # set up defaults (can be changed with cmd-line options) BUSYBOX=../busybox TESTCASES=testcases LOGFILE=tester.log BB_OUT=bb.out GNU_OUT=gnu.out SETUP="" CLEANUP="" # internal-use vars fail_only=0 while getopts 'p:t:l:b:g:s:c:f' opt do case $opt in p) BUSYBOX=$OPTARG; ;; t) TESTCASES=$OPTARG; ;; l) LOGFILE=$OPTARG; ;; b) BB_OUT=$OPTARG; ;; g) GNU_OUT=$OPTARG; ;; s) SETUP=$OPTARG; ;; c) CLEANUP=$OPTARG; ;; f) fail_only=1; ;; *) echo "usage: $0 [-ptlbgsc]" echo " -p PATH path to busybox executable" echo " -t FILE run testcases in FILE" echo " -l FILE log test results in FILE" echo " -b FILE store temporary busybox output in FILE" echo " -g FILE store temporary GNU output in FILE" echo " -s FILE (setup) run commands in FILE before testcases" echo " -c FILE (cleanup) run commands in FILE after testcases" echo " -f display only testcases that fail" exit 1 ;; esac done #shift `expr $OPTIND - 1` # do normal setup [ -e $LOGFILE ] && rm $LOGFILE unalias -a # gets rid of aliases that might create different output # do extra setup (if any) if [ ! -z $SETUP ] then echo "running setup commands in $SETUP" sh $SETUP # XXX: Would 'eval' or 'source' work better instead of 'sh'? fi # go through each line in the testcase file cat $TESTCASES | while read line do #echo $line # only process non-blank lines and non-comment lines if [ "$line" ] then if [ `echo "$line" | cut -c1` != "#" ] then [ $fail_only -eq 0 ] && echo "testing: $line" | tee -a $LOGFILE # test if the applet was compiled into busybox applet=`echo $line | cut -d' ' -f1` $BUSYBOX 2>&1 | grep -qw $applet if [ $? -eq 1 ] then echo "WHOOPS: $applet not compiled into busybox" | tee -a $LOGFILE else $BUSYBOX $line > $BB_OUT $line > $GNU_OUT diff -q $BB_OUT $GNU_OUT > /dev/null if [ $? -eq 1 ] then echo "FAILED: $line" | tee -a $LOGFILE diff -u $BB_OUT $GNU_OUT >> $LOGFILE fi fi fi fi done echo "Finished. Results are in $LOGFILE" # do normal cleanup rm -f $BB_OUT $GNU_OUT # do extra cleanup (if any) if [ ! -z $CLEANUP ] then echo "running cleanup commands in $CLEANUP" sh $CLEANUP # XXX: Would 'eval' or 'source' work better instead of 'sh'? fi