r22326: Merge some more test improvements.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 18 Apr 2007 00:12:39 +0000 (00:12 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:51:03 +0000 (14:51 -0500)
(This used to be commit 3f85eab5908b8aa6761f23702f987d89f2977179)

source4/script/tests/Samba3.pm
source4/script/tests/selftest.pl

index 950f7e3479bcb30de17dae261147ce397d1afc15..e133a6394e5c9cb615f47244d258878472651e0e 100644 (file)
 package Samba3;
 
 use strict;
+use Cwd qw(abs_path);
 use FindBin qw($RealBin);
-use POSIX;
 
-sub new($$$) {
-       my ($classname, $bindir, $setupdir) = @_;
-       my $self = { bindir => $bindir, setupdir => $setupdir };
+sub binpath($$)
+{
+       my ($self, $binary) = @_;
+
+       if (defined($self->{bindir})) {
+               my $path = "$self->{bindir}/$binary";
+               -f $path or die("File $path doesn't exist");
+               return $path;
+       }
+
+       return $binary;
+}
+
+sub new($$) {
+       my ($classname, $bindir) = @_;
+       my $self = { bindir => $bindir };
        bless $self;
        return $self;
 }
 
-sub check_or_start($$$) 
+sub teardown_env($$)
 {
-       my ($self, $env_vars, $max_time) = @_;
-       return 0 if ( -p $env_vars->{SMBD_TEST_FIFO});
+       my ($self, $envvars) = @_;
 
-       unlink($env_vars->{SMBD_TEST_FIFO});
-       POSIX::mkfifo($env_vars->{SMBD_TEST_FIFO}, 0700);
-       unlink($env_vars->{SMBD_TEST_LOG});
+       $self->samba3_stop_sig_term($envvars->{PIDDIR});
+       $self->samba3_stop_sig_kill($envvars->{PIDDIR});
+
+       return 0;
+}
+
+sub setup_env($$$)
+{
+       my ($self, $envname, $path) = @_;
        
-       my $valgrind = "";
-       if (defined($ENV{SMBD_VALGRIND})) {
-               $valgrind = $ENV{SMBD_VALGRIND};
-       } 
+       if ($envname eq "dc") {
+               return $self->setup_dc("$path/dc");
+       } else {
+               die("Samba4 can't provide environment '$envname'");
+       }
+}
+
+sub setup_dc($$)
+{
+       my ($self, $path) = @_;
 
-       print "STARTING SMBD... ";
+       my $vars = $self->provision($path);
+
+       $self->check_or_start($vars, ($ENV{NMBD_MAXTIME} or 2700), ($ENV{SMBD_MAXTIME} or 2700));
+
+       $self->wait_for_start($vars);
+
+       return $vars;
+}
+
+sub stop($)
+{
+       my ($self) = @_;
+}
+
+sub samba3_stop_sig_term($$) {
+       my ($self, $piddir) = @_;
+       my $ret = 0;
+       kill("USR1", `cat $piddir/timelimit.nmbd.pid`) or \
+               kill("ALRM", `cat $piddir/timelimit.nmbd.pid`) or $ret++;
+
+       kill("USR1", `cat $piddir/timelimit.smbd.pid`) or \
+               kill("ALRM", `cat $piddir/timelimit.smbd.pid`) or $ret++;
+
+       return $ret;
+}
+
+sub samba3_stop_sig_kill($$) {
+       my ($self, $piddir) = @_;
+       kill("ALRM", `cat $piddir/timelimit.nmbd.pid`); 
+       kill("ALRM", `cat $piddir/timelimit.smbd.pid`);
+       return 0;
+}
+
+sub check_or_start($$$$) {
+       my ($self, $env_vars, $nmbd_maxtime, $smbd_maxtime) = @_;
+
+       unlink($env_vars->{NMBD_TEST_LOG});
+       print "STARTING NMBD...";
        my $pid = fork();
        if ($pid == 0) {
-               open STDIN, $env_vars->{SMBD_TEST_FIFO};
-               open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
+               open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
                open STDERR, '>&STDOUT';
-               my $optarg = "";
-               if (defined($max_time)) {
-                       $optarg = "--maximum-runtime=$max_time ";
-               }
-               my $ret = system("$valgrind $self->{bindir}/smbd $optarg -s $env_vars->{CONFFILE} -M single -i --leak-report-full");
-               if ($? == -1) {
-                       print "Unable to start smbd: $ret: $!\n";
-                       exit 1;
-               }
-               unlink($env_vars->{SMBD_TEST_FIFO});
-               my $exit = $? >> 8;
-               if ( $ret == 0 ) {
-                       print "smbd exits with status $exit\n";
-               } elsif ( $ret & 127 ) {
-                       print "smbd got signal ".($ret & 127)." and exits with $exit!\n";
-               } else {
-                       $ret = $? >> 8;
-                       print "smbd failed with status $exit!\n";
-               }
-               exit $exit;
+       
+               $ENV{MAKE_TEST_BINARY} = $self->binpath("nmbd");
+               exec($self->binpath("timelimit"), $nmbd_maxtime, $self->binpath("nmbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start nmbd: $!");
        }
+       open(PID, ">$env_vars->{PIDDIR}/timelimit.nmbd.pid");
+       print PID $pid;
+       close(PID);
        print "DONE\n";
 
-       open(DATA, ">$env_vars->{SMBD_TEST_FIFO}");
+       unlink($env_vars->{SMBD_TEST_LOG});
+       print "STARTING SMBD...";
+       my $pid = fork();
+       if ($pid == 0) {
+               open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
+               open STDERR, '>&STDOUT';
+       
+               $ENV{MAKE_TEST_BINARY} = $self->binpath("smbd");
+               exec($self->binpath("timelimit"), $nmbd_maxtime, $self->binpath("smbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start smbd: $!");
+       }
+       open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid");
+       print PID $pid;
+       close(PID);
+       print "DONE\n";
 
-       return $pid;
+       return 0;
 }
 
-sub wait_for_start($)
+sub create_clientconf($$$)
 {
-       # give time for nbt server to register its names
-       print "delaying for nbt name registration\n";
+       my ($self, $prefix, $domain) = @_;
+
+       my $lockdir = "$prefix/locks";
+       my $logdir = "$prefix/logs";
+       my $piddir = "$prefix/pid";
+       my $privatedir = "$prefix/private";
+       my $scriptdir = "$RealBin/..";
+       my $conffile = "$prefix/smb.conf";
+
+       my $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';
+       open(CONF, ">$conffile");
+       print CONF "
+[global]
+       workgroup = $domain
 
-       # This will return quickly when things are up, but be slow if we 
-       # need to wait for (eg) SSL init 
-       system("bin/nmblookup $ENV{CONFIGURATION} $ENV{SERVER}");
-       system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{SERVER}");
-       system("bin/nmblookup $ENV{CONFIGURATION} $ENV{SERVER}");
-       system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{NETBIOSNAME}");
-       system("bin/nmblookup $ENV{CONFIGURATION} $ENV{NETBIOSNAME}");
-       system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{NETBIOSNAME}");
-       system("bin/nmblookup $ENV{CONFIGURATION} $ENV{NETBIOSNAME}");
-       system("bin/nmblookup $ENV{CONFIGURATION} -U $ENV{SERVER} $ENV{NETBIOSNAME}");
+       private dir = $privatedir
+       pid directory = $piddir
+       lock directory = $lockdir
+       log file = $logdir/log.\%m
+       log level = 0
+
+       name resolve order = bcast
+
+       netbios name = TORTURE_6
+       interfaces = $torture_interfaces
+       panic action = $scriptdir/gdb_backtrace \%d %\$(MAKE_TEST_BINARY)
+
+       passdb backend = tdbsam
+       ";
+       close(CONF);
 }
 
-sub provision($$$)
+sub provision($$)
 {
-       my ($self, $environment, $prefix) = @_;
+       my ($self, $prefix) = @_;
+
+       ##
+       ## setup the various environment variables we need
+       ##
+
        my %ret = ();
-       print "PROVISIONING...";
-       open(IN, "$RealBin/mktestdc.sh $prefix|") or die("Unable to setup");
-       while (<IN>) {
-               die ("Error parsing `$_'") unless (/^([A-Z0-9a-z_]+)=(.*)$/);
-               $ret{$1} = $2;
-       }
-       close(IN);
+       my $server = "localhost2";
+       my $server_ip = "127.0.0.2";
+       my $username = `PATH=/usr/ucb:$ENV{PATH} whoami`;
+       my $password = "test";
 
-       $ret{SMBD_TEST_FIFO} = "$prefix/smbd_test.fifo";
-       $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
-       return \%ret;
-}
+       my $srcdir="$RealBin/../..";
+       my $scriptdir="$srcdir/script/tests";
+       my $prefix_abs = abs_path($prefix);
+       my $shrdir="$prefix_abs/tmp";
+       my $libdir="$prefix_abs/lib";
+       my $piddir="$prefix_abs/pid";
+       my $conffile="$libdir/server.conf";
+       my $privatedir="$prefix_abs/private";
+       my $lockdir="$prefix_abs/lockdir";
+       my $logdir="$prefix_abs/logs";
+       my $domain = "SAMBA-TEST";
 
-sub stop($)
-{
-       my ($self) = @_;
+       ## 
+       ## create the test directory layout
+       ##
+       mkdir($prefix_abs);
+       print "CREATE TEST ENVIRONMENT IN '$prefix'...";
+       system("rm -rf $prefix_abs/*");
+       mkdir($_) foreach($privatedir,$libdir,$piddir,$lockdir,$logdir);
+       my $tmpdir = "$prefix_abs/tmp";
+       mkdir($tmpdir);
+       chmod 0777, $tmpdir;
 
-       close(DATA);
+       open(CONF, ">$conffile") or die("Unable to open $conffile");
+       print CONF "
+[global]
+       workgroup = $domain
 
-       sleep(2);
+       private dir = $privatedir
+       pid directory = $piddir
+       lock directory = $lockdir
+       log file = $logdir/log.\%m
+       log level = 0
 
-       my $failed = $? >> 8;
+       name resolve order = bcast
 
-       if (-f "$ENV{PIDDIR}/smbd.pid" ) {
-               open(IN, "<$ENV{PIDDIR}/smbd.pid") or die("unable to open smbd pid file");
-               kill 9, <IN>;
-               close(IN);
-       }
+       netbios name = $server
+       interfaces = $server_ip/8
+       bind interfaces only = yes
+       panic action = $scriptdir/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
+
+       passdb backend = tdbsam
+
+       ; Necessary to add the build farm hacks
+       add user script = /bin/false
+       add machine script = /bin/false
+
+       kernel oplocks = no
+       kernel change notify = no
+
+       syslog = no
+       printing = bsd
+       printcap name = /dev/null
+
+[tmp]
+       path = $tmpdir
+       read only = no
+       smbd:sharedelay = 100000
+       map hidden = yes
+       map system = yes
+       create mask = 755
+[hideunread]
+       copy = tmp
+       hide unreadable = yes
+[hideunwrite]
+       copy = tmp
+       hide unwriteable files = yes
+[print1]
+       copy = tmp
+       printable = yes
+       printing = test
+[print2]
+       copy = print1
+[print3]
+       copy = print1
+[print4]
+       copy = print1
+       ";
+       close(CONF);
 
-       return $failed;
+       ##
+       ## create a test account
+       ##
+
+       open(PWD, "|".$self->binpath("smbpasswd")." -c $conffile -L -s -a $username");
+       print PWD "$password\n$password\n";
+       close(PWD) or die("Unable to set password for test account");
+
+       print "DONE\n";
+
+       $ret{SERVER_IP} = $server_ip;
+       $ret{NMBD_TEST_LOG} = "$prefix/nmbd_test.log";
+       $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
+       $ret{SERVERCONFFILE} = $conffile;
+       $ret{CONFIGURATION} ="-s $conffile";
+       $ret{SERVER} = $server;
+       $ret{USERNAME} = $username;
+       $ret{DOMAIN} = $domain;
+       $ret{NETBIOSNAME} = $server;
+       $ret{PASSWORD} = $password;
+       $ret{PIDDIR} = $piddir;
+       return \%ret;
 }
 
-sub setup_env($$)
+sub wait_for_start($$)
 {
-       my ($self, $name) = @_;
+       my ($self, $envvars) = @_;
+
+       # give time for nbt server to register its names
+       print "delaying for nbt name registration\n";
+       sleep(10);
+       # This will return quickly when things are up, but be slow if we need to wait for (eg) SSL init 
+       system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__");
+       system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} __SAMBA__");
+       system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__");
+       system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}");
+       system($self->binpath("nmblookup") ." $envvars->{CONFIGURATION} $envvars->{SERVER}");
+       # make sure smbd is also up set
+       print "wait for smbd\n";
+       system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
+       system($self->binpath("smbclient") ." $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2");
 }
 
 1;
index f834918b8eb1fa872cd859a3a54e394bc0896f1f..52875ed1ee23df32c0c0ae63753b7ce9575d9bf4 100755 (executable)
@@ -124,6 +124,7 @@ my $opt_target = "samba4";
 my $opt_quick = 0;
 my $opt_socket_wrapper = 0;
 my $opt_socket_wrapper_pcap = undef;
+my $opt_socket_wrapper_keep_pcap = undef;
 my $opt_one = 0;
 my $opt_immediate = 0;
 my $opt_expected_failures = undef;
@@ -133,6 +134,7 @@ my $opt_testenv = 0;
 my $ldap = undef;
 my $opt_analyse_cmd = undef;
 my $opt_resetup_env = undef;
+my $opt_bindir = undef;
 
 my $srcdir = ".";
 my $builddir = ".";
@@ -227,6 +229,8 @@ sub run_test_buildfarm($$$$)
                print "TEST FAILED: $name (status $ret)\n";
        }
        print "==========================================\n";
+
+       return ($ret == $expected_ret);
 }
 
 my $test_output = {};
