2 # Filter a subunit stream
3 # Copyright (C) Jelmer Vernooij <jelmer@samba.org>
4 # Published under the GNU GPL, v3 or later
6 package Subunit
::Filter
;
10 sub read_test_regexes
($)
14 open(LF
, "<$name") or die("unable to read $name: $!");
19 if (/^(.*?)([ \t]+)\#([\t ]*)(.*?)$/) {
20 push (@ret, [$1, $4]);
22 s/^(.*?)([ \t]+)\#([\t ]*)(.*?)$//;
23 push (@ret, [$_, undef]);
32 my ($list, $fullname) = @_;
35 if ($fullname =~ /$$_[0]/) {
36 return ($$_[1]) if ($$_[1]);
46 # We regenerate control messages, so ignore this
51 my ($self, $time) = @_;
52 Subunit
::report_time
($time);
57 my ($self, $msg) = @_;
58 unless(defined($self->{output
})) {
61 $self->{output
}.=$msg;
67 my ($self, $testname) = @_;
69 if (defined($self->{prefix
})) {
70 $testname = $self->{prefix
}.$testname;
73 if ($self->{strip_ok_output
}) {
77 Subunit
::start_test
($testname);
82 my ($self, $testname, $result, $unexpected, $reason) = @_;
84 if (defined($self->{prefix
})) {
85 $testname = $self->{prefix
}.$testname;
88 if (($result eq "fail" or $result eq "failure") and not $unexpected) {
90 $self->{xfail_added
}++;
91 $self->{total_xfail
}++;
93 my $xfail_reason = find_in_list
($self->{expected_failures
}, $testname);
94 if (defined($xfail_reason) and ($result eq "fail" or $result eq "failure")) {
96 $self->{xfail_added
}++;
97 $self->{total_xfail
}++;
98 $reason .= $xfail_reason;
101 if ($result eq "fail" or $result eq "failure") {
102 $self->{fail_added
}++;
103 $self->{total_fail
}++;
106 if ($result eq "error") {
107 $self->{error_added
}++;
108 $self->{total_error
}++;
111 if ($self->{strip_ok_output
}) {
112 unless ($result eq "success" or $result eq "xfail" or $result eq "skip") {
113 print $self->{output
}
116 $self->{output
} = undef;
118 Subunit
::end_test
($testname, $result, $reason);
121 sub skip_testsuite
($;$)
123 my ($self, $name, $reason) = @_;
124 Subunit
::skip_testsuite
($name, $reason);
127 sub start_testsuite
($;$)
129 my ($self, $name) = @_;
130 Subunit
::start_testsuite
($name);
132 $self->{error_added
} = 0;
133 $self->{fail_added
} = 0;
134 $self->{xfail_added
} = 0;
137 sub end_testsuite
($$;$)
139 my ($self, $name, $result, $reason) = @_;
142 $xfail = 1 if ($self->{xfail_added
} > 0);
143 $xfail = 0 if ($self->{fail_added
} > 0);
144 $xfail = 0 if ($self->{error_added
} > 0);
146 if ($xfail and ($result eq "fail" or $result eq "failure")) {
150 if ($self->{fail_added
} > 0 and $result ne "failure") {
152 $reason = "Subunit/Filer Reason" unless defined($reason);
153 $reason .= "\n failures[$self->{fail_added}]";
156 if ($self->{error_added
} > 0 and $result ne "error") {
158 $reason = "Subunit/Filer Reason" unless defined($reason);
159 $reason .= "\n errors[$self->{error_added}]";
162 Subunit
::end_testsuite
($name, $result, $reason);
165 sub testsuite_count
($$)
167 my ($self, $count) = @_;
168 Subunit
::testsuite_count
($count);
172 my ($class, $prefix, $expected_failures, $strip_ok_output) = @_;
176 expected_failures
=> $expected_failures,
177 strip_ok_output
=> $strip_ok_output,
183 bless($self, $class);