I'm about to introduce tests that need to run as root (like mount.tests),
authorRob Landley <rob@landley.net>
Thu, 9 Mar 2006 22:04:33 +0000 (22:04 -0000)
committerRob Landley <rob@landley.net>
Thu, 9 Mar 2006 22:04:33 +0000 (22:04 -0000)
meaning we want to run them in a chroot environment.  To help with this,
I worked out a utility function that makes it really easy to set up a chroot
environment.

testsuite/testing.sh

index f16f4c7e8de92a256645a7864adf3c83b051ae48..08f4200c588c7b4ec6fb9922abf9b23db18668a2 100755 (executable)
@@ -58,7 +58,7 @@ testing ()
 {
   if [ $# -ne 5 ]
   then
-    echo "Test $1 has the wrong number of arguments" >&2
+    echo "Test $1 has the wrong number of arguments ($# $*)" >&2
     exit
   fi
 
@@ -74,7 +74,7 @@ testing ()
 
   echo -ne "$3" > expected
   echo -ne "$4" > input
-  echo -n -e "$5" | eval "$COMMAND $2" > actual
+  echo -ne "$5" | eval "$COMMAND $2" > actual
   RETVAL=$?
 
   cmp expected actual > /dev/null
@@ -98,3 +98,30 @@ testing ()
 
   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.
+
+function mkchroot
+{
+  [ $# -lt 2 ] && return
+
+  dest=$1
+  shift
+  for i in "$@"
+  do
+    if [ "${i:0:1}" == "/" ]
+    then
+      [ -f "$dest/$i" ] && continue
+      d=`echo "$i" | grep -o '.*/'` &&
+      mkdir -p "$dest/$d" &&
+      cat "$i" > "$dest/$i" &&
+      chmod +x "$dest/$i"
+    else
+      i="$dest/$i"
+    fi
+    mkchroot "$dest" $(ldd "$i" | egrep -o '/.* ')
+  done
+}