summaryrefslogtreecommitdiff
path: root/selftest/filter-subunit.pl
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2009-06-05 13:16:46 +0200
committerJelmer Vernooij <jelmer@samba.org>2009-06-11 19:59:58 +0200
commit4308e69084c3455072a4e256c84bf3b2b013f31e (patch)
tree4d98adee84fee5c68282e3ab5d596b401903139a /selftest/filter-subunit.pl
parentc278ee50eeb59f74b960036803e3288c8b329c72 (diff)
downloadsamba-4308e69084c3455072a4e256c84bf3b2b013f31e.tar.gz
samba-4308e69084c3455072a4e256c84bf3b2b013f31e.tar.bz2
samba-4308e69084c3455072a4e256c84bf3b2b013f31e.zip
selftest: Fix subunit stream to include the right prefixes rather than
extending the subunit protocol.
Diffstat (limited to 'selftest/filter-subunit.pl')
-rwxr-xr-xselftest/filter-subunit.pl182
1 files changed, 182 insertions, 0 deletions
diff --git a/selftest/filter-subunit.pl b/selftest/filter-subunit.pl
new file mode 100755
index 0000000000..9a2c6f556c
--- /dev/null
+++ b/selftest/filter-subunit.pl
@@ -0,0 +1,182 @@
+#!/usr/bin/perl
+# Filter a subunit stream
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU GPL, v3 or later
+
+=pod
+
+=head1 NAME
+
+filter-subunit - Filter a subunit stream
+
+=head1 SYNOPSIS
+
+filter-subunit --help
+
+filter-subunit --prefix=PREFIX --known-failures=FILE < in-stream > out-stream
+
+=head1 DESCRIPTION
+
+Simple Subunit stream filter that will change failures to known failures
+based on a list of regular expressions.
+
+=head1 OPTIONS
+
+=over 4
+
+=item I<--prefix>
+
+Add the specified prefix to all test names.
+
+=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.
+
+=head1 LICENSE
+
+selftest is licensed under the GNU General Public License L<http://www.gnu.org/licenses/gpl.html>.
+
+
+=head1 AUTHOR
+
+Jelmer Vernooij
+
+=cut
+
+
+use Getopt::Long;
+use strict;
+use FindBin qw($RealBin $Script);
+use lib "$RealBin";
+use Subunit qw(parse_results);
+
+my $opt_expected_failures = undef;
+my $opt_help = 0;
+my $opt_prefix = undef;
+my @expected_failures = ();
+
+my $result = GetOptions(
+ 'expected-failures=s' => \$opt_expected_failures,
+ 'prefix=s' => \$opt_prefix,
+ 'help' => \$opt_help,
+ );
+exit(1) if (not $result);
+
+if ($opt_help) {
+ print "Usage: filter-subunit [--prefix=PREFIX] [--expected-failures=FILE]... < instream > outstream\n";
+ exit(0);
+}
+
+sub read_test_regexes($)
+{
+ my ($name) = @_;
+ my @ret = ();
+ open(LF, "<$name") or die("unable to read $name: $!");
+ while (<LF>) {
+ chomp;
+ next if (/^#/);
+ if (/^(.*?)([ \t]+)\#([\t ]*)(.*?)$/) {
+ push (@ret, [$1, $4]);
+ } else {
+ s/^(.*?)([ \t]+)\#([\t ]*)(.*?)$//;
+ push (@ret, [$_, undef]);
+ }
+ }
+ close(LF);
+ return @ret;
+}
+
+if (defined($opt_expected_failures)) {
+ @expected_failures = read_test_regexes($opt_expected_failures);
+}
+
+sub find_in_list($$)
+{
+ my ($list, $fullname) = @_;
+
+ foreach (@$list) {
+ if ($fullname =~ /$$_[0]/) {
+ return ($$_[1]) if ($$_[1]);
+ return "NO REASON SPECIFIED";
+ }
+ }
+
+ return undef;
+}
+
+sub expecting_failure($)
+{
+ my ($name) = @_;
+ return find_in_list(\@expected_failures, $name);
+}
+
+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 control_msg()
+{
+ # We regenerate control messages, so ignore this
+}
+
+sub report_time($$)
+{
+ my ($self, $time) = @_;
+ Subunit::report_time($time);
+}
+
+sub output_msg($$)
+{
+ my ($self, $msg) = @_;
+ print $msg;
+}
+
+sub start_test($$$)
+{
+ my ($self, $parents, $testname) = @_;
+
+ if (defined($opt_prefix)) {
+ $testname = $opt_prefix.$testname;
+ }
+
+ Subunit::start_test($testname);
+}
+
+sub end_test($$$$$)
+{
+ my ($self, $parents, $testname, $result, $unexpected, $reason) = @_;
+
+ if (defined($opt_prefix)) {
+ $testname = $opt_prefix.$testname;
+ }
+
+ if (($result eq "fail" or $result eq "failure") and not $unexpected) { $result = "xfail"; }
+ if (expecting_failure($testname) and ($result eq "fail" or $result eq "failure")) {
+ $result = "xfail";
+ }
+
+ Subunit::end_test($testname, $result, $reason);
+}
+
+my $msg_ops = {};
+bless $msg_ops;
+
+parse_results($msg_ops, $statistics, *STDIN, []);
+
+0;