X-Git-Url: http://git.samba.org/?p=samba.git;a=blobdiff_plain;f=selftest%2Fselftest.pl;h=ff5f27d08555c5177721ab504e63daa615b1efd6;hp=fe786f841b84ec661f79afdf929dfca41ce1e54e;hb=7cf3318fa99aa52c9baf669c6cf5ab440ff2b801;hpb=9000188fb4226b4c70ae6b50292a0fe2a55e653c diff --git a/selftest/selftest.pl b/selftest/selftest.pl index fe786f841b8..ff5f27d0855 100755 --- a/selftest/selftest.pl +++ b/selftest/selftest.pl @@ -16,111 +16,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -=pod - -=head1 NAME - -selftest - Samba test runner - -=head1 SYNOPSIS - -selftest --help - -selftest [--srcdir=DIR] [--bindir=DIR] [--exeext=EXT][--target=samba4|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--testlist=FILE] [TESTS] - -=head1 DESCRIPTION - -A simple test runner. TESTS is a regular expression with tests to run. - -=head1 OPTIONS - -=over 4 - -=item I<--help> - -Show list of available options. - -=item I<--srcdir=DIR> - -Source directory. - -=item I<--bindir=DIR> - -Built binaries directory. - -=item I<--exeext=EXT> - -Executable extention - -=item I<--prefix=DIR> - -Change directory to run tests in. Default is 'st'. - -=item I<--target samba4|samba3|win|kvm> - -Specify test target against which to run. Default is 'samba4'. - -=item I<--quick> - -Run only a limited number of tests. Intended to run in about 30 seconds on -moderately recent systems. - -=item I<--socket-wrapper> - -Use socket wrapper library for communication with server. Only works -when the server is running locally. - -Will prevent TCP and UDP ports being opened on the local host but -(transparently) redirects these calls to use unix domain sockets. - -=item I<--exclude> - -Specify a file containing a list of tests that should be skipped. Possible -candidates are tests that segfault the server, flip or don't end. - -=item I<--include> - -Specify a file containing a list of tests that should be run. Same format -as the --exclude flag. - -Not includes specified means all tests will be run. - -=item I<--one> - -Abort as soon as one test fails. - -=item I<--testlist> - -Load a list of tests from the specified location. - -=back - -=head1 ENVIRONMENT - -=over 4 - -=item I - -=item I - -=item I - -=item I - -=item I - -=back - -=head1 LICENSE - -selftest is licensed under the GNU General Public License L. - -=head1 AUTHOR - -Jelmer Vernooij - -=cut - use strict; use FindBin qw($RealBin $Script); @@ -132,6 +27,7 @@ use Cwd qw(abs_path); use lib "$RealBin"; use Subunit; use SocketWrapper; +use target::Samba; eval { require Time::HiRes; @@ -142,40 +38,34 @@ if ($@) { } my $opt_help = 0; -my $opt_target = "samba4"; +my $opt_target = "samba"; my $opt_quick = 0; my $opt_socket_wrapper = 0; my $opt_socket_wrapper_pcap = undef; my $opt_socket_wrapper_keep_pcap = undef; +my $opt_random_order = 0; my $opt_one = 0; my @opt_exclude = (); my @opt_include = (); -my $opt_verbose = 0; -my $opt_image = undef; my $opt_testenv = 0; my $opt_list = 0; my $ldap = undef; my $opt_resetup_env = undef; -my $opt_binary_mapping = ""; my $opt_load_list = undef; +my $opt_libnss_wrapper_so_path = ""; +my $opt_libresolv_wrapper_so_path = ""; +my $opt_libsocket_wrapper_so_path = ""; +my $opt_libuid_wrapper_so_path = ""; +my $opt_use_dns_faking = 0; my @testlists = (); my $srcdir = "."; my $bindir = "./bin"; -my $exeext = ""; my $prefix = "./st"; my @includes = (); my @excludes = (); -sub pipe_handler { - my $sig = shift @_; - print STDERR "Exiting early because of SIGPIPE.\n"; - exit(1); -} - -$SIG{PIPE} = \&pipe_handler; - sub find_in_list($$) { my ($list, $fullname) = @_; @@ -300,17 +190,28 @@ Usage: $Script [OPTIONS] TESTNAME-REGEX Generic options: --help this help page - --target=samba[34]|win|kvm Samba version to target - --testlist=FILE file to read available tests from + --target=samba[3]|win Samba version to target + --testlist=FILE file to read available tests from + --exclude=FILE Exclude tests listed in the file + --include=FILE Include tests listed in the file Paths: --prefix=DIR prefix to run tests in [st] --srcdir=DIR source directory [.] --bindir=DIR binaries directory [./bin] - --exeext=EXT executable extention [] + +Preload cwrap: + --nss_wrapper_so_path=FILE the nss_wrapper library to preload + --resolv_wrapper_so_path=FILE the resolv_wrapper library to preload + --socket_wrapper_so_path=FILE the socket_wrapper library to preload + --uid_wrapper_so_path=FILE the uid_wrapper library to preload + +DNS: + --use-dns-faking Fake DNS entries rather than talking to our + DNS implementation. Target Specific: - --socket-wrapper-pcap save traffic to pcap directories + --socket-wrapper-pcap 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 @@ -318,13 +219,9 @@ Target Specific: Samba4 Specific: --ldap=openldap|fedora-ds back samba onto specified ldap server -Kvm Specific: - --image=PATH path to KVM image - Behaviour: --quick run quick overall test --one abort when the first test fails - --verbose be verbose --testenv run a shell in the requested test environment --list list available tests "; @@ -344,16 +241,18 @@ my $result = GetOptions ( 'include=s' => \@opt_include, 'srcdir=s' => \$srcdir, 'bindir=s' => \$bindir, - 'exeext=s' => \$exeext, - 'verbose' => \$opt_verbose, 'testenv' => \$opt_testenv, 'list' => \$opt_list, 'ldap:s' => \$ldap, 'resetup-environment' => \$opt_resetup_env, - 'image=s' => \$opt_image, 'testlist=s' => \@testlists, + 'random-order' => \$opt_random_order, 'load-list=s' => \$opt_load_list, - 'binary-mapping=s' => \$opt_binary_mapping + 'nss_wrapper_so_path=s' => \$opt_libnss_wrapper_so_path, + 'resolv_wrapper_so_path=s' => \$opt_libresolv_wrapper_so_path, + 'socket_wrapper_so_path=s' => \$opt_libsocket_wrapper_so_path, + 'uid_wrapper_so_path=s' => \$opt_libuid_wrapper_so_path, + 'use-dns-faking' => \$opt_use_dns_faking ); exit(1) if (not $result); @@ -370,7 +269,7 @@ my @tests = @ARGV; # quick hack to disable rpc validation when using valgrind - its way too slow unless (defined($ENV{VALGRIND})) { $ENV{VALIDATE} = "validate"; - $ENV{MALLOC_CHECK_} = 2; + $ENV{MALLOC_CHECK_} = 3; } # make all our python scripts unbuffered @@ -399,8 +298,14 @@ $prefix =~ s+/$++; die("using an empty prefix isn't allowed") unless $prefix ne ""; -#Ensure we have the test prefix around -mkdir($prefix, 0777) unless -d $prefix; +# Ensure we have the test prefix around. +# +# We need restrictive +# permissions on this as some subdirectories in this tree will have +# wider permissions (ie 0777) and this would allow other users on the +# host to subvert the test process. +mkdir($prefix, 0700) unless -d $prefix; +chmod 0700, $prefix; my $prefix_abs = abs_path($prefix); my $tmpdir_abs = abs_path("$prefix/tmp"); @@ -417,7 +322,6 @@ $ENV{PREFIX_ABS} = $prefix_abs; $ENV{SRCDIR} = $srcdir; $ENV{SRCDIR_ABS} = $srcdir_abs; $ENV{BINDIR} = $bindir_abs; -$ENV{EXEEXT} = $exeext; my $tls_enabled = not $opt_quick; $ENV{TLS_ENABLED} = ($tls_enabled?"yes":"no"); @@ -444,95 +348,97 @@ if ($opt_socket_wrapper_pcap) { $opt_socket_wrapper = 1; } -my $socket_wrapper_dir; -if ($opt_socket_wrapper) { - $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix_abs/w", $opt_socket_wrapper_pcap); - print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n"; -} else { - unless ($< == 0) { - print "WARNING: Not using socket wrapper, but also not running as root. Will not be able to listen on proper ports\n"; - } +my $ld_preload = $ENV{LD_PRELOAD}; + +if ($opt_libnss_wrapper_so_path) { + if ($ld_preload) { + $ld_preload = "$ld_preload:$opt_libnss_wrapper_so_path"; + } else { + $ld_preload = "$opt_libnss_wrapper_so_path"; + } } -my $target; -my $testenv_default = "none"; +if ($opt_libresolv_wrapper_so_path) { + if ($ld_preload) { + $ld_preload = "$ld_preload:$opt_libresolv_wrapper_so_path"; + } else { + $ld_preload = "$opt_libresolv_wrapper_so_path"; + } +} -my %binary_mapping = {}; -if ($opt_binary_mapping) { - my @binmapping_list = split(/,/, $opt_binary_mapping); - foreach my $mapping (@binmapping_list) { - my ($bin, $map) = split(/\:/, $mapping); - $binary_mapping{$bin} = $map; - } +if ($opt_libsocket_wrapper_so_path) { + if ($ld_preload) { + $ld_preload = "$ld_preload:$opt_libsocket_wrapper_so_path"; + } else { + $ld_preload = "$opt_libsocket_wrapper_so_path"; + } } -$ENV{BINARY_MAPPING} = $opt_binary_mapping; +if ($opt_libuid_wrapper_so_path) { + if ($ld_preload) { + $ld_preload = "$ld_preload:$opt_libuid_wrapper_so_path"; + } else { + $ld_preload = "$opt_libuid_wrapper_so_path"; + } +} -sub bindir_path($$) { - my ($self, $path) = @_; +$ENV{LD_PRELOAD} = $ld_preload; +print "LD_PRELOAD=$ENV{LD_PRELOAD}\n"; - if (defined($self->{binary_mapping}->{$path})) { - $path = $self->{binary_mapping}->{$path}; - } +# Enable uid_wrapper globally +$ENV{UID_WRAPPER} = 1; - my $valpath = "$self->{bindir}/$path$self->{exeext}"; +# Disable RTLD_DEEPBIND hack for Samba bind dlz module +# +# This is needed in order to allow the ldb_*ldap module +# to work with a preloaded socket wrapper. +$ENV{LDB_MODULES_DISABLE_DEEPBIND} = 1; - return $valpath if (-f $valpath); - return $path; +my $socket_wrapper_dir; +if ($opt_socket_wrapper) { + $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix_abs/w", $opt_socket_wrapper_pcap); + print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n"; +} elsif (not $opt_list) { + unless ($< == 0) { + warn("not using socket wrapper, but also not running as root. Will not be able to listen on proper ports"); + } } -if ($opt_target eq "samba") { - $testenv_default = "all"; - require target::Samba; - $target = new Samba($bindir, \%binary_mapping, \&bindir_path, $ldap, $srcdir, $exeext); -} elsif ($opt_target eq "samba4") { - $testenv_default = "all"; - require target::Samba4; - $target = new Samba4($bindir, \%binary_mapping, \&bindir_path, $ldap, $srcdir, $exeext); -} elsif ($opt_target eq "samba3") { - if ($opt_socket_wrapper and `$bindir/smbd -b | grep SOCKET_WRAPPER` eq "") { - die("You must include --enable-socket-wrapper when compiling Samba in order to execute 'make test'. Exiting...."); - } - $testenv_default = "member"; - require target::Samba3; - $target = new Samba3($bindir, \%binary_mapping, \&bindir_path, $srcdir_abs, $exeext); -} elsif ($opt_target eq "win") { - die("Windows tests will not run with socket wrapper enabled.") - if ($opt_socket_wrapper); - $testenv_default = "dc"; - require target::Windows; - $target = new Windows(); -} elsif ($opt_target eq "kvm") { - die("Kvm tests will not run with socket wrapper enabled.") - if ($opt_socket_wrapper); - require target::Kvm; - die("No image specified") unless ($opt_image); - $target = new Kvm($opt_image, undef); +if ($opt_use_dns_faking) { + print "DNS: Faking nameserver\n"; + $ENV{SAMBA_DNS_FAKING} = 1; } -# -# Start a Virtual Distributed Ethernet Switch -# Returns the pid of the switch. -# -sub start_vde_switch($) -{ - my ($path) = @_; +my $target; +my $testenv_default = "none"; - system("vde_switch --pidfile $path/vde.pid --sock $path/vde.sock --daemon"); +# After this many seconds, the server will self-terminate. All tests +# must terminate in this time, and testenv will only stay alive this +# long - open(PID, "$path/vde.pid"); - =~ /([0-9]+)/; - my $pid = $1; - close(PID); +my $server_maxtime; +if ($opt_testenv) { + # 1 year should be enough :-) + $server_maxtime = 365 * 24 * 60 * 60; +} else { + # make test should run under 4 hours + $server_maxtime = 4 * 60 * 60; +} - return $pid; +if (defined($ENV{SMBD_MAXTIME}) and $ENV{SMBD_MAXTIME} ne "") { + $server_maxtime = $ENV{SMBD_MAXTIME}; } -# Stop a Virtual Distributed Ethernet Switch -sub stop_vde_switch($) -{ - my ($pid) = @_; - kill 9, $pid; +unless ($opt_list) { + if ($opt_target eq "samba") { + $testenv_default = "ad_dc_ntvfs"; + require target::Samba; + $target = new Samba($bindir, $ldap, $srcdir, $server_maxtime); + } elsif ($opt_target eq "samba3") { + $testenv_default = "nt4_member"; + require target::Samba3; + $target = new Samba3($bindir, $srcdir_abs, $server_maxtime); + } } sub read_test_regexes($) @@ -592,19 +498,71 @@ sub write_clientconf($$$) mkdir("$clientdir/lockdir", 0777); } + if ( -d "$clientdir/statedir" ) { + unlink <$clientdir/statedir/*>; + } else { + mkdir("$clientdir/statedir", 0777); + } + + if ( -d "$clientdir/cachedir" ) { + unlink <$clientdir/cachedir/*>; + } else { + mkdir("$clientdir/cachedir", 0777); + } + + # this is ugly, but the ncalrpcdir needs exactly 0755 + # otherwise tests fail. + my $mask = umask; + umask 0022; + if ( -d "$clientdir/ncalrpcdir/np" ) { + unlink <$clientdir/ncalrpcdir/np/*>; + rmdir "$clientdir/ncalrpcdir/np"; + } if ( -d "$clientdir/ncalrpcdir" ) { unlink <$clientdir/ncalrpcdir/*>; + rmdir "$clientdir/ncalrpcdir"; + } + mkdir("$clientdir/ncalrpcdir", 0755); + umask $mask; + + my $cadir = "$ENV{SRCDIR_ABS}/selftest/manage-ca/CA-samba.example.com"; + my $cacert = "$cadir/Public/CA-samba.example.com-cert.pem"; + my $cacrl_pem = "$cadir/Public/CA-samba.example.com-crl.pem"; + my $ca_users_dir = "$cadir/Users"; + + if ( -d "$clientdir/pkinit" ) { + unlink <$clientdir/pkinit/*>; } else { - mkdir("$clientdir/ncalrpcdir", 0777); + mkdir("$clientdir/pkinit", 0700); } + # each user has a USER-${USER_PRINCIPAL_NAME}-cert.pem and + # USER-${USER_PRINCIPAL_NAME}-private-key.pem symlink + # We make a copy here and make the certificated easily + # accessable in the client environment. + my $mask = umask; + umask 0077; + opendir USERS, "${ca_users_dir}" or die "Could not open dir '${ca_users_dir}': $!"; + for my $d (readdir USERS) { + my $user_dir = "${ca_users_dir}/${d}"; + next if ${d} =~ /^\./; + next if (! -d "${user_dir}"); + opendir USER, "${user_dir}" or die "Could not open dir '${user_dir}': $!"; + for my $l (readdir USER) { + my $user_link = "${user_dir}/${l}"; + next if ${l} =~ /^\./; + next if (! -l "${user_link}"); + + my $dest = "${clientdir}/pkinit/${l}"; + Samba::copy_file_content(${user_link}, ${dest}); + } + closedir USER; + } + closedir USERS; + umask $mask; + open(CF, ">$conffile"); print CF "[global]\n"; - if (defined($ENV{VALGRIND})) { - print CF "\ticonv:native = true\n"; - } else { - print CF "\ticonv:native = false\n"; - } print CF "\tnetbios name = client\n"; if (defined($vars->{DOMAIN})) { print CF "\tworkgroup = $vars->{DOMAIN}\n"; @@ -618,9 +576,10 @@ sub write_clientconf($$$) print CF " private dir = $clientdir/private lock dir = $clientdir/lockdir + state directory = $clientdir/statedir + cache directory = $clientdir/cachedir ncalrpc dir = $clientdir/ncalrpcdir - name resolve order = file bcast - panic action = $RealBin/gdb_backtrace \%PID\% \%PROG\% + panic action = $RealBin/gdb_backtrace \%d max xmit = 32K notify:inotify = false ldb:nosync = true @@ -630,9 +589,12 @@ sub write_clientconf($$$) torture:basedir = $clientdir #We don't want to pass our self-tests if the PAC code is wrong gensec:require_pac = true - resolv:host file = $prefix_abs/dns_host_file #We don't want to run 'speed' tests for very long torture:timelimit = 1 + winbind separator = / + tls cafile = ${cacert} + tls crlfile = ${cacrl_pem} + tls verify peer = no_check "; close(CF); } @@ -661,23 +623,27 @@ sub read_testlist($) open(IN, $filename) or die("Unable to open $filename: $!"); while () { - if (/-- TEST(-LOADLIST|-IDLIST|) --\n/) { + if (/-- TEST(-LOADLIST|) --\n/) { my $supports_loadlist = (defined($1) and $1 eq "-LOADLIST"); - my $supports_idlist = (defined($1) and $1 eq "-IDLIST"); my $name = ; $name =~ s/\n//g; my $env = ; $env =~ s/\n//g; + my $loadlist; + if ($supports_loadlist) { + $loadlist = ; + $loadlist =~ s/\n//g; + } my $cmdline = ; $cmdline =~ s/\n//g; if (should_run_test($name) == 1) { - push (@ret, [$name, $env, $cmdline, $supports_loadlist, $supports_idlist]); + push (@ret, [$name, $env, $cmdline, $loadlist]); } } else { print; } } - close(IN) or die("Error creating recipe"); + close(IN) or die("Error creating recipe from $filename"); return @ret; } @@ -693,17 +659,11 @@ if ($opt_socket_wrapper) { } else { $ENV{SELFTEST_INTERFACES} = ""; } -if ($opt_verbose) { - $ENV{SELFTEST_VERBOSE} = "1"; -} else { - $ENV{SELFTEST_VERBOSE} = ""; -} if ($opt_quick) { $ENV{SELFTEST_QUICK} = "1"; } else { $ENV{SELFTEST_QUICK} = ""; } -$ENV{SELFTEST_TARGET} = $opt_target; $ENV{SELFTEST_MAXTIME} = $torture_maxtime; my @available = (); @@ -750,13 +710,17 @@ foreach my $testsuite (@available) { } if ($match) { if (defined($skipreason)) { + if (not $opt_list) { Subunit::skip_testsuite($name, $skipreason); + } } else { push(@todo, $testsuite); } } } elsif (defined($skipreason)) { - Subunit::skip_testsuite($name, $skipreason); + if (not $opt_list) { + Subunit::skip_testsuite($name, $skipreason); + } } else { push(@todo, $testsuite); } @@ -775,8 +739,10 @@ if (defined($restricted)) { my $suitestotal = $#todo + 1; -Subunit::progress($suitestotal); -Subunit::report_time(time()); +unless ($opt_list) { + Subunit::progress($suitestotal); + Subunit::report_time(time()); +} my $i = 0; $| = 1; @@ -799,33 +765,54 @@ my @exported_envvars = ( "DOMAIN", "REALM", + # stuff related to a trusted domain + "TRUST_SERVER", + "TRUST_SERVER_IP", + "TRUST_SERVER_IPV6", + "TRUST_NETBIOSNAME", + "TRUST_USERNAME", + "TRUST_PASSWORD", + "TRUST_DOMAIN", + "TRUST_REALM", + # domain controller stuff "DC_SERVER", "DC_SERVER_IP", + "DC_SERVER_IPV6", "DC_NETBIOSNAME", "DC_NETBIOSALIAS", # domain member "MEMBER_SERVER", "MEMBER_SERVER_IP", + "MEMBER_SERVER_IPV6", "MEMBER_NETBIOSNAME", "MEMBER_NETBIOSALIAS", # rpc proxy controller stuff "RPC_PROXY_SERVER", "RPC_PROXY_SERVER_IP", + "RPC_PROXY_SERVER_IPV6", "RPC_PROXY_NETBIOSNAME", "RPC_PROXY_NETBIOSALIAS", # domain controller stuff for Vampired DC "VAMPIRE_DC_SERVER", "VAMPIRE_DC_SERVER_IP", + "VAMPIRE_DC_SERVER_IPV6", "VAMPIRE_DC_NETBIOSNAME", "VAMPIRE_DC_NETBIOSALIAS", + "PROMOTED_DC_SERVER", + "PROMOTED_DC_SERVER_IP", + "PROMOTED_DC_SERVER_IPV6", + "PROMOTED_DC_NETBIOSNAME", + "PROMOTED_DC_NETBIOSALIAS", + # server stuff "SERVER", "SERVER_IP", + "SERVER_IPV6", "NETBIOSNAME", "NETBIOSALIAS", @@ -836,20 +823,47 @@ my @exported_envvars = ( "DC_USERNAME", "DC_PASSWORD", + # UID/GID for rfc2307 mapping tests + "UID_RFC2307TEST", + "GID_RFC2307TEST", + # misc stuff "KRB5_CONFIG", - "WINBINDD_SOCKET_DIR", + "SELFTEST_WINBINDD_SOCKET_DIR", "WINBINDD_PRIV_PIPE_DIR", "NMBD_SOCKET_DIR", - "LOCAL_PATH" + "LOCAL_PATH", + + # nss_wrapper + "NSS_WRAPPER_PASSWD", + "NSS_WRAPPER_GROUP", + "NSS_WRAPPER_HOSTS", + "NSS_WRAPPER_MODULE_SO_PATH", + "NSS_WRAPPER_MODULE_FN_PREFIX", + + # resolv_wrapper + "RESOLV_WRAPPER_CONF", + "RESOLV_WRAPPER_HOSTS", ); -$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { +sub sighandler($) +{ my $signame = shift; + + $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'DEFAULT'; + $SIG{PIPE} = 'IGNORE'; + + open(STDOUT, ">&STDERR") or die "can't dup STDOUT to STDERR: $!"; + + print "$0: PID[$$]: Got SIG${signame} teardown environments.\n"; teardown_env($_) foreach(keys %running_envs); - die("Received signal $signame"); + system("pstree -p $$"); + print "$0: PID[$$]: Exiting...\n"; + exit(1); }; +$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = $SIG{PIPE} = \&sighandler; + sub setup_env($$) { my ($name, $prefix) = @_; @@ -865,9 +879,7 @@ sub setup_env($$) $option = "client" if $option eq ""; - if ($envname eq "none") { - $testenv_vars = {}; - } elsif (defined(get_running_env($envname))) { + if (defined(get_running_env($envname))) { $testenv_vars = get_running_env($envname); if (not $testenv_vars->{target}->check_env($testenv_vars)) { print $testenv_vars->{target}->getlog_env($testenv_vars); @@ -875,8 +887,13 @@ sub setup_env($$) } } else { $testenv_vars = $target->setup_env($envname, $prefix); - if (defined($testenv_vars) && not defined($testenv_vars->{target})) { - $testenv_vars->{target} = $target; + if (defined($testenv_vars) and $testenv_vars eq "UNKNOWN") { + return $testenv_vars; + } elsif (defined($testenv_vars) && not defined($testenv_vars->{target})) { + $testenv_vars->{target} = $target; + } + if (not defined($testenv_vars)) { + warn("$opt_target can't start up known environment '$envname'"); } } @@ -930,7 +947,6 @@ sub getlog_env($) sub check_env($) { my ($envname) = @_; - return 1 if ($envname eq "none"); my $env = get_running_env($envname); return $env->{target}->check_env($env); } @@ -939,6 +955,7 @@ sub teardown_env($) { my ($envname) = @_; return if ($envname eq "none"); + print STDERR "teardown_env($envname)\n"; my $env = get_running_env($envname); $env->{target}->teardown_env($env); delete $running_envs{$envname}; @@ -946,6 +963,13 @@ sub teardown_env($) # This 'global' file needs to be empty when we start unlink("$prefix_abs/dns_host_file"); +unlink("$prefix_abs/hosts"); + +if ($opt_random_order) { + require List::Util; + my @newtodo = List::Util::shuffle(@todo); + @todo = @newtodo; +} if ($opt_testenv) { my $testenv_name = $ENV{SELFTEST_TESTENV}; @@ -953,15 +977,16 @@ if ($opt_testenv) { my $testenv_vars = setup_env($testenv_name, $prefix); - die("Unable to setup environment $testenv_name") unless ($testenv_vars); + if (not $testenv_vars or $testenv_vars eq "UNKNOWN") { + die("Unable to setup environment $testenv_name"); + } $ENV{PIDDIR} = $testenv_vars->{PIDDIR}; $ENV{ENVNAME} = $testenv_name; my $envvarstr = exported_envvars_str($testenv_vars); - my $term = ($ENV{TERMINAL} or "xterm -e"); - system("$term 'echo -e \" + my @term_args = ("echo -e \" Welcome to the Samba4 Test environment '$testenv_name' This matches the client environment used in make test @@ -972,27 +997,39 @@ TORTURE_OPTIONS=\$TORTURE_OPTIONS SMB_CONF_PATH=\$SMB_CONF_PATH $envvarstr -\" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'"); +\" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash"); + my @term = (); + if ($ENV{TERMINAL}) { + @term = ($ENV{TERMINAL}); + } else { + @term = ("xterm", "-e"); + unshift(@term_args, ("bash", "-c")); + } + + system(@term, @term_args); + teardown_env($testenv_name); } elsif ($opt_list) { foreach (@todo) { - my $cmd = $$_[2]; my $name = $$_[0]; my $envname = $$_[1]; + my $cmd = $$_[2]; + my $listcmd = $$_[3]; - unless($cmd =~ /\$LISTOPT/) { + unless (defined($listcmd)) { warn("Unable to list tests in $name"); + # Rather than ignoring this testsuite altogether, just pretend the entire testsuite is + # a single "test". + print "$name\n"; next; } - $cmd =~ s/\$LISTOPT/--list/g; - - system($cmd); + system($listcmd); if ($? == -1) { - die("Unable to run $cmd: $!"); + die("Unable to run $listcmd: $!"); } elsif ($? & 127) { - die(snprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127), ($? & 128) ? 'with' : 'without')); + die(sprintf("%s died with signal %d, %s coredump\n", $listcmd, ($? & 127), ($? & 128) ? 'with' : 'without')); } my $exitcode = $? >> 8; @@ -1013,6 +1050,11 @@ $envvarstr Subunit::end_testsuite($name, "error", "unable to set up environment $envname - exiting"); next; + } elsif ($envvars eq "UNKNOWN") { + Subunit::start_testsuite($name); + Subunit::end_testsuite($name, "skip", + "environment $envname is unknown in this test backend - skipping"); + next; } # Generate a file with the individual tests to run, if the @@ -1024,9 +1066,8 @@ $envvarstr print $fh substr($test, length($name)+1) . "\n"; } $cmd =~ s/\$LOADLIST/--load-list=$listid_file/g; - } elsif ($$_[4]) { - $cmd =~ s/\s+[^\s]+\s*$//; - $cmd .= " " . join(' ', @{$individual_tests->{$name}}); + } else { + warn("Unable to run individual tests in $name, it does not support --loadlist."); } }