Fix the test suite so that individual *.tests files can be run ala

COMMAND=sort ./sort.tests
So we can compare against non-busybox versions, and possibly our testsuite
will be useful to somebody like the Linux Test Project someday.

Redid testing.sh to add new command, "optional", to skip tests that require
certain features.  (use: `optional FEATURE_SORT_BIG`, or `optional ""` to
stop skipping.)  Note that optional is a NOP if the environment variable
"OPTIONFLAGS" is blank, so although we're marking up the tests with busybox
specific knowledge, it doesn't interfere with running the tests without
busybox.

Moved setting the "OPTIONFLAGS" environment variable to runtest.  Philosophy:
busybox-specific stuff belongs in runtest; both testing.sh and the tests
themselves should be as busybox-agnostic as possible.

Moved detecting that a command isn't in busybox at all (hence skipping the
entire command.tests file) to runtests.  Rationale: optional can't currently
test for more than one feature at a time, so if we clear anything with
optional "" we might perform tests we don't want to.

Marked up busybox.tests to know which tests need CAT enabled.  Fixed up other
tests to be happy with new notation.

I suspect egrep should be appended to grep.  It's a sub-feature, really...
This commit is contained in:
Rob Landley 2005-11-07 08:50:53 +00:00
parent 7ad4b30ed4
commit 48c6157eb9
8 changed files with 66 additions and 71 deletions

View File

