8a56d1c922de6a080a43023217771ce73683560b
[jelmer/samba4-debian.git] / source / selftest / output / plain.pm
1 #!/usr/bin/perl
2
3 package output::plain;
4 use Exporter;
5 @ISA = qw(Exporter);
6
7 use strict;
8
9 sub new($$$$$) {
10         my ($class, $summaryfile, $verbose, $immediate, $statistics) = @_;
11         my $self = { 
12                 verbose => $verbose, 
13                 immediate => $immediate, 
14                 statistics => $statistics,
15                 test_output => {},
16                 suitesfailed => [],
17                 skips => {},
18                 summaryfile => $summaryfile,
19         };
20         bless($self, $class);
21 }
22
23 sub output_msg($$$);
24
25 sub start_testsuite($$$)
26 {
27         my ($self, $name, $state) = @_;
28         my $out = "";
29
30         my $duration = $state->{START_TIME} - $self->{statistics}->{START_TIME};
31         $out .= "[$state->{INDEX}/$state->{TOTAL} in ".$duration."s";
32         $out .= sprintf(", %d errors", $self->{statistics}->{SUITES_FAIL}) if ($self->{statistics}->{SUITES_FAIL} > 0);
33         $out .= "] $name\n", 
34
35         $self->{test_output}->{$name} = "" unless($self->{verbose});
36
37         $self->output_msg($state, "CMD: $state->{CMD}\n");
38
39         print $out;
40 }
41
42 sub output_msg($$$)
43 {
44         my ($self, $state, $output) = @_;
45
46         if ($self->{verbose}) {
47                 print $output;
48         } else {
49                 $self->{test_output}->{$state->{NAME}} .= $output;
50         }
51 }
52
53 sub control_msg($$$)
54 {
55         my ($self, $state, $output) = @_;
56
57         $self->output_msg($state, $output);
58 }
59
60 sub end_testsuite($$$$$$)
61 {
62         my ($self, $name, $state, $expected_ret, $ret, $envlog) = @_;
63         my $out = "";
64
65         $self->output_msg($state, "ENVLOG: $envlog\n") if ($envlog ne "");
66
67         if ($ret != $expected_ret) {
68                 $self->output_msg($state, "ERROR: $ret\n");
69         }
70
71         if ($ret != $expected_ret and $self->{immediate} and not $self->{verbose}) {
72                 $out .= $self->{test_output}->{$name};
73                 push (@{$self->{suitesfailed}}, $name);
74         }
75
76         print $out;
77 }
78
79 sub start_test($$)
80 {
81         my ($state, $testname) = @_;
82 }
83
84 sub end_test($$$$$$)
85 {
86         my ($self, $state, $testname, $result, $unexpected, $reason) = @_;
87         my $append = "";
88
89         unless ($unexpected) {
90                 $self->{test_output}->{$state->{NAME}} = "";
91                 return;
92         }
93
94         $append = "UNEXPECTED($result): $testname\n";
95
96         $self->{test_output}->{$state->{NAME}} .= $append;
97
98         if ($self->{immediate} and not $self->{verbose}) {
99                 print $self->{test_output}->{$state->{NAME}};
100                 $self->{test_output}->{$state->{NAME}} = "";
101         }
102 }
103
104 sub summary($)
105 {
106         my ($self) = @_;
107
108         open(SUMMARY, ">$self->{summaryfile}");
109
110         if ($#{$self->{suitesfailed}} > -1) {
111                 print SUMMARY "= Failed tests =\n";
112
113                 foreach (@{$self->{suitesfailed}}) {
114                         print SUMMARY "== $_ ==\n";
115                         print SUMMARY $self->{test_output}->{$_}."\n\n";
116                 }
117
118                 print SUMMARY "\n";
119         }
120
121         if (not $self->{immediate} and not $self->{verbose}) {
122                 foreach (@{$self->{suitesfailed}}) {
123                         print "===============================================================================\n";
124                         print "FAIL: $_\n";
125                         print $self->{test_output}->{$_};
126                         print "\n";
127                 }
128         }
129
130         print SUMMARY "= Skipped tests =\n";
131         foreach my $reason (keys %{$self->{skips}}) {
132                 print SUMMARY "$reason\n";
133                 foreach my $name (@{$self->{skips}->{$reason}}) {
134                         print SUMMARY "\t$name\n";
135                 }
136                 print SUMMARY "\n";
137         }
138         close(SUMMARY);
139
140         print "\nA summary with detailed informations can be found in:\n  $self->{summaryfile}\n";
141
142         if ($self->{statistics}->{SUITES_FAIL} == 0) {
143                 my $ok = $self->{statistics}->{TESTS_EXPECTED_OK} + 
144                                  $self->{statistics}->{TESTS_EXPECTED_FAIL};
145                 print "\nALL OK ($ok tests in $self->{statistics}->{SUITES_OK} testsuites)\n";
146         } else {
147                 print "\nFAILED ($self->{statistics}->{TESTS_UNEXPECTED_FAIL} failures and $self->{statistics}->{TESTS_ERROR} errors in $self->{statistics}->{SUITES_FAIL} testsuites)\n";
148         }
149
150 }
151
152 sub skip_testsuite($$)
153 {
154         my ($self, $name, $reason) = @_;
155
156         push (@{$self->{skips}->{$reason}}, $name);
157 }
158
159 1;