selftest: Properly recognize xfail testsuites.
authorJelmer Vernooij <jelmer@samba.org>
Fri, 5 Jun 2009 14:55:45 +0000 (16:55 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 11 Jun 2009 17:59:59 +0000 (19:59 +0200)
selftest/Subunit.pm
selftest/Subunit/Filter.pm
selftest/output/buildfarm.pm
selftest/output/plain.pm
selftest/selftest.pl

index 16aab73926242504a3153a8d332fa85f97250487..bb23483d12d2bce3665ca41750626516275cb70d 100644 (file)
@@ -39,7 +39,7 @@ sub parse_results($$$)
                        push (@$open_tests, $1);
                } elsif (/^time: (\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)Z\n/) {
                        $msg_ops->report_time(mktime($6, $5, $4, $3, $2, $1-1900));
-               } elsif (/^(success|successful|failure|fail|skip|knownfail|error|xfail|skip-testsuite|testsuite-failure|testsuite-success|testsuite-error): (.*?)( \[)?([ \t]*)\n/) {
+               } elsif (/^(success|successful|failure|fail|skip|knownfail|error|xfail|skip-testsuite|testsuite-failure|testsuite-xfail|testsuite-success|testsuite-error): (.*?)( \[)?([ \t]*)\n/) {
                        $msg_ops->control_msg($_);
                        my $result = $1;
                        my $testname = $2;
@@ -91,6 +91,8 @@ sub parse_results($$$)
                                $msg_ops->end_testsuite($testname, "success", $reason);
                        } elsif ($result eq "testsuite-failure") {
                                $msg_ops->end_testsuite($testname, "failure", $reason);
+                       } elsif ($result eq "testsuite-xfail") {
+                               $msg_ops->end_testsuite($testname, "xfail", $reason);
                        } elsif ($result eq "testsuite-error") {
                                $msg_ops->end_testsuite($testname, "error", $reason);
                        } 
index 3a9e4f9409535dc9386d489acb775073cf12b3e8..1bd4e5fed2dd06c004bbac77a76b09d70f84d0c1 100644 (file)
@@ -76,10 +76,14 @@ sub end_test($$$$$)
                $testname = $self->{prefix}.$testname;
        }
 
-       if (($result eq "fail" or $result eq "failure") and not $unexpected) { $result = "xfail"; }
+       if (($result eq "fail" or $result eq "failure") and not $unexpected) {
+               $result = "xfail";
+               $self->{xfail_added}++;
+       }
        my $xfail_reason = find_in_list($self->{expected_failures}, $testname);
        if (defined($xfail_reason) and ($result eq "fail" or $result eq "failure")) {
                $result = "xfail";
+               $self->{xfail_added}++;
                $reason .= $xfail_reason;
        }
 
@@ -95,11 +99,16 @@ sub start_testsuite($;$)
 {
        my ($self, $name) = @_;
        Subunit::start_testsuite($name);
+       $self->{xfail_added} = 0;
 }
 
 sub end_testsuite($$;$)
 {
        my ($self, $name, $result, $reason) = @_;
+       if ($self->{xfail_added} and ($result eq "fail" or $result eq "failure")) {
+               $result = "xfail";
+       }
+               
        Subunit::end_testsuite($name, $result, $reason);
 }
 
@@ -115,6 +124,7 @@ sub new {
        my $self = { 
                prefix => $prefix,
                expected_failures => $expected_failures,
+               xfail_added => 0,
        };
        bless($self, $class);
 }
index 95c5423383b5be1dc296989cda96d2855b0b1d7b..bd21fc683dc459f3d2f33f7a2fa79312615742e7 100644 (file)
@@ -86,6 +86,9 @@ sub end_testsuite($$$$$$)
        BuildFarm::end_testsuite($name, ($self->{last_time} - $self->{START_TIME}), 
                                     (not $unexpected), $self->{test_output}->{$name}, 
                                                         $reason);
+       if ($result ne "success") {
+               $self->{statistics}->{SUITES_FAIL}++;
+       }
 }
 
 sub start_test($$$)
index bfdced293645c17bb47e68091fb1091ac1de9984..5e75ce95119bdd3c1ea1c292c3357546b59f1a10 100644 (file)
@@ -125,7 +125,7 @@ sub end_testsuite($$$$)
        }
 
        if (not $self->{immediate}) {
-               if (not $unexpected) {
+               unless($unexpected) {
                        $out .= " ok\n";
                } else {
                        $out .= " " . uc($result) . "\n";
index 93a3ca27a940be37087a1656b77d3d6becb29022..28e0460a5ad76d56a1098745654102792580c0f3 100755 (executable)
@@ -129,7 +129,8 @@ use Getopt::Long;
 use POSIX;
 use Cwd qw(abs_path);
 use lib "$RealBin";
-use Subunit;
+use Subunit qw(parse_results);
+use Subunit::Filter;
 use SocketWrapper;
 
 my $opt_help = 0;
@@ -219,12 +220,34 @@ sub run_testsuite($$$$$)
        Subunit::report_time(time());
        Subunit::start_testsuite($name);
 
-       system("$cmd 2>&1 | $RealBin/filter-subunit.pl --prefix \"$name.\"");
-       my $ret = $?;
-       if ($ret == -1) {
-               Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!");
-               return 0;
-       } elsif ($ret & 127) {
+       open(RESULTS, "$cmd 2>&1|");
+       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,
+       };
+
+       my $msg_ops = new Subunit::Filter("$name\.", []);
+
+       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 = $?;
+               }
+       } 
+
+       if ($ret & 127) {
                Subunit::end_testsuite($name, "error", sprintf("Testsuite died with signal %d, %s coredump", ($ret & 127), ($ret & 128) ? "with": "without"));
                return 0;
        }