@ -7,15 +7,9 @@
if [ ${#COMMAND} -eq 0 ]; then COMMAND=busybox; fi if [ ${#COMMAND} -eq 0 ]; then COMMAND=busybox; fi
. testing.sh . testing.sh
# Depends on nothing
_BB_CONFIG_DEP=""
# We'll assume "cat" is built in, because we need some other command to test.
HELPDUMP=`$COMMAND` HELPDUMP=`$COMMAND`
# The gratuitous "\n"s are due to a shell idiosyncrasy: environment variables # We need to test under calling the binary under other names.
# seem to strip trailing whitespace, which makes cmp and diff unhappy.
ln -s `which "$COMMAND"` busybox-suffix ln -s `which "$COMMAND"` busybox-suffix
ln -s `which "$COMMAND"` unknown ln -s `which "$COMMAND"` unknown
@ -29,15 +23,16 @@ do
testing "$i" "" "$HELPDUMP\n\n" "" "" testing "$i" "" "$HELPDUMP\n\n" "" ""
testing "$i cat" "cat" "moo" "" "moo"
testing "$i unknown" "unknown 2>&1" \ testing "$i unknown" "unknown 2>&1" \
"unknown: applet not found\n" "" "" "unknown: applet not found\n" "" ""
testing "$i --help" "--help 2>&1" "$HELPDUMP\n\n" "" "" testing "$i --help" "--help 2>&1" "$HELPDUMP\n\n" "" ""
optional CAT
testing "$i cat" "cat" "moo" "" "moo"
testing "$i --help cat" "--help cat 2>&1 | grep prints" \ testing "$i --help cat" "--help cat 2>&1 | grep prints" \
"Concatenates FILE(s) and prints them to stdout.\n" "" "" "Concatenates FILE(s) and prints them to stdout.\n" "" ""
optional ""
testing "$i --help unknown" "--help unknown 2>&1" \ testing "$i --help unknown" "--help unknown 2>&1" \
"unknown: applet not found\n" "" "" "unknown: applet not found\n" "" ""

View File

@ -9,8 +9,7 @@
[ ${#COMMAND} -eq 0 ] && COMMAND=egrep [ ${#COMMAND} -eq 0 ] && COMMAND=egrep
. testing.sh . testing.sh
# Depends on FEATURE_GREP_EGREP_ALIAS optional FEATURE_GREP_EGREP_ALIAS
_BB_CONFIG_DEP=FEATURE_GREP_EGREP_ALIAS
testing "grep is also egrep" "foo" "foo\n" "" "foo\nbar\n" testing "grep is also egrep" "foo" "foo\n" "" "foo\nbar\n"
testing "egrep is not case insensitive" "foo ; [ \$? -ne 0 ] && echo yes" \ testing "egrep is not case insensitive" "foo ; [ \$? -ne 0 ] && echo yes" \

View File

@ -9,9 +9,6 @@
[ ${#COMMAND} -eq 0 ] && COMMAND=grep [ ${#COMMAND} -eq 0 ] && COMMAND=grep
. testing.sh . testing.sh
# Depends on grep
_BB_CONFIG_DEP=grep
# testing "test name" "options" "expected result" "file input" "stdin" # testing "test name" "options" "expected result" "file input" "stdin"
# file input will be file called "input" # file input will be file called "input"
# test can create a file "actual" instead of writing to stdout # test can create a file "actual" instead of writing to stdout
@ -75,8 +72,7 @@ testing "grep matches NUL" ". input > /dev/null 2>&1 ; echo \$?" "0\n" "\0\n" ""
testing "grep handles multiple regexps" "-e one -e two input ; echo \$?" \ testing "grep handles multiple regexps" "-e one -e two input ; echo \$?" \
"one\ntwo\n0\n" "one\ntwo\n" "" "one\ntwo\n0\n" "one\ntwo\n" ""
# Depends on FEATURE_GREP_EGREP_ALIAS optional FEATURE_GREP_EGREP_ALIAS
_BB_CONFIG_DEP=FEATURE_GREP_EGREP_ALIAS
testing "grep -E supports extended regexps" "-E fo+" "foo\n" "" "b\ar\nfoo\nbaz" testing "grep -E supports extended regexps" "-E fo+" "foo\n" "" "b\ar\nfoo\nbaz"
exit $FAILCOUNT exit $FAILCOUNT

View File

@ -16,13 +16,11 @@ testing "pidof (exit with error)" "veryunlikelyoccuringbinaryname ; echo \$?" \
testing "pidof (exit with success)" "pidof > /dev/null; echo \$?" "0\n" "" "" testing "pidof (exit with success)" "pidof > /dev/null; echo \$?" "0\n" "" ""
# Depends on FEATURE_PIDOF_SINGLE optional FEATURE_PIDOF_SINGLE
_BB_CONFIG_DEP=FEATURE_PIDOF_SINGLE
testing "pidof -s" "-s $(basename $0) ; echo -n \$?" \ testing "pidof -s" "-s $(basename $0) ; echo -n \$?" \
"$(pidof -s $(basename $0) ; echo -n $?)" "" "" "$(pidof -s $(basename $0) ; echo -n $?)" "" ""
# Depends on FEATURE_PIDOF_OMIT optional FEATURE_PIDOF_OMIT
_BB_CONFIG_DEP=FEATURE_PIDOF_OMIT
testing "pidof -o %PPID" "$(basename $0) -o %PPID ; echo -n \$?" \ testing "pidof -o %PPID" "$(basename $0) -o %PPID ; echo -n \$?" \
"$(pidof $(basename $0) -o %PPID ; echo -n $?)" "" "" "$(pidof $(basename $0) -o %PPID ; echo -n $?)" "" ""

View File

@ -91,6 +91,11 @@ else
applets=$(ls $srcdir) applets=$(ls $srcdir)
fi fi
# Set up option flags so tests can be selective.
configfile=${bindir:-../../}/.config
export OPTIONFLAGS=:$(echo $(sed -nr 's/^CONFIG_(.*)=.*/\1/p' $configfile) | sed 's/ /:/')
for applet in $applets; do for applet in $applets; do
if [ "$applet" = "links" ]; then continue; fi if [ "$applet" = "links" ]; then continue; fi
if [ "$applet" != "CVS" -a -d "$srcdir/$applet" ]; then if [ "$applet" != "CVS" -a -d "$srcdir/$applet" ]; then
@ -100,9 +105,18 @@ for applet in $applets; do
status=1 status=1
fi fi
fi fi
# Is this a new-style test?
applet=$(echo "$applet" | sed -n 's/\.tests$//p') applet=$(echo "$applet" | sed -n 's/\.tests$//p')
if [ ${#applet} -ne 0 ] if [ ${#applet} -ne 0 ]
then then
appcfg=`grep -i "^# CONFIG_$applet" $configfile`
if [ -n "$appcfg" ]
then
echo "SKIPPED: $applet (is configured out)"
continue
fi
# Setup environment for test.
if [ -d links ]; then if [ -d links ]; then
rm -f links/"$applet" rm -f links/"$applet"
else else

View File

@ -7,9 +7,6 @@
if [ ${#COMMAND} -eq 0 ]; then COMMAND=sort; fi if [ ${#COMMAND} -eq 0 ]; then COMMAND=sort; fi
. testing.sh . testing.sh
# Depends on sort
_BB_CONFIG_DEP=sort
# The basic tests. These should work even with the small busybox. # The basic tests. These should work even with the small busybox.
testing "sort" "input" "a\nb\nc\n" "c\na\nb\n" "" testing "sort" "input" "a\nb\nc\n" "c\na\nb\n" ""
@ -21,6 +18,7 @@ testing "sort reverse" "-r input" "wook\nwalrus\npoint\npabst\naargh\n" \
# These tests require the full option set. # These tests require the full option set.
optional FEATURE_SORT_BIG
# Longish chunk of data re-used by the next few tests # Longish chunk of data re-used by the next few tests
data="42 1 3 woot data="42 1 3 woot
@ -48,7 +46,7 @@ egg 1 2 papyrus
999 3 0 algebra 999 3 0 algebra
" "$data" "" " "$data" ""
# Busybox is definitely doing this one wrong just now... # Busybox is definitely doing this one wrong just now. FIXME
testing "sort key range with numeric option and global reverse" \ testing "sort key range with numeric option and global reverse" \
"-k2,3n -r input" \ "-k2,3n -r input" \

View File

@ -4,10 +4,18 @@
# #
# License is GPLv2, see LICENSE in the busybox tarball for full license text. # License is GPLv2, see LICENSE in the busybox tarball for full license text.
# The "testing" function uses one environment variable: # This file defines two functions, "testing" and "optionflag"
# COMMAND = command to execute
# The "testing" function must have the following environment variable set:
# COMMAND = command to execute
# #
# The function takes five arguments: # 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 "optionflag")
#
# The "testing" function takes five arguments:
# $1) Description to display when running command # $1) Description to display when running command
# $2) Command line arguments to command" # $2) Command line arguments to command"
# $3) Expected result (on stdout)" # $3) Expected result (on stdout)"
@ -17,39 +25,31 @@
# The exit value of testing is the exit value of the command it ran. # The exit value of testing is the exit value of the command it ran.
# #
# The environment variable "FAILCOUNT" contains a cumulative total of the # The environment variable "FAILCOUNT" contains a cumulative total of the
# number of failed tests.
# The "optional" function is used to skip certain tests, ala:
# optionflag CONFIG_FEATURE_THINGY
# #
# The "optional" function checks the environment variable "OPTIONFLAGS",
verbose=0 # which is either empty (in which case it always clears SKIP) or
debug=0 # else contains a colon-separated list of features (in which case the function
force=0 # clears SKIP if the flag was found, or sets it to 1 if the flag was not found).
for x in "$@" ; do
case "$x" in
-v|--verbose) verbose=1; shift;;
-d|--debug) debug=1; shift;;
-f|--force) force=1; shift;;
--) break;;
-*) echo "Unknown option '$x'"; exit 1;;
*) break;;
esac
done
if [ -n "$VERBOSE" ] ; then
verbose=1
fi
if [ -n "$DEBUG" ] ; then
debug=1
fi
export FAILCOUNT=0 export FAILCOUNT=0
export SKIP=
# Helper functions # Helper functions
config_is_set () optional()
{ {
local uc_what=$(echo ${1?} | tr a-z A-Z) option="$OPTIONFLAGS" | egrep "(^|:)$1(:|\$)"
grep -q "^[ ]*CONFIG_${uc_what}" ${bindir:-..}/.config || \ # Not set?
grep -q "^[ ]*BB_CONFIG_${uc_what}" ${bindir:-..}/.config if [[ -z "$1" || -z "$OPTIONFLAGS" || ${#option} -ne 0 ]]
return $? then
SKIP=""
return
fi
SKIP=1
} }
# The testing function # The testing function
@ -62,17 +62,14 @@ testing ()
exit exit
fi fi
if [ $debug -eq 1 ] ; then if [ -n "$DEBUG" ] ; then
set -x set -x
fi fi
if [ -n "$_BB_CONFIG_DEP" ] && [ ${force} -eq 0 ] if [ -n "$SKIP" ]
then then
if ! config_is_set "$_BB_CONFIG_DEP" echo "SKIPPED: $1"
then return 0
echo "SKIPPED: $1"
return 0
fi
fi fi
echo -ne "$3" > expected echo -ne "$3" > expected
@ -83,18 +80,19 @@ testing ()
cmp expected actual > /dev/null cmp expected actual > /dev/null
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
((FAILCOUNT++)) FAILCOUNT=$[$FAILCOUNT+1]
echo "FAIL: $1" echo "FAIL: $1"
if [ $verbose -eq 1 ] if [ -n "$VERBOSE" ]
then then
diff -u expected actual diff -u expected actual
fi fi
else else
echo "PASS: $1" echo "PASS: $1"
fi fi
rm -f input expected actual rm -f input expected actual
if [ $debug -eq 1 ] ; then if [ -n "$DEBUG" ]
then
set +x set +x
fi fi

View File

@ -9,9 +9,6 @@
if [ ${#COMMAND} -eq 0 ]; then COMMAND=uniq; fi if [ ${#COMMAND} -eq 0 ]; then COMMAND=uniq; fi
. testing.sh . testing.sh
# Depends on uniq
_BB_CONFIG_DEP=uniq
# testing "test name" "options" "expected result" "file input" "stdin" # testing "test name" "options" "expected result" "file input" "stdin"
# file input will be file called "input" # file input will be file called "input"
# test can create a file "actual" instead of writing to stdout # test can create a file "actual" instead of writing to stdout