X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=selftest%2Fselftest.pl;h=1cae9eaa7dbdb590620b32f0b1989fecbc58032d;hb=2ccf75d9a9e73a05ab5cbe56526aba3bb45011f0;hp=60eabe41d6669a86c502a726aec9f996b7428072;hpb=70eba79edb3cba9432508ff3c439200e980f9468;p=ira%2Fwip.git diff --git a/selftest/selftest.pl b/selftest/selftest.pl index 60eabe41d66..1cae9eaa7db 100755 --- a/selftest/selftest.pl +++ b/selftest/selftest.pl @@ -1,7 +1,20 @@ #!/usr/bin/perl # Bootstrap Samba and run a number of tests against it. -# Copyright (C) 2005-2008 Jelmer Vernooij -# Published under the GNU GPL, v3 or later. +# Copyright (C) 2005-2009 Jelmer Vernooij +# Copyright (C) 2007-2009 Stefan Metzmacher + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . =pod @@ -13,7 +26,7 @@ selftest - Samba test runner selftest --help -selftest [--srcdir=DIR] [--builddir=DIR] [--target=samba4|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--immediate] [--testlist=FILE] [TESTS] +selftest [--srcdir=DIR] [--builddir=DIR] [--exeext=EXT][--target=samba4|samba3|win|kvm] [--socket-wrapper] [--quick] [--exclude=FILE] [--include=FILE] [--one] [--prefix=prefix] [--testlist=FILE] [TESTS] =head1 DESCRIPTION @@ -35,14 +48,14 @@ Source directory. Build directory. +=item I<--exeext=EXT> + +Executable extention + =item I<--prefix=DIR> Change directory to run tests in. Default is 'st'. -=item I<--immediate> - -Show errors as soon as they happen rather than at the end of the test run. - =item I<--target samba4|samba3|win|kvm> Specify test target against which to run. Default is 'samba4'. @@ -60,23 +73,10 @@ 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<--expected-failures> - -Specify a file containing a list of tests that are expected to fail. Failures for -these tests will be counted as successes, successes will be counted as failures. - -The format for the file is, one entry per line: - -TESTSUITE-NAME.TEST-NAME - -The reason for a test can also be specified, by adding a hash sign (#) and the reason -after the test name. - =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. The format of this file is the same as -for the --expected-failures flag. +candidates are tests that segfault the server, flip or don't end. =item I<--include> @@ -130,6 +130,7 @@ use POSIX; use Cwd qw(abs_path); use lib "$RealBin"; use Subunit qw(parse_results); +use Subunit::Filter; use SocketWrapper; my $opt_help = 0; @@ -139,8 +140,6 @@ 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; my @opt_exclude = (); my @opt_include = (); my $opt_verbose = 0; @@ -151,28 +150,16 @@ my $opt_analyse_cmd = undef; my $opt_resetup_env = undef; my $opt_bindir = undef; my $opt_no_lazy_setup = undef; -my $opt_format = "plain"; my @testlists = (); my $srcdir = "."; my $builddir = "."; +my $exeext = ""; my $prefix = "./st"; -my @expected_failures = (); my @includes = (); my @excludes = (); -my $statistics = { - SUITES_FAIL => 0, - - TESTS_UNEXPECTED_OK => 0, - TESTS_EXPECTED_OK => 0, - TESTS_UNEXPECTED_FAIL => 0, - TESTS_EXPECTED_FAIL => 0, - TESTS_ERROR => 0, - TESTS_SKIP => 0, -}; - sub find_in_list($$) { my ($list, $fullname) = @_; @@ -180,19 +167,13 @@ sub find_in_list($$) foreach (@$list) { if ($fullname =~ /$$_[0]/) { return ($$_[1]) if ($$_[1]); - return "NO REASON SPECIFIED"; + return ""; } } return undef; } -sub expecting_failure($) -{ - my ($name) = @_; - return find_in_list(\@expected_failures, $name); -} - sub skip($) { my ($name) = @_; @@ -219,69 +200,89 @@ sub setup_pcap($) return $pcap_file; } -sub cleanup_pcap($$$) +sub cleanup_pcap($$) { - my ($pcap_file, $expected_ret, $ret) = @_; + my ($pcap_file, $exitcode) = @_; return unless ($opt_socket_wrapper_pcap); return if ($opt_socket_wrapper_keep_pcap); - return unless ($expected_ret == $ret); + return unless ($exitcode == 0); return unless defined($pcap_file); unlink($pcap_file); } -sub run_testsuite($$$$$$) +sub run_testsuite($$$$$) { - my ($envname, $name, $cmd, $i, $totalsuites, $msg_ops) = @_; + my ($envname, $name, $cmd, $i, $totalsuites) = @_; my $pcap_file = setup_pcap($name); - $msg_ops->start_test([], $name); + Subunit::start_testsuite($name); + Subunit::report_time(time()); - unless (open(RESULT, "$cmd 2>&1|")) { - $statistics->{TESTS_ERROR}++; - $msg_ops->end_test([], $name, "error", 1, "Unable to run $cmd: $!"); - $statistics->{SUITES_FAIL}++; - return 0; - } + open(RESULTS, "$cmd 2>&1|"); + my $statistics = { + TESTS_UNEXPECTED_OK => 0, + TESTS_EXPECTED_OK => 0, + TESTS_UNEXPECTED_FAIL => 0, + TESTS_EXPECTED_FAIL => 0, + TESTS_ERROR => 0, + TESTS_SKIP => 0, + }; - my $expected_ret = parse_results( - $msg_ops, $statistics, *RESULT, \&expecting_failure, [$name]); + my $msg_ops = new Subunit::Filter("$name\.", []); - my $envlog = getlog_env($envname); - $msg_ops->output_msg("ENVLOG: $envlog\n") if ($envlog ne ""); + parse_results($msg_ops, $statistics, *RESULTS); + + my $ret = 0; + + unless (close(RESULTS)) { + if ($!) { + Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!"); + return 0; + } else { + $ret = $?; + } + } - $msg_ops->output_msg("CMD: $cmd\n"); + if ($ret & 127) { + Subunit::end_testsuite($name, "error", sprintf("Testsuite died with signal %d, %s coredump", ($ret & 127), ($ret & 128) ? "with": "without")); + return 0; + } + my $envlog = getlog_env($envname); + if ($envlog ne "") { + print "envlog: $envlog\n"; + } - my $ret = close(RESULT); - $ret = 0 unless $ret == 1; + print "command: $cmd\n"; - my $exitcode = $? >> 8; + my $exitcode = $ret >> 8; - if ($ret == 1) { - $msg_ops->end_test([], $name, "success", $expected_ret != $ret, undef); + Subunit::report_time(time()); + if ($exitcode == 0) { + Subunit::end_testsuite($name, "success"); } else { - $msg_ops->end_test([], $name, "failure", $expected_ret != $ret, "Exit code was $exitcode"); + Subunit::end_testsuite($name, "failure", "Exit code was $exitcode"); } - cleanup_pcap($pcap_file, $expected_ret, $ret); + cleanup_pcap($pcap_file, $exitcode); if (not $opt_socket_wrapper_keep_pcap and defined($pcap_file)) { - $msg_ops->output_msg("PCAP FILE: $pcap_file\n"); + print "PCAP FILE: $pcap_file\n"; } - if ($ret != $expected_ret) { - $statistics->{SUITES_FAIL}++; + if ($exitcode != 0) { exit(1) if ($opt_one); } - return ($ret == $expected_ret); + return $exitcode; } sub ShowHelp() { print "Samba test runner Copyright (C) Jelmer Vernooij +Copyright (C) Stefan Metzmacher Usage: $Script [OPTIONS] TESTNAME-REGEX @@ -294,27 +295,24 @@ Paths: --prefix=DIR prefix to run tests in [st] --srcdir=DIR source directory [.] --builddir=DIR output directory [.] + --exeext=EXT executable extention [] Target Specific: --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 - --expected-failures=FILE specify list of tests that is guaranteed to fail + --bindir=PATH path to target binaries Samba4 Specific: --ldap=openldap|fedora-ds back samba onto specified ldap server -Samba3 Specific: - --bindir=PATH path to binaries - Kvm Specific: --image=PATH path to KVM image Behaviour: --quick run quick overall test --one abort when the first test fails - --immediate print test output for failed tests during run --verbose be verbose --analyse-cmd CMD command to run after each test "; @@ -330,12 +328,11 @@ my $result = GetOptions ( 'socket-wrapper-keep-pcap' => \$opt_socket_wrapper_keep_pcap, 'quick' => \$opt_quick, 'one' => \$opt_one, - 'immediate' => \$opt_immediate, - 'expected-failures=s' => \$opt_expected_failures, 'exclude=s' => \@opt_exclude, 'include=s' => \@opt_include, 'srcdir=s' => \$srcdir, 'builddir=s' => \$builddir, + 'exeext=s' => \$exeext, 'verbose' => \$opt_verbose, 'testenv' => \$opt_testenv, 'ldap:s' => \$ldap, @@ -343,7 +340,6 @@ my $result = GetOptions ( 'no-lazy-setup' => \$opt_no_lazy_setup, 'resetup-environment' => \$opt_resetup_env, 'bindir:s' => \$opt_bindir, - 'format=s' => \$opt_format, 'image=s' => \$opt_image, 'testlist=s' => \@testlists ); @@ -352,7 +348,7 @@ exit(1) if (not $result); ShowHelp() if ($opt_help); -my $tests = shift; +my @tests = @ARGV; # quick hack to disable rpc validation when using valgrind - its way too slow unless (defined($ENV{VALGRIND})) { @@ -360,7 +356,8 @@ unless (defined($ENV{VALGRIND})) { $ENV{MALLOC_CHECK_} = 2; } -my $old_pwd = "$RealBin/.."; +my $bindir = ($opt_bindir or "$builddir/bin"); +my $bindir_abs = abs_path($bindir); # Backwards compatibility: if (defined($ENV{TEST_LDAP}) and $ENV{TEST_LDAP} eq "yes") { @@ -388,6 +385,7 @@ mkdir($prefix, 0777) unless -d $prefix; my $prefix_abs = abs_path($prefix); my $srcdir_abs = abs_path($srcdir); +my $builddir_abs = abs_path($builddir); die("using an empty absolute prefix isn't allowed") unless $prefix_abs ne ""; die("using '/' as absolute prefix isn't allowed") unless $prefix_abs ne "/"; @@ -397,16 +395,14 @@ $ENV{KRB5CCNAME} = "$prefix/krb5ticket"; $ENV{PREFIX_ABS} = $prefix_abs; $ENV{SRCDIR} = $srcdir; $ENV{SRCDIR_ABS} = $srcdir_abs; - -if (defined($ENV{RUN_FROM_BUILD_FARM}) and - ($ENV{RUN_FROM_BUILD_FARM} eq "yes")) { - $opt_format = "buildfarm"; -} +$ENV{BUILDDIR} = $builddir; +$ENV{BUILDDIR_ABS} = $builddir_abs; +$ENV{EXEEXT} = $exeext; my $tls_enabled = not $opt_quick; $ENV{TLS_ENABLED} = ($tls_enabled?"yes":"no"); -$ENV{LDB_MODULES_PATH} = "$old_pwd/source4/bin/modules/ldb"; -$ENV{LD_SAMBA_MODULE_PATH} = "$old_pwd/source4/bin/modules"; +$ENV{LDB_MODULES_PATH} = "$bindir_abs/modules/ldb"; +$ENV{LD_SAMBA_MODULE_PATH} = "$bindir_abs/modules"; sub prefix_pathvar($$) { my ($name, $newpath) = @_; @@ -416,8 +412,8 @@ sub prefix_pathvar($$) $ENV{$name} = $newpath; } } -prefix_pathvar("PKG_CONFIG_PATH", "$old_pwd/source4/bin/pkgconfig"); -prefix_pathvar("PYTHONPATH", "$old_pwd/source4/bin/python"); +prefix_pathvar("PKG_CONFIG_PATH", "$bindir_abs/pkgconfig"); +prefix_pathvar("PYTHONPATH", "$bindir_abs/python"); if ($opt_socket_wrapper_keep_pcap) { # Socket wrapper keep pcap implies socket wrapper pcap @@ -434,7 +430,9 @@ if ($opt_socket_wrapper) { $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix/w", $opt_socket_wrapper_pcap); print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n"; } else { - warn("Not using socket wrapper, but also not running as root. Will not be able to listen on proper ports") unless $< == 0; + 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 $target; @@ -443,14 +441,14 @@ my $testenv_default = "none"; if ($opt_target eq "samba4") { $testenv_default = "member"; require target::Samba4; - $target = new Samba4($opt_bindir or "$srcdir/bin", $ldap, "$srcdir/setup"); + $target = new Samba4($bindir, $ldap, "$srcdir/setup", $exeext); } elsif ($opt_target eq "samba3") { - if ($opt_socket_wrapper and `$opt_bindir/smbd -b | grep SOCKET_WRAPPER` eq "") { + 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 = "dc"; + $testenv_default = "member"; require target::Samba3; - $target = new Samba3($opt_bindir); + $target = new Samba3($bindir); } elsif ($opt_target eq "win") { die("Windows tests will not run with socket wrapper enabled.") if ($opt_socket_wrapper); @@ -509,18 +507,10 @@ sub read_test_regexes($) return @ret; } -if (defined($opt_expected_failures)) { - @expected_failures = read_test_regexes($opt_expected_failures); -} - foreach (@opt_exclude) { push (@excludes, read_test_regexes($_)); } -if ($opt_quick) { - push (@includes, read_test_regexes("samba4-quick")); -} - foreach (@opt_include) { push (@includes, read_test_regexes($_)); } @@ -547,6 +537,18 @@ sub write_clientconf($$) mkdir("$prefix/client/private", 0777); } + if ( -d "$prefix/client/lockdir" ) { + unlink <$prefix/client/lockdir/*>; + } else { + mkdir("$prefix/client/lockdir", 0777); + } + + if ( -d "$prefix_abs/client/ncalrpcdir" ) { + unlink <$prefix/client/ncalrpcdir/*>; + } else { + mkdir("$prefix/client/ncalrpcdir", 0777); + } + open(CF, ">$conffile"); print CF "[global]\n"; if (defined($ENV{VALGRIND})) { @@ -561,26 +563,20 @@ sub write_clientconf($$) if (defined($vars->{REALM})) { print CF "\trealm = $vars->{REALM}\n"; } - if (defined($vars->{NCALRPCDIR})) { - print CF "\tncalrpc dir = $vars->{NCALRPCDIR}\n"; - } - if (defined($vars->{PIDDIR})) { - print CF "\tpid directory = $vars->{PIDDIR}\n"; - } - if (defined($vars->{WINBINDD_SOCKET_DIR})) { - print CF "\twinbindd socket directory = $vars->{WINBINDD_SOCKET_DIR}\n"; - } if ($opt_socket_wrapper) { print CF "\tinterfaces = $interfaces\n"; } print CF " private dir = $prefix_abs/client/private + lock dir = $prefix_abs/client/lockdir + ncalrpc dir = $prefix_abs/client/ncalrpcdir name resolve order = bcast - panic action = $srcdir_abs/script/gdb_backtrace \%PID\% \%PROG\% + panic action = $RealBin/gdb_backtrace \%PID\% \%PROG\% max xmit = 32K notify:inotify = false ldb:nosync = true system:anonymous = true + client lanman auth = Yes torture:basedir = $prefix_abs/client #We don't want to pass our self-tests if the PAC code is wrong gensec:require_pac = true @@ -595,6 +591,20 @@ my $testsdir = "$srcdir/selftest"; my %required_envs = (); +sub should_run_test($) +{ + my $name = shift; + if ($#tests == -1) { + return 1; + } + for (my $i=0; $i <= $#tests; $i++) { + if ($name =~ /$tests[$i]/i) { + return 1; + } + } + return 0; +} + sub read_testlist($) { my ($filename) = @_; @@ -610,7 +620,7 @@ sub read_testlist($) $env =~ s/\n//g; my $cmdline = ; $cmdline =~ s/\n//g; - if (not defined($tests) or $name =~ /$tests/) { + if (should_run_test($name) == 1) { $required_envs{$env} = 1; push (@ret, [$name, $env, $cmdline]); } @@ -644,38 +654,24 @@ if ($opt_quick) { } $ENV{SELFTEST_TARGET} = $opt_target; $ENV{SELFTEST_MAXTIME} = $torture_maxtime; -$ENV{SELFTEST_CONFFILE} = $conffile; my @available = (); foreach my $fn (@testlists) { foreach (read_testlist($fn)) { my $name = $$_[0]; - next if (@includes and not find_in_list(\@includes, $name)); + next if (@includes and not defined(find_in_list(\@includes, $name))); push (@available, $_); } } -my $msg_ops; -if ($opt_format eq "buildfarm") { - require output::buildfarm; - $msg_ops = new output::buildfarm($statistics); -} elsif ($opt_format eq "plain") { - require output::plain; - $msg_ops = new output::plain("$prefix/summary", $opt_verbose, $opt_immediate, $statistics, $#available+1); -} elsif ($opt_format eq "html") { - require output::html; - mkdir("test-results", 0777); - $msg_ops = new output::html("test-results", $statistics); -} else { - die("Invalid output format '$opt_format'"); -} - +Subunit::testsuite_count($#available+1); +Subunit::report_time(time()); foreach (@available) { my $name = $$_[0]; my $skipreason = skip($name); - if ($skipreason) { - $msg_ops->skip_testsuite($name, $skipreason); + if (defined($skipreason)) { + Subunit::skip_testsuite($name, $skipreason); } else { push(@todo, $_); } @@ -692,6 +688,17 @@ $| = 1; my %running_envs = (); +sub get_running_env($) +{ + my ($name) = @_; + + my $envname = $name; + + $envname =~ s/:.*//; + + return $running_envs{$envname}; +} + my @exported_envvars = ( # domain stuff "DOMAIN", @@ -729,13 +736,23 @@ $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { sub setup_env($) { - my ($envname) = @_; + my ($name) = @_; + + my $testenv_vars = undef; + + my $envname = $name; + my $option = $name; + + $envname =~ s/:.*//; + $option =~ s/^[^:]*//; + $option =~ s/^://; + + $option = "client" if $option eq ""; - my $testenv_vars; if ($envname eq "none") { $testenv_vars = {}; - } elsif (defined($running_envs{$envname})) { - $testenv_vars = $running_envs{$envname}; + } elsif (defined(get_running_env($envname))) { + $testenv_vars = get_running_env($envname); if (not $target->check_env($testenv_vars)) { $testenv_vars = undef; } @@ -747,8 +764,16 @@ sub setup_env($) $running_envs{$envname} = $testenv_vars; - SocketWrapper::set_default_iface(6); - write_clientconf($conffile, $testenv_vars); + if ($option eq "local") { + SocketWrapper::set_default_iface($testenv_vars->{SOCKET_WRAPPER_DEFAULT_IFACE}); + $ENV{SMB_CONF_PATH} = $testenv_vars->{SERVERCONFFILE}; + } elsif ($option eq "client") { + SocketWrapper::set_default_iface(6); + write_clientconf($conffile, $testenv_vars); + $ENV{SMB_CONF_PATH} = $conffile; + } else { + die("Unknown option[$option] for envname[$envname]"); + } foreach (@exported_envvars) { if (defined($testenv_vars->{$_})) { @@ -778,21 +803,21 @@ sub getlog_env($) { my ($envname) = @_; return "" if ($envname eq "none"); - return $target->getlog_env($running_envs{$envname}); + return $target->getlog_env(get_running_env($envname)); } sub check_env($) { my ($envname) = @_; return 1 if ($envname eq "none"); - return $target->check_env($running_envs{$envname}); + return $target->check_env(get_running_env($envname)); } sub teardown_env($) { my ($envname) = @_; return if ($envname eq "none"); - $target->teardown_env($running_envs{$envname}); + $target->teardown_env(get_running_env($envname)); delete $running_envs{$envname}; } @@ -819,7 +844,7 @@ server is pid `cat \$PIDDIR/samba.pid` Some useful environment variables: TORTURE_OPTIONS=\$TORTURE_OPTIONS -CONFIGURATION=\$CONFIGURATION +SMB_CONF_PATH=\$SMB_CONF_PATH $envvarstr \" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'"); @@ -834,12 +859,12 @@ $envvarstr my $envvars = setup_env($envname); if (not defined($envvars)) { - $msg_ops->skip_testsuite($name, "unable to set up environment $envname"); + Subunit::skip_testsuite($name, + "unable to set up environment $envname"); next; } - run_testsuite($envname, $name, $cmd, $i, $suitestotal, - $msg_ops); + run_testsuite($envname, $name, $cmd, $i, $suitestotal); if (defined($opt_analyse_cmd)) { system("$opt_analyse_cmd \"$name\""); @@ -855,8 +880,6 @@ teardown_env($_) foreach (keys %running_envs); $target->stop(); -$msg_ops->summary(); - my $failed = 0; # if there were any valgrind failures, show them @@ -869,9 +892,4 @@ foreach (<$prefix/valgrind.log*>) { system("cat $_"); } } - -if ($opt_format eq "buildfarm") { - print "TEST STATUS: $statistics->{SUITES_FAIL}\n"; -} - -exit $statistics->{SUITES_FAIL}; +exit 0;