Initial public busybox upstream commit
[busybox4maemo] / testsuite / testing.sh
1 # Simple test harness infrastructurei for BusyBox
2 #
3 # Copyright 2005 by Rob Landley
4 #
5 # License is GPLv2, see LICENSE in the busybox tarball for full license text.
6
7 # This file defines two functions, "testing" and "optionflag"
8
9 # The following environment variables may be set to enable optional behavior
10 # in "testing":
11 #    VERBOSE - Print the diff -u of each failed test case.
12 #    DEBUG - Enable command tracing.
13 #    SKIP - do not perform this test (this is set by "optionflag")
14 #
15 # The "testing" function takes five arguments:
16 #       $1) Description to display when running command
17 #       $2) Command line arguments to command
18 #       $3) Expected result (on stdout)
19 #       $4) Data written to file "input"
20 #       $5) Data written to stdin
21 #
22 # The exit value of testing is the exit value of the command it ran.
23 #
24 # The environment variable "FAILCOUNT" contains a cumulative total of the
25 # number of failed tests.
26
27 # The "optional" function is used to skip certain tests, ala:
28 #   optionflag CONFIG_FEATURE_THINGY
29 #
30 # The "optional" function checks the environment variable "OPTIONFLAGS",
31 # which is either empty (in which case it always clears SKIP) or
32 # else contains a colon-separated list of features (in which case the function
33 # clears SKIP if the flag was found, or sets it to 1 if the flag was not found).
34
35 export FAILCOUNT=0
36 export SKIP=
37
38 # Helper functions
39
40 optional()
41 {
42   option=`echo "$OPTIONFLAGS" | egrep "(^|:)$1(:|\$)"`
43   # Not set?
44   if [ -z "$1" ] || [ -z "$OPTIONFLAGS" ] || [ ${#option} -ne 0 ]
45   then
46     SKIP=""
47     return
48   fi
49   SKIP=1
50 }
51
52 # The testing function
53
54 testing()
55 {
56   NAME="$1"
57   [ -z "$1" ] && NAME=$2
58
59   if [ $# -ne 5 ]
60   then
61     echo "Test $NAME has wrong number of arguments (must be 5) ($# $*)" >&2
62     exit
63   fi
64
65   [ -n "$DEBUG" ] && set -x
66
67   if [ -n "$SKIP" ]
68   then
69     echo "SKIPPED: $NAME"
70     return 0
71   fi
72
73   echo -ne "$3" > expected
74   echo -ne "$4" > input
75   [ -z "$VERBOSE" ] || echo "echo '$5' | $2"
76   echo -ne "$5" | eval "$2" > actual
77   RETVAL=$?
78
79   cmp expected actual >/dev/null 2>/dev/null
80   if [ $? -ne 0 ]
81   then
82     FAILCOUNT=$[$FAILCOUNT+1]
83     echo "FAIL: $NAME"
84     [ -n "$VERBOSE" ] && diff -u expected actual
85   else
86     echo "PASS: $NAME"
87   fi
88   rm -f input expected actual
89
90   [ -n "$DEBUG" ] && set +x
91
92   return $RETVAL
93 }
94
95 # Recursively grab an executable and all the libraries needed to run it.
96 # Source paths beginning with / will be copied into destpath, otherwise
97 # the file is assumed to already be there and only its library dependencies
98 # are copied.
99
100 mkchroot()
101 {
102   [ $# -lt 2 ] && return
103
104   echo -n .
105
106   dest=$1
107   shift
108   for i in "$@"
109   do
110     [ "${i:0:1}" == "/" ] || i=$(which $i)
111     [ -f "$dest/$i" ] && continue
112     if [ -e "$i" ]
113     then
114       d=`echo "$i" | grep -o '.*/'` &&
115       mkdir -p "$dest/$d" &&
116       cat "$i" > "$dest/$i" &&
117       chmod +x "$dest/$i"
118     else
119       echo "Not found: $i"
120     fi
121     mkchroot "$dest" $(ldd "$i" | egrep -o '/.* ')
122   done
123 }
124
125 # Set up a chroot environment and run commands within it.
126 # Needed commands listed on command line
127 # Script fed to stdin.
128
129 dochroot()
130 {
131   mkdir tmpdir4chroot
132   mount -t ramfs tmpdir4chroot tmpdir4chroot
133   mkdir -p tmpdir4chroot/{etc,sys,proc,tmp,dev}
134   cp -L testing.sh tmpdir4chroot
135
136   # Copy utilities from command line arguments
137
138   echo -n "Setup chroot"
139   mkchroot tmpdir4chroot $*
140   echo
141
142   mknod tmpdir4chroot/dev/tty c 5 0
143   mknod tmpdir4chroot/dev/null c 1 3
144   mknod tmpdir4chroot/dev/zero c 1 5
145
146   # Copy script from stdin
147
148   cat > tmpdir4chroot/test.sh
149   chmod +x tmpdir4chroot/test.sh
150   chroot tmpdir4chroot /test.sh
151   umount -l tmpdir4chroot
152   rmdir tmpdir4chroot
153 }
154