2 # Bootstrap Samba and run a number of tests against it.
3 # Copyright (C) 2005-2010 Jelmer Vernooij <jelmer@samba.org>
4 # Copyright (C) 2007-2009 Stefan Metzmacher <metze@samba.org>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
23 selftest - Samba test runner
29 selftest [--srcdir=DIR] [--bindir=DIR] [--exeext=EXT][--target=samba|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--testlist=FILE] [TESTS]
33 A simple test runner. TESTS is a regular expression with tests to run.
41 Show list of available options.
49 Built binaries directory.
57 Change directory to run tests in. Default is 'st'.
59 =item I<--target samba|samba3|win|kvm>
61 Specify test target against which to run. Default is 'samba4'.
65 Run only a limited number of tests. Intended to run in about 30 seconds on
66 moderately recent systems.
68 =item I<--socket-wrapper>
70 Use socket wrapper library for communication with server. Only works
71 when the server is running locally.
73 Will prevent TCP and UDP ports being opened on the local host but
74 (transparently) redirects these calls to use unix domain sockets.
78 Specify a file containing a list of tests that should be skipped. Possible
79 candidates are tests that segfault the server, flip or don't end.
83 Specify a file containing a list of tests that should be run. Same format
84 as the --exclude flag.
86 Not includes specified means all tests will be run.
90 Abort as soon as one test fails.
94 Load a list of tests from the specified location.
102 =item I<SMBD_VALGRIND>
104 =item I<TORTURE_MAXTIME>
116 selftest is licensed under the GNU General Public License L<http://www.gnu.org/licenses/gpl.html>.
126 use FindBin
qw($RealBin $Script);
128 use File::Temp qw(tempfile);
131 use Cwd
qw(abs_path);
138 Time
::HiRes
->import("time");
141 print "You don't have Time::Hires installed !\n";
145 my $opt_target = "samba";
147 my $opt_socket_wrapper = 0;
148 my $opt_socket_wrapper_pcap = undef;
149 my $opt_socket_wrapper_keep_pcap = undef;
151 my @opt_exclude = ();
152 my @opt_include = ();
154 my $opt_image = undef;
158 my $opt_resetup_env = undef;
159 my $opt_binary_mapping = "";
160 my $opt_load_list = undef;
164 my $bindir = "./bin";
173 print STDERR
"Exiting early because of SIGPIPE.\n";
177 $SIG{PIPE
} = \
&pipe_handler
;
181 my ($list, $fullname) = @_;
184 if ($fullname =~ /$$_[0]/) {
185 return ($$_[1]) if ($$_[1]);
197 return find_in_list
(\
@excludes, $name);
206 return unless ($opt_socket_wrapper_pcap);
207 return unless defined($ENV{SOCKET_WRAPPER_PCAP_DIR
});
210 $fname =~ s
%[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\
-]%_%g;
212 my $pcap_file = "$ENV{SOCKET_WRAPPER_PCAP_DIR}/$fname.pcap";
214 SocketWrapper
::setup_pcap
($pcap_file);
221 my ($pcap_file, $exitcode) = @_;
223 return unless ($opt_socket_wrapper_pcap);
224 return if ($opt_socket_wrapper_keep_pcap);
225 return unless ($exitcode == 0);
226 return unless defined($pcap_file);
231 # expand strings from %ENV
232 sub expand_environment_strings
($)
235 # we use a reverse sort so we do the longer ones first
236 foreach my $k (sort { $b cmp $a } keys %ENV) {
237 $s =~ s/\$$k/$ENV{$k}/g;
242 sub run_testsuite
($$$$$)
244 my ($envname, $name, $cmd, $i, $totalsuites) = @_;
245 my $pcap_file = setup_pcap
($name);
247 Subunit
::start_testsuite
($name);
248 Subunit
::progress_push
();
249 Subunit
::report_time
(time());
251 Subunit
::report_time
(time());
252 Subunit
::progress_pop
();
255 Subunit
::progress_pop
();
256 Subunit
::end_testsuite
($name, "error", "Unable to run $cmd: $!");
259 Subunit
::end_testsuite
($name, "error",
260 sprintf("%s died with signal %d, %s coredump\n", $cmd, ($?
& 127), ($?
& 128) ?
'with' : 'without'));
264 my $exitcode = $?
>> 8;
266 my $envlog = getlog_env
($envname);
268 print "envlog: $envlog\n";
271 print "command: $cmd\n";
272 printf "expanded command: %s\n", expand_environment_strings
($cmd);
274 if ($exitcode == 0) {
275 Subunit
::end_testsuite
($name, "success");
277 Subunit
::end_testsuite
($name, "failure", "Exit code was $exitcode");
280 cleanup_pcap
($pcap_file, $exitcode);
282 if (not $opt_socket_wrapper_keep_pcap and defined($pcap_file)) {
283 print "PCAP FILE: $pcap_file\n";
286 if ($exitcode != 0) {
287 exit(1) if ($opt_one);
295 print "Samba test runner
296 Copyright (C) Jelmer Vernooij <jelmer\@samba.org>
297 Copyright (C) Stefan Metzmacher <metze\@samba.org>
299 Usage: $Script [OPTIONS] TESTNAME-REGEX
302 --help this help page
303 --target=samba[3]|win|kvm Samba version to target
304 --testlist=FILE file to read available tests from
307 --prefix=DIR prefix to run tests in [st]
308 --srcdir=DIR source directory [.]
309 --bindir=DIR binaries directory [./bin]
310 --exeext=EXT executable extention []
313 --socket-wrapper-pcap save traffic to pcap directories
314 --socket-wrapper-keep-pcap keep all pcap files, not just those for tests that
316 --socket-wrapper enable socket wrapper
319 --ldap=openldap|fedora-ds back samba onto specified ldap server
322 --image=PATH path to KVM image
325 --quick run quick overall test
326 --one abort when the first test fails
328 --testenv run a shell in the requested test environment
329 --list list available tests
334 my $result = GetOptions
(
335 'help|h|?' => \
$opt_help,
336 'target=s' => \
$opt_target,
337 'prefix=s' => \
$prefix,
338 'socket-wrapper' => \
$opt_socket_wrapper,
339 'socket-wrapper-pcap' => \
$opt_socket_wrapper_pcap,
340 'socket-wrapper-keep-pcap' => \
$opt_socket_wrapper_keep_pcap,
341 'quick' => \
$opt_quick,
343 'exclude=s' => \
@opt_exclude,
344 'include=s' => \
@opt_include,
345 'srcdir=s' => \
$srcdir,
346 'bindir=s' => \
$bindir,
347 'exeext=s' => \
$exeext,
348 'verbose' => \
$opt_verbose,
349 'testenv' => \
$opt_testenv,
350 'list' => \
$opt_list,
352 'resetup-environment' => \
$opt_resetup_env,
353 'image=s' => \
$opt_image,
354 'testlist=s' => \
@testlists,
355 'load-list=s' => \
$opt_load_list,
356 'binary-mapping=s' => \
$opt_binary_mapping
359 exit(1) if (not $result);
361 ShowHelp
() if ($opt_help);
363 die("--list and --testenv are mutually exclusive") if ($opt_list and $opt_testenv);
365 # we want unbuffered output
370 # quick hack to disable rpc validation when using valgrind - its way too slow
371 unless (defined($ENV{VALGRIND
})) {
372 $ENV{VALIDATE
} = "validate";
373 $ENV{MALLOC_CHECK_
} = 2;
376 # make all our python scripts unbuffered
377 $ENV{PYTHONUNBUFFERED
} = 1;
379 my $bindir_abs = abs_path
($bindir);
381 # Backwards compatibility:
382 if (defined($ENV{TEST_LDAP
}) and $ENV{TEST_LDAP
} eq "yes") {
383 if (defined($ENV{FEDORA_DS_ROOT
})) {
390 my $torture_maxtime = ($ENV{TORTURE_MAXTIME
} or 1200);
393 $torture_maxtime *= 2;
400 die("using an empty prefix isn't allowed") unless $prefix ne "";
402 # Ensure we have the test prefix around.
404 # We need restrictive
405 # permissions on this as some subdirectories in this tree will have
406 # wider permissions (ie 0777) and this would allow other users on the
407 # host to subvert the test process.
408 mkdir($prefix, 0700) unless -d
$prefix;
411 my $prefix_abs = abs_path
($prefix);
412 my $tmpdir_abs = abs_path
("$prefix/tmp");
413 mkdir($tmpdir_abs, 0777) unless -d
$tmpdir_abs;
415 my $srcdir_abs = abs_path
($srcdir);
417 die("using an empty absolute prefix isn't allowed") unless $prefix_abs ne "";
418 die("using '/' as absolute prefix isn't allowed") unless $prefix_abs ne "/";
420 $ENV{PREFIX
} = $prefix;
421 $ENV{KRB5CCNAME
} = "$prefix/krb5ticket";
422 $ENV{PREFIX_ABS
} = $prefix_abs;
423 $ENV{SRCDIR
} = $srcdir;
424 $ENV{SRCDIR_ABS
} = $srcdir_abs;
425 $ENV{BINDIR
} = $bindir_abs;
426 $ENV{EXEEXT
} = $exeext;
428 my $tls_enabled = not $opt_quick;
429 $ENV{TLS_ENABLED
} = ($tls_enabled?
"yes":"no");
431 sub prefix_pathvar
($$)
433 my ($name, $newpath) = @_;
434 if (defined($ENV{$name})) {
435 $ENV{$name} = "$newpath:$ENV{$name}";
437 $ENV{$name} = $newpath;
440 prefix_pathvar
("PKG_CONFIG_PATH", "$bindir_abs/pkgconfig");
441 prefix_pathvar
("PYTHONPATH", "$bindir_abs/python");
443 if ($opt_socket_wrapper_keep_pcap) {
444 # Socket wrapper keep pcap implies socket wrapper pcap
445 $opt_socket_wrapper_pcap = 1;
448 if ($opt_socket_wrapper_pcap) {
449 # Socket wrapper pcap implies socket wrapper
450 $opt_socket_wrapper = 1;
453 my $socket_wrapper_dir;
454 if ($opt_socket_wrapper) {
455 $socket_wrapper_dir = SocketWrapper
::setup_dir
("$prefix_abs/w", $opt_socket_wrapper_pcap);
456 print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n";
459 print "WARNING: Not using socket wrapper, but also not running as root. Will not be able to listen on proper ports\n";
464 my $testenv_default = "none";
466 my %binary_mapping = ();
467 if ($opt_binary_mapping) {
468 my @binmapping_list = split(/,/, $opt_binary_mapping);
469 foreach my $mapping (@binmapping_list) {
470 my ($bin, $map) = split(/\:/, $mapping);
471 $binary_mapping{$bin} = $map;
475 $ENV{BINARY_MAPPING
} = $opt_binary_mapping;
477 # After this many seconds, the server will self-terminate. All tests
478 # must terminate in this time, and testenv will only stay alive this
481 my $server_maxtime = 7500;
482 if (defined($ENV{SMBD_MAXTIME
}) and $ENV{SMBD_MAXTIME
} ne "") {
483 $server_maxtime = $ENV{SMBD_MAXTIME
};
486 if ($opt_target eq "samba") {
487 if ($opt_socket_wrapper and `$bindir/smbd -b | grep SOCKET_WRAPPER` eq "") {
488 die("You must include --enable-socket-wrapper when compiling Samba in order to execute 'make test'. Exiting....");
490 $testenv_default = "dc";
491 require target
::Samba
;
492 $target = new Samba
($bindir, \
%binary_mapping, $ldap, $srcdir, $exeext, $server_maxtime);
493 } elsif ($opt_target eq "samba3") {
494 if ($opt_socket_wrapper and `$bindir/smbd -b | grep SOCKET_WRAPPER` eq "") {
495 die("You must include --enable-socket-wrapper when compiling Samba in order to execute 'make test'. Exiting....");
497 $testenv_default = "member";
498 require target
::Samba3
;
499 $target = new Samba3
($bindir, \
%binary_mapping, $srcdir_abs, $exeext, $server_maxtime);
500 } elsif ($opt_target eq "win") {
501 die("Windows tests will not run with socket wrapper enabled.")
502 if ($opt_socket_wrapper);
503 $testenv_default = "dc";
504 require target
::Windows
;
505 $target = new Windows
();
506 } elsif ($opt_target eq "kvm") {
507 die("Kvm tests will not run with socket wrapper enabled.")
508 if ($opt_socket_wrapper);
510 die("No image specified") unless ($opt_image);
511 $target = new Kvm
($opt_image, undef);
515 # Start a Virtual Distributed Ethernet Switch
516 # Returns the pid of the switch.
518 sub start_vde_switch
($)
522 system("vde_switch --pidfile $path/vde.pid --sock $path/vde.sock --daemon");
524 open(PID
, "$path/vde.pid");
532 # Stop a Virtual Distributed Ethernet Switch
533 sub stop_vde_switch
($)
539 sub read_test_regexes
($)
543 open(LF
, "<$name") or die("unable to read $name: $!");
547 if (/^(.*?)([ \t]+)\#([\t ]*)(.*?)$/) {
548 push (@ret, [$1, $4]);
550 s/^(.*?)([ \t]+)\#([\t ]*)(.*?)$//;
551 push (@ret, [$_, undef]);
558 foreach (@opt_exclude) {
559 push (@excludes, read_test_regexes
($_));
562 foreach (@opt_include) {
563 push (@includes, read_test_regexes
($_));
566 my $interfaces = join(',', ("127.0.0.11/8",
573 my $clientdir = "$prefix_abs/client";
575 my $conffile = "$clientdir/client.conf";
576 $ENV{SMB_CONF_PATH
} = $conffile;
578 sub write_clientconf
($$$)
580 my ($conffile, $clientdir, $vars) = @_;
582 mkdir("$clientdir", 0777) unless -d
"$clientdir";
584 if ( -d
"$clientdir/private" ) {
585 unlink <$clientdir/private/*>;
587 mkdir("$clientdir/private", 0777);
590 if ( -d
"$clientdir/lockdir" ) {
591 unlink <$clientdir/lockdir/*>;
593 mkdir("$clientdir/lockdir", 0777);
596 if ( -d
"$clientdir/statedir" ) {
597 unlink <$clientdir/statedir/*>;
599 mkdir("$clientdir/statedir", 0777);
602 if ( -d
"$clientdir/cachedir" ) {
603 unlink <$clientdir/cachedir/*>;
605 mkdir("$clientdir/cachedir", 0777);
608 # this is ugly, but the ncalrpcdir needs exactly 0755
609 # otherwise tests fail.
612 if ( -d
"$clientdir/ncalrpcdir/np" ) {
613 unlink <$clientdir/ncalrpcdir/np
/*>;
614 rmdir "$clientdir/ncalrpcdir/np";
616 if ( -d
"$clientdir/ncalrpcdir" ) {
617 unlink <$clientdir/ncalrpcdir/*>;
618 rmdir "$clientdir/ncalrpcdir";
620 mkdir("$clientdir/ncalrpcdir", 0755);
623 open(CF
, ">$conffile");
624 print CF
"[global]\n";
625 print CF
"\tnetbios name = client\n";
626 if (defined($vars->{DOMAIN
})) {
627 print CF
"\tworkgroup = $vars->{DOMAIN}\n";
629 if (defined($vars->{REALM
})) {
630 print CF
"\trealm = $vars->{REALM}\n";
632 if ($opt_socket_wrapper) {
633 print CF
"\tinterfaces = $interfaces\n";
636 private dir = $clientdir/private
637 lock dir = $clientdir/lockdir
638 state directory = $clientdir/statedir
639 cache directory = $clientdir/cachedir
640 ncalrpc dir = $clientdir/ncalrpcdir
641 name resolve order = file bcast
642 panic action = $RealBin/gdb_backtrace \%d
644 notify:inotify = false
646 system:anonymous = true
647 client lanman auth = Yes
649 torture:basedir = $clientdir
650 #We don't want to pass our self-tests if the PAC code is wrong
651 gensec:require_pac = true
652 resolv:host file = $prefix_abs/dns_host_file
653 #We don't want to run 'speed' tests for very long
654 torture:timelimit = 1
661 sub should_run_test
($)
667 for (my $i=0; $i <= $#tests; $i++) {
668 if ($name =~ /$tests[$i]/i) {
680 open(IN
, $filename) or die("Unable to open $filename: $!");
683 if (/-- TEST(-LOADLIST|-IDLIST|) --\n/) {
684 my $supports_loadlist = (defined($1) and $1 eq "-LOADLIST");
685 my $supports_idlist = (defined($1) and $1 eq "-IDLIST");
692 if (should_run_test
($name) == 1) {
693 push (@ret, [$name, $env, $cmdline, $supports_loadlist, $supports_idlist]);
699 close(IN
) or die("Error creating recipe");
703 if ($#testlists == -1) {
704 die("No testlists specified");
707 $ENV{SELFTEST_PREFIX
} = "$prefix_abs";
708 $ENV{SELFTEST_TMPDIR
} = "$tmpdir_abs";
709 $ENV{TEST_DATA_PREFIX
} = "$tmpdir_abs";
710 if ($opt_socket_wrapper) {
711 $ENV{SELFTEST_INTERFACES
} = $interfaces;
713 $ENV{SELFTEST_INTERFACES
} = "";
716 $ENV{SELFTEST_VERBOSE
} = "1";
718 $ENV{SELFTEST_VERBOSE
} = "";
721 $ENV{SELFTEST_QUICK
} = "1";
723 $ENV{SELFTEST_QUICK
} = "";
725 $ENV{SELFTEST_MAXTIME
} = $torture_maxtime;
728 foreach my $fn (@testlists) {
729 foreach (read_testlist
($fn)) {
731 next if (@includes and not defined(find_in_list
(\
@includes, $name)));
732 push (@available, $_);
736 my $restricted = undef;
737 my $restricted_used = {};
739 if ($opt_load_list) {
741 open(LOAD_LIST
, "<$opt_load_list") or die("Unable to open $opt_load_list");
742 while (<LOAD_LIST
>) {
744 push (@
$restricted, $_);
749 my $individual_tests = undef;
750 $individual_tests = {};
752 foreach my $testsuite (@available) {
753 my $name = $$testsuite[0];
754 my $skipreason = skip
($name);
755 if (defined($restricted)) {
756 # Find the testsuite for this test
758 foreach my $r (@
$restricted) {
760 $individual_tests->{$name} = [];
762 $restricted_used->{$r} = 1;
763 } elsif (substr($r, 0, length($name)+1) eq "$name.") {
764 push(@
{$individual_tests->{$name}}, $r);
766 $restricted_used->{$r} = 1;
770 if (defined($skipreason)) {
771 Subunit
::skip_testsuite
($name, $skipreason);
773 push(@todo, $testsuite);
776 } elsif (defined($skipreason)) {
777 Subunit
::skip_testsuite
($name, $skipreason);
779 push(@todo, $testsuite);
783 if (defined($restricted)) {
784 foreach (@
$restricted) {
785 unless (defined($restricted_used->{$_})) {
786 print "No test or testsuite found matching $_\n";
789 } elsif ($#todo == -1) {
790 print STDERR
"No tests to run\n";
794 my $suitestotal = $#todo + 1;
796 Subunit
::progress
($suitestotal);
797 Subunit
::report_time
(time());
802 my %running_envs = ();
804 sub get_running_env
($)
812 return $running_envs{$envname};
815 my @exported_envvars = (
820 # domain controller stuff
829 "MEMBER_NETBIOSNAME",
830 "MEMBER_NETBIOSALIAS",
832 # rpc proxy controller stuff
834 "RPC_PROXY_SERVER_IP",
835 "RPC_PROXY_NETBIOSNAME",
836 "RPC_PROXY_NETBIOSALIAS",
838 # domain controller stuff for Vampired DC
840 "VAMPIRE_DC_SERVER_IP",
841 "VAMPIRE_DC_NETBIOSNAME",
842 "VAMPIRE_DC_NETBIOSALIAS",
859 "WINBINDD_SOCKET_DIR",
860 "WINBINDD_PRIV_PIPE_DIR",
865 $SIG{INT
} = $SIG{QUIT
} = $SIG{TERM
} = sub {
867 teardown_env
($_) foreach(keys %running_envs);
868 die("Received signal $signame");
873 my ($name, $prefix) = @_;
875 my $testenv_vars = undef;
881 $option =~ s/^[^:]*//;
884 $option = "client" if $option eq "";
886 if ($envname eq "none") {
888 } elsif (defined(get_running_env
($envname))) {
889 $testenv_vars = get_running_env
($envname);
890 if (not $testenv_vars->{target
}->check_env($testenv_vars)) {
891 print $testenv_vars->{target
}->getlog_env($testenv_vars);
892 $testenv_vars = undef;
895 $testenv_vars = $target->setup_env($envname, $prefix);
896 if (defined($testenv_vars) && not defined($testenv_vars->{target
})) {
897 $testenv_vars->{target
} = $target;
899 if (not defined($testenv_vars)) {
900 warn("$opt_target can't provide environment '$envname'");
905 return undef unless defined($testenv_vars);
907 $running_envs{$envname} = $testenv_vars;
909 if ($option eq "local") {
910 SocketWrapper
::set_default_iface
($testenv_vars->{SOCKET_WRAPPER_DEFAULT_IFACE
});
911 $ENV{SMB_CONF_PATH
} = $testenv_vars->{SERVERCONFFILE
};
912 } elsif ($option eq "client") {
913 SocketWrapper
::set_default_iface
(11);
914 write_clientconf
($conffile, $clientdir, $testenv_vars);
915 $ENV{SMB_CONF_PATH
} = $conffile;
917 die("Unknown option[$option] for envname[$envname]");
920 foreach (@exported_envvars) {
921 if (defined($testenv_vars->{$_})) {
922 $ENV{$_} = $testenv_vars->{$_};
928 return $testenv_vars;
931 sub exported_envvars_str
($)
933 my ($testenv_vars) = @_;
936 foreach (@exported_envvars) {
937 next unless defined($testenv_vars->{$_});
938 $out .= $_."=".$testenv_vars->{$_}."\n";
947 return "" if ($envname eq "none");
948 my $env = get_running_env
($envname);
949 return $env->{target
}->getlog_env($env);
955 return 1 if ($envname eq "none");
956 my $env = get_running_env
($envname);
957 return $env->{target
}->check_env($env);
963 return if ($envname eq "none");
964 my $env = get_running_env
($envname);
965 $env->{target
}->teardown_env($env);
966 delete $running_envs{$envname};
969 # This 'global' file needs to be empty when we start
970 unlink("$prefix_abs/dns_host_file");
973 my $testenv_name = $ENV{SELFTEST_TESTENV
};
974 $testenv_name = $testenv_default unless defined($testenv_name);
976 my $testenv_vars = setup_env
($testenv_name, $prefix);
978 die("Unable to setup environment $testenv_name") unless ($testenv_vars);
980 $ENV{PIDDIR
} = $testenv_vars->{PIDDIR
};
981 $ENV{ENVNAME
} = $testenv_name;
983 my $envvarstr = exported_envvars_str
($testenv_vars);
985 my $term = ($ENV{TERMINAL
} or "xterm -e");
986 system("$term 'echo -e \"
987 Welcome to the Samba4 Test environment '$testenv_name'
989 This matches the client environment used in make test
990 server is pid `cat \$PIDDIR/samba.pid`
992 Some useful environment variables:
993 TORTURE_OPTIONS=\$TORTURE_OPTIONS
994 SMB_CONF_PATH=\$SMB_CONF_PATH
997 \" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'");
998 teardown_env
($testenv_name);
999 } elsif ($opt_list) {
1003 my $envname = $$_[1];
1005 unless($cmd =~ /\$LISTOPT/) {
1006 warn("Unable to list tests in $name");
1010 $cmd =~ s/\$LISTOPT/--list/g;
1015 die("Unable to run $cmd: $!");
1016 } elsif ($?
& 127) {
1017 die(snprintf
("%s died with signal %d, %s coredump\n", $cmd, ($?
& 127), ($?
& 128) ?
'with' : 'without'));
1020 my $exitcode = $?
>> 8;
1021 if ($exitcode != 0) {
1022 die("$cmd exited with exit code $exitcode");
1030 my $envname = $$_[1];
1032 my $envvars = setup_env
($envname, $prefix);
1033 if (not defined($envvars)) {
1034 Subunit
::start_testsuite
($name);
1035 Subunit
::end_testsuite
($name, "error",
1036 "unable to set up environment $envname - exiting");
1040 # Generate a file with the individual tests to run, if the
1041 # test runner for this test suite supports it.
1042 if ($individual_tests and $individual_tests->{$name}) {
1044 my ($fh, $listid_file) = tempfile
(UNLINK
=> 0);
1045 foreach my $test (@
{$individual_tests->{$name}}) {
1046 print $fh substr($test, length($name)+1) . "\n";
1048 $cmd =~ s/\$LOADLIST/--load-list=$listid_file/g;
1050 $cmd =~ s/\s+[^\s]+\s*$//;
1051 $cmd .= " " . join(' ', @
{$individual_tests->{$name}});
1055 run_testsuite
($envname, $name, $cmd, $i, $suitestotal);
1057 teardown_env
($envname) if ($opt_resetup_env);
1063 teardown_env
($_) foreach (keys %running_envs);
1067 # if there were any valgrind failures, show them
1068 foreach (<$prefix/valgrind
.log*>) {
1069 next unless (-s
$_);
1070 print "VALGRIND FAILURE\n";