r21701: Fix ejs tests.
[garming/samba-autobuild/.git] / source4 / script / tests / selftest.sh
index 002682f9c589268f6779a5b2ed9eb56138411e48..fa94412136dd9f21fe4e6481c04f9f06f9059afb 100755 (executable)
 #!/bin/sh
-DOMAIN=SAMBADOMAIN
-USERNAME=administrator
-REALM=$DOMAIN
-PASSWORD=penguin
-SRCDIR=`pwd`
-ROOT=$USER
-if test -z "$ROOT"; then
-    ROOT=`whoami`
-fi
+# Bootstrap Samba and run a number of tests against it.
 
 if [ $# -lt 1 ]
 then
-       echo "$0 PREFIX"
+       echo "$0 PREFIX TESTS"
        exit
 fi
 
-PREFIX=$1
-export PREFIX
-mkdir -p $PREFIX || exit $?
+ARG0=$0
+ARG1=$1
+ARG2=$2
+ARG3=$3
+
+if [ -z "$TORTURE_MAXTIME" ]; then
+    TORTURE_MAXTIME=1200
+fi
+
+# disable rpc validation when using valgrind - its way too slow
+if [ -z "$VALGRIND" ]; then
+    VALIDATE="validate";
+else
+    VALIDATE="";
+fi
+
 OLD_PWD=`pwd`
-cd $PREFIX || exit $?
-PREFIX_ABS=`pwd`
+PREFIX=$ARG1
+PREFIX=`echo $PREFIX | sed s+//+/+`
+export PREFIX
+
+# allow selection of the test lists
+TESTS=$ARG2
+
+if [ $TESTS = "all" ]; then
+    TLS_ENABLED="yes"
+else
+    TLS_ENABLED="no"
+fi
+export TLS_ENABLED
+
+LD_LDB_MODULE_PATH=$OLD_PWD/bin/modules/ldb
+export LD_LDB_MODULE_PATH
+
+LD_SAMBA_MODULE_PATH=$OLD_PWD/bin/modules
+export LD_SAMBA_MODULE_PATH
+
+LD_LIBRARY_PATH=$OLD_PWD/bin/shared:$LD_LIBRARY_PATH
+export LD_LIBRARY_PATH
+
+PKG_CONFIG_PATH=$OLD_PWD/bin/pkgconfig:$PKG_CONFIG_PATH
+export PKG_CONFIG_PATH
+
+incdir=`dirname $ARG0`
+echo -n "PROVISIONING..."
+eval `$incdir/mktestsetup.sh $PREFIX || exit 1`
+echo "DONE"
+
+export KRB5_CONFIG
 export PREFIX_ABS
-cd $OLD_PWD
-
-TMPDIR=$PREFIX_ABS/tmp
-LIBDIR=$PREFIX_ABS/lib
-PIDDIR=$PREFIX_ABS/pid
-CONFFILE=$LIBDIR/smb.conf
-PRIVATEDIR=$PREFIX_ABS/private
-NCALRPCDIR=$PREFIX_ABS/ncalrpc
-LOCKDIR=$PREFIX_ABS/lockdir
-TLSDIR=$PRIVATEDIR/tls
-CONFIGURATION="--configfile=$CONFFILE"
+export TEST_DATA_PREFIX
 export CONFIGURATION
+export CONFFILE
+export PIDDIR
+export AUTH
+export SERVER
+export NETBIOSNAME
 
-SMBD_TEST_FIFO="$PREFIX/smbd_test.fifo"
-export SMBD_TEST_FIFO
-SMBD_TEST_LOG="$PREFIX/smbd_test.log"
-export SMBD_TEST_LOG
+PATH=bin:$PATH
+export PATH
 
-DO_SOCKET_WRAPPER=$2
+DO_SOCKET_WRAPPER=$ARG3
 if [ x"$DO_SOCKET_WRAPPER" = x"SOCKET_WRAPPER" ];then
-       SOCKET_WRAPPER_DIR="$PREFIX/socket_wrapper_dir"
+       SOCKET_WRAPPER_DIR="$PREFIX/w"
        export SOCKET_WRAPPER_DIR
        echo "SOCKET_WRAPPER_DIR=$SOCKET_WRAPPER_DIR"
+else
+       echo "NOT USING SOCKET_WRAPPER"
 fi
 
-# start off with 0 failures
-failed=0
-export failed
-
-incdir=`dirname $0`
+incdir=`dirname $ARG0`
 . $incdir/test_functions.sh
 
-PATH=bin:$PATH
-export PATH
-
-rm -rf $PREFIX/*
-mkdir -p $PRIVATEDIR $LIBDIR $PIDDIR $NCALRPCDIR $LOCKDIR $TMPDIR $TLSDIR
-./setup/provision $CONFIGURATION --quiet --domain $DOMAIN --realm $REALM \
-    --adminpass $PASSWORD --root=$ROOT
-
-cat >$CONFFILE<<EOF
-[global]
-       netbios name = LOCALHOST
-       workgroup = $DOMAIN
-       realm = $REALM
-       private dir = $PRIVATEDIR
-       pid directory = $PIDDIR
-       ncalrpc dir = $NCALRPCDIR
-       lock dir = $LOCKDIR
-        js include = $SRCDIR/scripting/libjs
-       name resolve order = bcast
-       interfaces = lo*
-
-[tmp]
-       path = $TMPDIR
-       read only = no
-       ntvfs handler = posix
-       posix:sharedelay = 100000
-       posix:eadb = $LOCKDIR/eadb.tdb
-
-[cifs]
-       read only = no
-       ntvfs handler = cifs
-        cifs:server = localhost
-        cifs:user = $USERNAME
-        cifs:password = $PASSWORD
-        cifs:domain = $DOMAIN
-       cifs:share = tmp
-EOF
-
-if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
-       CONFIGURATION="$CONFIGURATION --option=\"torture:progress=no\""
+#Start slapd before smbd
+if [ x"$TEST_LDAP" = x"yes" ]; then
+    if test -z "$FEDORA_DS_PREFIX"; then
+       slapd_start || exit 1;
+    else
+       fedora_ds_start || exit 1;
+    fi
+    echo -n "LDAP PROVISIONING..."
+    $srcdir/bin/smbscript $srcdir/setup/provision $PROVISION_OPTIONS "$PROVISION_ACI" --ldap-backend=$LDAP_URI || {
+       echo "LDAP PROVISIONING failed: $srcdir/bin/smbscript $srcdir/setup/provision $PROVISION_OPTIONS $PROVISION_ACI --ldap-backend=$LDAP_URI"
+       exit 1;
+    }
+    #LDAP is slow
+    TORTURE_MAXTIME=`expr $TORTURE_MAXTIME '*' 2`
 fi
 
+SMBD_TEST_FIFO="$PREFIX/smbd_test.fifo"
+export SMBD_TEST_FIFO
+SMBD_TEST_LOG="$PREFIX/smbd_test.log"
+export SMBD_TEST_LOG
+
+SOCKET_WRAPPER_DEFAULT_IFACE=1
+export SOCKET_WRAPPER_DEFAULT_IFACE
 smbd_check_or_start
 
+SOCKET_WRAPPER_DEFAULT_IFACE=6
+export SOCKET_WRAPPER_DEFAULT_IFACE
+TORTURE_INTERFACES='127.0.0.6/8,127.0.0.7/8,127.0.0.8/8,127.0.0.9/8,127.0.0.10/8,127.0.0.11/8'
+TORTURE_OPTIONS="--option=interfaces=$TORTURE_INTERFACES $CONFIGURATION"
 # ensure any one smbtorture call doesn't run too long
-TORTURE_OPTIONS="--maximum-runtime=300 $CONFIGURATION"
+TORTURE_OPTIONS="$TORTURE_OPTIONS --maximum-runtime=$TORTURE_MAXTIME"
+TORTURE_OPTIONS="$TORTURE_OPTIONS --target=samba4"
 export TORTURE_OPTIONS
 
+if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+       TORTURE_OPTIONS="$TORTURE_OPTIONS --option=torture:progress=no"
+fi
+
+ runtest() {
+       if [ -z "$PREFIX" ]; then
+           PREFIX=test_prefix
+           mkdir -p $PREFIX
+       fi
+       name=$1
+       shift 1
+       cmdline="$*"
+
+       SMBD_IS_UP="no"
+
+       shname=`echo $name | \
+       sed -e 's%[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\-]%_%g'`
+
+       UNIQUE_PID=`/bin/sh -c 'echo $$'`
+       TEST_LOG="$PREFIX/test_log.${UNIQUE_PID}"
+       TEST_PCAP="$PREFIX/test_${shname}_${UNIQUE_PID}.pcap"
+       trap "rm -f $TEST_LOG $TEST_PCAP" EXIT
+
+        if [ -n "$SMBD_TEST_LOG" -a -z "$smbd_log_size" ]; then
+           smbd_log_size=`wc -l < $SMBD_TEST_LOG`;
+       fi
+
+       if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+               echo "--==--==--==--==--==--==--==--==--==--==--"
+               echo "Running test $name (level 0 stdout)"
+               echo "--==--==--==--==--==--==--==--==--==--==--"
+               date
+               echo "Testing $name"
+       else
+               nf="`expr $failed + $totalfailed`";
+               if [ "$nf" = "0" ]; then 
+                   echo "[$current/$total] Testing $name"
+               else 
+                   echo "[$current/$total, $nf failures] Testing $name"
+               fi
+       fi
+
+       smbd_check_only && SMBD_IS_UP="yes"
+       if [ x"$SMBD_IS_UP" != x"yes" ];then
+               if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+                       echo "SMBD is down! Skipping: $cmdline"
+                       echo "=========================================="
+                       echo "TEST SKIPPED: $name (reason SMBD is down)"
+                       echo "=========================================="
+               else
+                       echo "TEST SKIPPED: $name (reason SMBD is down)"
+               fi
+               return 1
+       fi
+
+       if [ x"$MAKE_TEST_ENABLE_PCAP" = x"yes" ];then
+               SOCKET_WRAPPER_PCAP_FILE=$TEST_PCAP
+               export SOCKET_WRAPPER_PCAP_FILE
+       fi
+
+       ( $cmdline > $TEST_LOG 2>&1 )
+       status=$?
+       # show any additional output from smbd that has happened in this test
+       smbd_have_test_log && {             
+           new_log_size=`wc -l < $SMBD_TEST_LOG`;
+           test "$new_log_size" = "$smbd_log_size" || {
+               echo "SMBD OUTPUT:";
+               incr_log_size=`expr $new_log_size - $smbd_log_size`;
+               tail -$incr_log_size $SMBD_TEST_LOG;
+               smbd_log_size=$new_log_size;
+           }
+       }
+       if [ x"$status" != x"0" ]; then
+               echo "TEST OUTPUT:"
+               cat $TEST_LOG;
+               rm -f $TEST_LOG;
+               if [ x"$MAKE_TEST_ENABLE_PCAP" = x"yes" ];then
+                       echo "TEST PCAP: $TEST_PCAP"
+               fi
+               if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+                       echo "=========================================="
+                       echo "TEST FAILED: $name (status $status)"
+                       echo "=========================================="
+               else
+                       echo "TEST FAILED: $cmdline (status $status)"
+               fi
+               trap "" EXIT
+               return 1;
+       fi
+       rm -f $TEST_LOG;
+       if [ x"$MAKE_TEST_KEEP_PCAP" = x"yes" ];then
+               echo "TEST PCAP: $TEST_PCAP"
+       else
+               rm -f $TEST_PCAP;
+       fi
+       if [ x"$RUN_FROM_BUILD_FARM" = x"yes" ];then
+               echo "ALL OK: $cmdline"
+               echo "=========================================="
+               echo "TEST PASSED: $name"
+               echo "=========================================="
+       fi
+       trap "" EXIT
+       return 0;
+}
 
 START=`date`
 (
  # give time for nbt server to register its names
  echo delaying for nbt name registration
  sleep 4
- bin/nmblookup -U localhost localhost 
-
- failed=0
- $SRCDIR/script/tests/test_ejs.sh localhost $USERNAME $PASSWORD || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_ldap.sh localhost $USERNAME $PASSWORD || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_quick.sh //localhost/cifs $USERNAME $PASSWORD "" || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_rpc.sh localhost $USERNAME $PASSWORD $DOMAIN || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_session_key.sh localhost $USERNAME $PASSWORD $DOMAIN || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_binding_string.sh localhost $USERNAME $PASSWORD $DOMAIN || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_echo.sh localhost $USERNAME $PASSWORD $DOMAIN || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_posix.sh //localhost/tmp $USERNAME $PASSWORD "" || failed=`expr $failed + $?`
- $SRCDIR/script/tests/test_local.sh || failed=`expr $failed + $?`
- exit $failed
+ # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init 
+ bin/nmblookup $CONFIGURATION $SERVER
+ bin/nmblookup $CONFIGURATION -U $SERVER $SERVER
+ bin/nmblookup $CONFIGURATION $SERVER
+ bin/nmblookup $CONFIGURATION -U $SERVER $NETBIOSNAME
+ bin/nmblookup $CONFIGURATION $NETBIOSNAME
+ bin/nmblookup $CONFIGURATION -U $SERVER $NETBIOSNAME
+
+# start off with 0 failures
+totalfailed=0
+export totalfailed
+
+. script/tests/tests_$TESTS.sh > $PREFIX/recipe
+total=`grep "TEST --" $PREFIX/recipe | wc -l`
+current=0
+cat $PREFIX/recipe | (
+       while read LINE
+       do
+               if [ "$LINE" = "-- TEST --" ]; then
+                       read NAME
+                       read CMDLINE
+                       current=`expr $current + 1`
+                       runtest "$NAME" "$CMDLINE" || totalfailed=`expr $totalfailed + $?`
+               else
+                       echo "$LINE"
+               fi
+       done
+       exit $totalfailed
+)
+exit $?
 ) 9>$SMBD_TEST_FIFO
-failed=$?
+totalfailed=$?
+
+smbd_PID=`cat $PIDDIR/smbd.pid`
+waitforpid $smbd_PID 20 || {
+    echo "smbd process $1 took more than 20 seconds to exit, killing"
+    kill -9 $smbd_PID
+}
+
+if [ "$TEST_LDAP"x = "yesx" ]; then
+    if test -z "$FEDORA_DS_PREFIX"; then
+       kill `cat $PIDDIR/slapd.pid`
+    else
+       $LDAPDIR/slapd-samba4/stop-slapd
+    fi
+fi
 
 END=`date`
-echo "START: $START ($0)";
-echo "END:   $END ($0)";
+echo "START: $START ($ARG0)";
+echo "END:   $END ($ARG0)";
+
+# if there were any valgrind failures, show them
+count=`find $PREFIX -name 'valgrind.log*' | wc -l`
+if [ "$count" != 0 ]; then
+    for f in $PREFIX/valgrind.log*; do
+       if [ -s $f ] && grep -v DWARF2.CFI.reader $f > /dev/null; then
+           echo "VALGRIND FAILURE";
+           totalfailed=`expr $totalfailed + 1`
+           cat $f
+       fi
+    done
+fi
 
-teststatus $0 $failed
+teststatus $ARG0 $totalfailed