X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=testsuite%2Ftesting.sh;h=e7e64e58b6a559d5be312964a1283d8c78e79d0f;hb=b8ab4b038803df195eee9844c3597dd640c00393;hp=420cfa1efba4fcc729a73b6691031c86c4322fd0;hpb=b47a74f4e773dee93c60116dd34c002c7c118d0b;p=oweals%2Fbusybox.git diff --git a/testsuite/testing.sh b/testsuite/testing.sh old mode 100755 new mode 100644 index 420cfa1ef..e7e64e58b --- a/testsuite/testing.sh +++ b/testsuite/testing.sh @@ -1,81 +1,170 @@ -# Simple test harness infrastructurei for BusyBox +# Simple test harness infrastructure for BusyBox # # Copyright 2005 by Rob Landley # # License is GPLv2, see LICENSE in the busybox tarball for full license text. -# The "testing" function uses one environment variable: -# COMMAND = command to execute +# This file defines two functions, "testing" and "optional" +# and a couple more... + +# The following environment variables may be set to enable optional behavior +# in "testing": +# VERBOSE - Print the diff -u of each failed test case. +# DEBUG - Enable command tracing. +# SKIP - do not perform this test (this is set by "optional") # -# The function takes five arguments: -# $1) Description to display when running command -# $2) Command line arguments to command" -# $3) Expected result (on stdout)" -# $4) Data written to file "input" -# $5) Data written to stdin +# The "testing" function takes five arguments: +# $1) Test description +# $2) Command(s) to run. May have pipes, redirects, etc +# $3) Expected result on stdout +# $4) Data to be written to file "input" +# $5) Data to be written to stdin # -# The exit value of testing is the exit value of the command it ran. +# The exit value of testing is the exit value of $2 it ran. # # The environment variable "FAILCOUNT" contains a cumulative total of the -# - -# The command line parsing is ugly and should be improved. +# number of failed tests. -if [ "$1" == "-v" ] -then - verbose=1 -fi +# The "optional" function is used to skip certain tests, ala: +# optional FEATURE_THINGY +# +# The "optional" function checks the environment variable "OPTIONFLAGS", +# which is either empty (in which case it always clears SKIP) or +# else contains a colon-separated list of features (in which case the function +# clears SKIP if the flag was found, or sets it to 1 if the flag was not found). export FAILCOUNT=0 +export SKIP= + +# Helper for helpers. Oh my... + +test x"$ECHO" != x"" || { + ECHO="echo" + test x"`echo -ne`" = x"" || { + # Compile and use a replacement 'echo' which understands -e -n + ECHO="$PWD/echo-ne" + test -x "$ECHO" || { + gcc -Os -o "$ECHO" ../scripts/echo.c || exit 1 + } + } + export ECHO +} # Helper functions -config_is_set () +optional() { - local uc_what=$(echo ${1?} | tr a-z A-Z) - grep -q "^[ ]*CONFIG_${uc_what}" ${bindir:-..}/.config || \ - grep -q "^[ ]*BB_CONFIG_${uc_what}" ${bindir:-..}/.config - return $? + SKIP= + while test "$1"; do + if test x"${OPTIONFLAGS/*:$1:*/y}" != x"y"; then + SKIP=1 + return + fi + shift + done } # The testing function testing() { + NAME="$1" + [ -n "$1" ] || NAME="$2" + if [ $# -ne 5 ] then - echo "Test $1 has the wrong number of arguments" >&2 - exit + echo "Test $NAME has wrong number of arguments: $# (must be 5)" >&2 + exit 1 fi - if [ ${force_tests:-0} -ne 1 -a -n "$_BB_CONFIG_DEP" ] + [ -z "$DEBUG" ] || set -x + + if [ -n "$SKIP" ] then - if ! config_is_set "$_BB_CONFIG_DEP" - then - echo "UNTESTED: $1" - return 0 - fi + echo "SKIPPED: $NAME" + return 0 fi - f=$FAILCOUNT - echo -ne "$3" > expected - echo -ne "$4" > input - echo -n -e "$5" | eval "$COMMAND $2" > actual + $ECHO -ne "$3" > expected + $ECHO -ne "$4" > input + [ -z "$VERBOSE" ] || echo ====================== + [ -z "$VERBOSE" ] || echo "echo -ne '$4' >input" + [ -z "$VERBOSE" ] || echo "echo -ne '$5' | $2" + $ECHO -ne "$5" | eval "$2" > actual RETVAL=$? - cmp expected actual > /dev/null - if [ $? -ne 0 ] + if cmp expected actual >/dev/null 2>/dev/null then - FAILCOUNT=$[$FAILCOUNT+1] - echo "FAIL: $1" - if [ $verbose ] - then - diff -u expected actual - fi + echo "PASS: $NAME" else - echo "PASS: $1" + FAILCOUNT=$(($FAILCOUNT + 1)) + echo "FAIL: $NAME" + [ -z "$VERBOSE" ] || diff -u expected actual fi rm -f input expected actual + [ -z "$DEBUG" ] || set +x + return $RETVAL } + +# Recursively grab an executable and all the libraries needed to run it. +# Source paths beginning with / will be copied into destpath, otherwise +# the file is assumed to already be there and only its library dependencies +# are copied. + +mkchroot() +{ + [ $# -lt 2 ] && return + + $ECHO -n . + + dest=$1 + shift + for i in "$@" + do + #bashism: [ "${i:0:1}" == "/" ] || i=$(which $i) + i=$(which $i) # no-op for /bin/prog + [ -f "$dest/$i" ] && continue + if [ -e "$i" ] + then + d=`echo "$i" | grep -o '.*/'` && + mkdir -p "$dest/$d" && + cat "$i" > "$dest/$i" && + chmod +x "$dest/$i" + else + echo "Not found: $i" + fi + mkchroot "$dest" $(ldd "$i" | egrep -o '/.* ') + done +} + +# Set up a chroot environment and run commands within it. +# Needed commands listed on command line +# Script fed to stdin. + +dochroot() +{ + mkdir tmpdir4chroot + mount -t ramfs tmpdir4chroot tmpdir4chroot + mkdir -p tmpdir4chroot/{etc,sys,proc,tmp,dev} + cp -L testing.sh tmpdir4chroot + + # Copy utilities from command line arguments + + $ECHO -n "Setup chroot" + mkchroot tmpdir4chroot $* + echo + + mknod tmpdir4chroot/dev/tty c 5 0 + mknod tmpdir4chroot/dev/null c 1 3 + mknod tmpdir4chroot/dev/zero c 1 5 + + # Copy script from stdin + + cat > tmpdir4chroot/test.sh + chmod +x tmpdir4chroot/test.sh + chroot tmpdir4chroot /test.sh + umount -l tmpdir4chroot + rmdir tmpdir4chroot +}