At file:///home/jelmer/bzr.samba/SAMBA_4_0/ ------------------------------------------------------------ revno: 11894 revision-id: [EMAIL PROTECTED] parent: svn-v2:[EMAIL PROTECTED] committer: Jelmer Vernooij <[EMAIL PROTECTED]> branch nick: SAMBA_4_0 timestamp: Tue 2007-04-17 14:11:00 +0200 message: Support building Samba 3 test environments. modified: source/script/tests/Samba3.pm svn-v2:[EMAIL PROTECTED] source/script/tests/selftest.pl svn-v2:[EMAIL PROTECTED] === modified file 'source/script/tests/Samba3.pm' --- a/source/script/tests/Samba3.pm 2007-04-11 03:45:39 +0000 +++ b/source/script/tests/Samba3.pm 2007-04-17 12:11:00 +0000 @@ -6,120 +6,288 @@ 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})) { + return "$self->{bindir}/$binary"; + } + + return $binary; +} + +sub new($$) { + my ($classname, $bindir) = @_; + my $self = { bindir => $bindir }; bless $self; return $self; } -sub check_or_start($$$) -{ - my ($self, $env_vars, $max_time) = @_; - return 0 if ( -p $env_vars->{SMBD_TEST_FIFO}); - - unlink($env_vars->{SMBD_TEST_FIFO}); - POSIX::mkfifo($env_vars->{SMBD_TEST_FIFO}, 0700); +sub teardown_env($$) +{ + my ($self, $envvars) = @_; + + $self->samba3_stop_sig_term($envvars->{PIDDIR}); + $self->samba3_stop_sig_kill($envvars->{PIDDIR}); + + return 0; +} + +sub setup_env($$$) +{ + my ($self, $envname, $path) = @_; + + if ($envname eq "dc") { + return $self->setup_dc("$path/dc"); + } else { + die("Samba4 can't provide environment '$envname'"); + } +} + +sub setup_dc($$) +{ + my ($self, $path) = @_; + + 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 STDOUT, ">$env_vars->{NMBD_TEST_LOG}"; + open STDERR, '>&STDOUT'; + + $ENV{MAKE_TEST_BINARY} = $self->binpath("nmbd"); + exec("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"; + unlink($env_vars->{SMBD_TEST_LOG}); - - my $valgrind = ""; - if (defined($ENV{SMBD_VALGRIND})) { - $valgrind = $ENV{SMBD_VALGRIND}; - } - - print "STARTING SMBD... "; + print "STARTING SMBD..."; my $pid = fork(); if ($pid == 0) { - open STDIN, $env_vars->{SMBD_TEST_FIFO}; open STDOUT, ">$env_vars->{SMBD_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("smbd"); + exec("timelimit", $nmbd_maxtime, $self->binpath("smbd"), "-F", "-S", "--no-process-group", "-d0" ,"-s", $env_vars->{SERVERCONFFILE}) or die("Unable to start nmbd"); } + open(PID, ">$env_vars->{PIDDIR}/timelimit.smbd.pid"); + print PID $pid; + close(PID); print "DONE\n"; - open(DATA, ">$env_vars->{SMBD_TEST_FIFO}"); - - return $pid; -} - -sub wait_for_start($) -{ - # give time for nbt server to register its names - print "delaying for nbt name registration\n"; - - # 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}"); -} - -sub provision($$$) -{ - my ($self, $environment, $prefix) = @_; + return 0; +} + +sub create_clientconf($$$) +{ + 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 + + 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($$) +{ + 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); - - $ret{SMBD_TEST_FIFO} = "$prefix/smbd_test.fifo"; + my $server = "localhost2"; + my $server_ip = "127.0.0.2"; + my $username = `PATH=/usr/ucb:$ENV{PATH} whoami`; + my $password = "test"; + + 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/client.conf"; + my $serverconffile="$libdir/server.conf"; + my $privatedir="$prefix_abs/private"; + my $lockdir="$prefix_abs/lockdir"; + my $logdir="$prefix_abs/logs"; + my $domain = "SAMBA-TEST"; + + ## + ## create the test directory layout + ## + print "CREATE TEST ENVIRONMENT IN '$prefix'..."; + system("/bin/rm -rf $prefix/*"); + mkdir($_) foreach($privatedir,$libdir,$piddir,$lockdir,$logdir); + my $tmpdir = "$prefix_abs/tmp"; + mkdir($tmpdir); + chmod 0777, $tmpdir; + + open(CONF, ">$serverconffile"); + print CONF " +[global] + workgroup = $domain + + private dir = $privatedir + pid directory = $piddir + lock directory = $lockdir + log file = $logdir/log.\%m + log level = 0 + + name resolve order = bcast + + 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); + + ## + ## 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{NMBD_TEST_LOG} = "$prefix/nmbd_test.log"; $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log"; + $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 stop($) -{ - my ($self) = @_; - - close(DATA); - - sleep(2); - - my $failed = $? >> 8; - - 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); - } - - return $failed; -} - -sub setup_env($$) -{ - my ($self, $name) = @_; +sub wait_for_start($$) +{ + 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("bin/nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} __SAMBA__"); + system("bin/nmblookup $envvars->{CONFIGURATION} __SAMBA__"); + system("bin/nmblookup $envvars->{CONFIGURATION} -U 127.255.255.255 __SAMBA__"); + system("bin/nmblookup $envvars->{CONFIGURATION} -U $envvars->{SERVER_IP} $envvars->{SERVER}"); + system("bin/nmblookup $envvars->{CONFIGURATION} $envvars->{SERVER}"); + # make sure smbd is also up set + print "wait for smbd\n"; + system("bin/smbclient $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2"); + system("bin/smbclient $envvars->{CONFIGURATION} -L $envvars->{SERVER_IP} -U% -p 139 | head -2"); } 1;
=== modified file 'source/script/tests/selftest.pl' --- a/source/script/tests/selftest.pl 2007-04-17 00:30:01 +0000 +++ b/source/script/tests/selftest.pl 2007-04-17 12:11:00 +0000 @@ -133,6 +133,7 @@ my $ldap = undef; my $opt_analyse_cmd = undef; my $opt_resetup_env = undef; +my $opt_bindir = undef; my $srcdir = "."; my $builddir = "."; @@ -297,6 +298,7 @@ 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 +306,16 @@ --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 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 @@ -338,6 +344,7 @@ 'ldap:s' => \$ldap, 'analyse-cmd=s' => \$opt_analyse_cmd, 'resetup-environment' => \$opt_resetup_env, + 'bindir:s' => \$opt_bindir, ); exit(1) if (not $result); @@ -410,7 +417,11 @@ 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);