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";
457 } elsif (not $opt_list) {
459 warn("not using socket wrapper, but also not running as root. Will not be able to listen on proper ports");
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 nOCKET_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)) {
772 Subunit::skip_testsuite($name, $skipreason);
775 push(@todo, $testsuite);
778 } elsif (defined($skipreason)) {
780 Subunit::skip_testsuite($name, $skipreason);
783 push(@todo, $testsuite);
787 if (defined($restricted)) {
788 foreach (@$restricted) {
789 unless (defined($restricted_used->{$_})) {
790 print "No test or testsuite found matching $_\n";
793 } elsif ($#todo == -1) {
794 print STDERR "No tests to run\n";
798 my $suitestotal = $#todo + 1;
801 Subunit::progress($suitestotal);
802 Subunit::report_time(time());
808 my %running_envs = ();
810 sub get_running_env($)
818 return $running_envs{$envname};
821 my @exported_envvars = (
826 # domain controller stuff
835 "MEMBER_NETBIOSNAME",
836 "MEMBER_NETBIOSALIAS",
838 # rpc proxy controller stuff
840 "RPC_PROXY_SERVER_IP",
841 "RPC_PROXY_NETBIOSNAME",
842 "RPC_PROXY_NETBIOSALIAS",
844 # domain controller stuff for Vampired DC
846 "VAMPIRE_DC_SERVER_IP",
847 "VAMPIRE_DC_NETBIOSNAME",
848 "VAMPIRE_DC_NETBIOSALIAS",
865 "WINBINDD_SOCKET_DIR",
866 "WINBINDD_PRIV_PIPE_DIR",
871 $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
873 teardown_env($_) foreach(keys %running_envs);
874 die("Received signal $signame");
879 my ($name, $prefix) = @_;
881 my $testenv_vars = undef;
887 $option =~ s/^[^:]*//;
890 $option = "client" if $option eq "";
892 if ($envname eq "none") {
894 } elsif (defined(get_running_env($envname))) {
895 $testenv_vars = get_running_env($envname);
896 if (not $testenv_vars->{target}->check_env($testenv_vars)) {
897 print $testenv_vars->{target}->getlog_env($testenv_vars);
898 $testenv_vars = undef;
901 $testenv_vars = $target->setup_env($envname, $prefix);
902 if (defined($testenv_vars) && not defined($testenv_vars->{target})) {
903 $testenv_vars->{target} = $target;
905 if (not defined($testenv_vars)) {
906 warn("$opt_target can't provide environment '$envname'");
911 return undef unless defined($testenv_vars);
913 $running_envs{$envname} = $testenv_vars;
915 if ($option eq "local") {
916 SocketWrapper::set_default_iface($testenv_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
917 $ENV{SMB_CONF_PATH} = $testenv_vars->{SERVERCONFFILE};
918 } elsif ($option eq "client") {
919 SocketWrapper::set_default_iface(11);
920 write_clientconf($conffile, $clientdir, $testenv_vars);
921 $ENV{SMB_CONF_PATH} = $conffile;
923 die("Unknown option[$option] for envname[$envname]");
926 foreach (@exported_envvars) {
927 if (defined($testenv_vars->{$_})) {
928 $ENV{$_} = $testenv_vars->{$_};
934 return $testenv_vars;
937 sub exported_envvars_str($)
939 my ($testenv_vars) = @_;
942 foreach (@exported_envvars) {
943 next unless defined($testenv_vars->{$_});
944 $out .= $_."=".$testenv_vars->{$_}."\n";
953 return "" if ($envname eq "none");
954 my $env = get_running_env($envname);
955 return $env->{target}->getlog_env($env);
961 return 1 if ($envname eq "none");
962 my $env = get_running_env($envname);
963 return $env->{target}->check_env($env);
969 return if ($envname eq "none");
970 my $env = get_running_env($envname);
971 $env->{target}->teardown_env($env);
972 delete $running_envs{$envname};
975 # This 'global' file needs to be empty when we start
976 unlink("$prefix_abs/dns_host_file");
979 my $testenv_name = $ENV{SELFTEST_TESTENV};
980 $testenv_name = $testenv_default unless defined($testenv_name);
982 my $testenv_vars = setup_env($testenv_name, $prefix);
984 die("Unable to setup environment $testenv_name") unless ($testenv_vars);
986 $ENV{PIDDIR} = $testenv_vars->{PIDDIR};
987 $ENV{ENVNAME} = $testenv_name;
989 my $envvarstr = exported_envvars_str($testenv_vars);
991 my $term = ($ENV{TERMINAL} or "xterm -e");
992 system("$term 'echo -e \"
993 Welcome to the Samba4 Test environment '$testenv_name'
995 This matches the client environment used in make test
996 server is pid `cat \$PIDDIR/samba.pid`
998 Some useful environment variables:
999 TORTURE_OPTIONS=\$TORTURE_OPTIONS
1000 SMB_CONF_PATH=\$SMB_CONF_PATH
1003 \" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'");
1004 teardown_env($testenv_name);
1005 } elsif ($opt_list) {
1009 my $envname = $$_[1];
1011 unless($cmd =~ /\$LISTOPT/) {
1012 warn("Unable to list tests in $name");
1016 $cmd =~ s/\$LISTOPT/--list/g;
1021 die("Unable to run $cmd: $!");
1022 } elsif ($? & 127) {
1023 die(snprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127), ($? & 128) ? 'with' : 'without'));
1026 my $exitcode = $? >> 8;
1027 if ($exitcode != 0) {
1028 die("$cmd exited with exit code $exitcode");
1036 my $envname = $$_[1];
1038 my $envvars = setup_env($envname, $prefix);
1039 if (not defined($envvars)) {
1040 Subunit::start_testsuite($name);
1041 Subunit::end_testsuite($name, "error",
1042 "unable to set up environment $envname - exiting");
1046 # Generate a file with the individual tests to run, if the
1047 # test runner for this test suite supports it.
1048 if ($individual_tests and $individual_tests->{$name}) {
1050 my ($fh, $listid_file) = tempfile(UNLINK => 0);
1051 foreach my $test (@{$individual_tests->{$name}}) {
1052 print $fh substr($test, length($name)+1) . "\n";
1054 $cmd =~ s/\$LOADLIST/--load-list=$listid_file/g;
1056 $cmd =~ s/\s+[^\s]+\s*$//;
1057 $cmd .= " " . join(' ', @{$individual_tests->{$name}});
1061 run_testsuite($envname, $name, $cmd, $i, $suitestotal);
1063 teardown_env($envname) if ($opt_resetup_env);
1069 teardown_env($_) foreach (keys %running_envs);
1073 # if there were any valgrind failures, show them
1074 foreach (<$prefix/valgrind.log*>) {
1075 next unless (-s $_);
1076 print "VALGRIND FAILURE\n";