selftest --help
-selftest [--srcdir=DIR] [--builddir=DIR] [--exeext=EXT][--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
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'.
use Cwd qw(abs_path);
use lib "$RealBin";
use Subunit qw(parse_results);
+use Subunit::Filter;
use SocketWrapper;
my $opt_help = 0;
my $opt_socket_wrapper_pcap = undef;
my $opt_socket_wrapper_keep_pcap = undef;
my $opt_one = 0;
-my $opt_immediate = 0;
my @opt_exclude = ();
my @opt_include = ();
my $opt_verbose = 0;
my $opt_resetup_env = undef;
my $opt_bindir = undef;
my $opt_no_lazy_setup = undef;
-my $opt_format = "plain";
my @testlists = ();
my $srcdir = ".";
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) = @_;
foreach (@$list) {
if ($fullname =~ /$$_[0]/) {
return ($$_[1]) if ($$_[1]);
- return "NO REASON SPECIFIED";
+ return "";
}
}
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->report_time(time());
- $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, [$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;
- $msg_ops->output_msg("CMD: $cmd\n");
+ unless (close(RESULTS)) {
+ if ($!) {
+ Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!");
+ return 0;
+ } else {
+ $ret = $?;
+ }
+ }
- my $ret = close(RESULT);
- $ret = 0 unless $ret == 1;
+ 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";
+ }
+
+ print "command: $cmd\n";
- my $exitcode = $? >> 8;
+ my $exitcode = $ret >> 8;
- $msg_ops->report_time(time());
- 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()
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
";
'socket-wrapper-keep-pcap' => \$opt_socket_wrapper_keep_pcap,
'quick' => \$opt_quick,
'one' => \$opt_one,
- 'immediate' => \$opt_immediate,
'exclude=s' => \@opt_exclude,
'include=s' => \@opt_include,
'srcdir=s' => \$srcdir,
'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
);
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})) {
$ENV{MALLOC_CHECK_} = 2;
}
+# make all our python scripts unbuffered
+$ENV{PYTHONUNBUFFERED} = 1;
+
my $bindir = ($opt_bindir or "$builddir/bin");
my $bindir_abs = abs_path($bindir);
$ENV{BUILDDIR_ABS} = $builddir_abs;
$ENV{EXEEXT} = $exeext;
-if (defined($ENV{RUN_FROM_BUILD_FARM}) and
- ($ENV{RUN_FROM_BUILD_FARM} eq "yes")) {
- $opt_format = "buildfarm";
-}
-
my $tls_enabled = not $opt_quick;
$ENV{TLS_ENABLED} = ($tls_enabled?"yes":"no");
$ENV{LDB_MODULES_PATH} = "$bindir_abs/modules/ldb";
mkdir("$prefix/client/private", 0777);
}
- if ( -d "$prefix/client/lock" ) {
+ 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})) {
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 = $RealBin/gdb_backtrace \%PID\% \%PROG\%
max xmit = 32K
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) = @_;
$env =~ s/\n//g;
my $cmdline = <IN>;
$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]);
}
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);
-} elsif ($opt_format eq "subunit") {
- require output::subunit;
- $msg_ops = new output::subunit();
-} else {
- die("Invalid output format '$opt_format'");
-}
-$msg_ops->report_time(time());
+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, $_);
}
my $envvarstr = exported_envvars_str($testenv_vars);
- my $term = ($ENV{TERM} or "xterm");
+ my $term = ($ENV{TERMINAL} or "xterm");
system("$term -e 'echo -e \"
Welcome to the Samba4 Test environment '$testenv_name'
my $envvars = setup_env($envname);
if (not defined($envvars)) {
- $msg_ops->skip_testsuite($name,
+ 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\"");
$target->stop();
-$msg_ops->summary();
-
my $failed = 0;
# if there were any valgrind failures, show them
foreach (<$prefix/valgrind.log*>) {
next unless (-s $_);
- system("grep DWARF2.CFI.reader $_ > /dev/null");
- if ($? >> 8 == 0) {
- print "VALGRIND FAILURE\n";
- $failed++;
- system("cat $_");
- }
-}
-
-if ($opt_format eq "buildfarm") {
- print "TEST STATUS: $statistics->{SUITES_FAIL}\n";
+ print "VALGRIND FAILURE\n";
+ $failed++;
+ system("cat $_");
}
-
-exit $statistics->{SUITES_FAIL};
+exit 0;