@@ -286,6 +290,8 @@ sub run_test_plain($$$$)
        } else {
                $statistics->{SUITES_OK}++;
        }
+
+       return ($ret == $expected_ret);
 }
 
 sub ShowHelp()
@@ -297,6 +303,7 @@ Usage: $Script [OPTIONS] PREFIX
 
 Generic options:
  --help                     this help page
+ --target=samba4|samba3|win Samba version to target
 
 Paths:
  --prefix=DIR               prefix to run tests in [st]
@@ -304,12 +311,18 @@ Paths:
  --builddir=DIR             output directory [.]
 
 Target Specific:
- --target=samba4|samba3|win Samba version to target
- --socket-wrapper-pcap=FILE save traffic to pcap file
+ --socket-wrapper-pcap=DIR     save traffic to pcap directories
+ --socket-wrapper-keep-pcap keep all pcap files, not just those for tests that 
+                            failed
  --socket-wrapper           enable socket wrapper
  --expected-failures=FILE   specify list of tests that is guaranteed to fail
+
+Samba4 Specific:
  --ldap=openldap|fedora     back smbd onto specified ldap server
 
+Samba3 Specific:
+ --bindir=PATH              path to binaries
+
 Behaviour:
  --quick                    run quick overall test
  --one                      abort when the first test fails
@@ -325,7 +338,8 @@ my $result = GetOptions (
                'target=s' => \$opt_target,
                'prefix=s' => \$prefix,
                'socket-wrapper' => \$opt_socket_wrapper,
-               'socket-wrapper-pcap=s' => \$opt_socket_wrapper_pcap,
+               'socket-wrapper-pcap' => \$opt_socket_wrapper_pcap,
+               'socket-wrapper-keep-pcap' => \$opt_socket_wrapper_keep_pcap,
                'quick' => \$opt_quick,
                'one' => \$opt_one,
                'immediate' => \$opt_immediate,
@@ -338,6 +352,7 @@ my $result = GetOptions (
                'ldap:s' => \$ldap,
                'analyse-cmd=s' => \$opt_analyse_cmd,
                'resetup-environment' => \$opt_resetup_env,
+               'bindir:s' => \$opt_bindir,
            );
 
 exit(1) if (not $result);
@@ -401,8 +416,10 @@ if (defined($ENV{LD_LIBRARY_PATH})) {
 $ENV{PKG_CONFIG_PATH} = "$old_pwd/bin/pkgconfig:$ENV{PKG_CONFIG_PATH}";
 $ENV{PATH} = "$old_pwd/bin:$ENV{PATH}";
 
+my $pcap_dir = "$prefix/pcap";
+
 if ($opt_socket_wrapper_pcap) {
-       SocketWrapper::setup_pcap($opt_socket_wrapper_pcap);
+       mkdir($pcap_dir);
        # Socket wrapper pcap implies socket wrapper
        $opt_socket_wrapper = 1;
 }
@@ -420,7 +437,11 @@ my $target;
 if ($opt_target eq "samba4") {
        $target = new Samba4("$srcdir/bin", $ldap, "$srcdir/setup");
 } elsif ($opt_target eq "samba3") {
-       $target = new Samba3("$srcdir/bin", "$srcdir/setup");
+       if ($opt_socket_wrapper and `smbd -b | grep SOCKET_WRAPPER` eq "") {
+               die("You must include --enable-socket-wrapper when compiling Samba in order to execute 'make test'.  Exiting....");
+       }
+
+       $target = new Samba3($opt_bindir);
 } elsif ($opt_target eq "win") {
        die("Windows tests will not run with socket wrapper enabled.") 
                if ($opt_socket_wrapper);
@@ -619,10 +640,19 @@ NETBIOSNAME=\$NETBIOSNAME\" && bash'");
 
                setup_env($envname);
 
+               my $pcap_file = "$pcap_dir/$name.cap";
+
+               SocketWrapper::setup_pcap($pcap_file) if ($opt_socket_wrapper_pcap);
+               my $result;
                if ($from_build_farm) {
-                       run_test_buildfarm($name, $cmd, $i, $suitestotal);
+                       $result = run_test_buildfarm($name, $cmd, $i, $suitestotal);
                } else {
-                       run_test_plain($name, $cmd, $i, $suitestotal);
+                       $result = run_test_plain($name, $cmd, $i, $suitestotal);
+               }
+
+               if ($opt_socket_wrapper_pcap and $result and 
+                       not $opt_socket_wrapper_keep_pcap) {
+                       unlink($pcap_file);
                }
 
                if (defined($opt_analyse_cmd)) {