blob: 9522c7bc3f702c987af1ce82cdb77e3f7596bedc [file] [log] [blame]
Christophe Lyonbff39612015-11-18 16:29:11 +01001#!/usr/bin/env perl
2use strict;
3use warnings;
4
5use File::Glob;
6use Getopt::Long;
7use Term::ANSIColor qw(:constants);
8use File::Basename;
9use Cwd;
10
11my $app = $0;
12
13sub read_sum($);
14sub read_unstable($);
15sub dump_result($);
16sub compare_results($$);
17sub usage();
18sub print_compare_results_summary($$);
19sub nothing($$$$);
20
Christophe Lyona140aa82015-12-17 22:53:03 +010021# OK
Christophe Lyonbff39612015-11-18 16:29:11 +010022my $STILL_PASSES = "Still passes [PASS => PASS]";
23my $STILL_FAILS = "Still fails [FAIL => FAIL]";
Christophe Lyona140aa82015-12-17 22:53:03 +010024my $STILL_XPASS = "Still xpass [XPASS=>XPASS]";
25my $STILL_XFAIL = "Still xfail [XFAIL=>XFAIL]";
Christophe Lyonbff39612015-11-18 16:29:11 +010026
27# TO BE CHECKED
Christophe Lyona140aa82015-12-17 22:53:03 +010028my $PASS_NOW_XFAIL = "PASS now XFAIL [PASS =>XFAIL]";
29my $XFAIL_APPEARS = "XFAIL appears [ =>XFAIL]";
30my $FAIL_NOW_XFAIL = "FAIL now XFAIL [FAIL =>XFAIL]";
31my $XPASS_NOW_XFAIL = "XPASS now XFAIL [XPASS=>XFAIL]";
Christophe Lyonbff39612015-11-18 16:29:11 +010032my $PASSED_NOW_TIMEOUTS = "Timeout [PASS =>T.OUT]";
Christophe Lyona140aa82015-12-17 22:53:03 +010033my $FAIL_DISAPPEARS = "FAIL disappears [FAIL => ]";
34my $XPASS_NOW_PASSES = "XPASS now PASS [XPASS=> PASS]";
35my $XFAIL_NOW_PASSES = "XFAIL now PASS [XFAIL=> PASS]";
36my $XFAIL_NOW_XPASS = "XFAIL now XPASS [XFAIL=>XPASS]";
37my $FAIL_NOW_PASSES = "FAIL now PASS [FAIL => PASS]";
38my $FAIL_NOW_XPASS = "FAIL now XPASS [FAIL =>XPASS]";
39my $NEW_PASSES = "New PASS [ => PASS]";
Christophe Lyonbff39612015-11-18 16:29:11 +010040my $UNHANDLED_CASES = "Unhandled cases [ ..??.. ]";
41my $UNSTABLE_CASES = "Unstable cases, ignored [~RANDOM ]";
Christophe Lyona140aa82015-12-17 22:53:03 +010042my $UNSUPPORTED_XPASS = "UNSUPPORTED now XPASS [UNSUP=>XPASS]";
43my $UNSUPPORTED_XFAIL = "UNSUPPORTED now XFAIL [UNSUP=>XFAIL]";
44my $UNSUPPORTED_DISAPPEARS= "UNSUPPORTED disappears [UNSUP=> ]";
45my $UNTESTED_PASS = "UNTESTED now PASS [UNTES=> PASS]";
46my $UNTESTED_XFAIL = "UNTESTED now XFAIL [UNTES=>XFAIL]";
47my $UNTESTED_DISAPPEARS = "UNTESTED disappears [UNTES=> ]";
48my $UNRESOLVED_PASS = "UNRESOLVED now PASS [UNRES=> PASS]";
49my $UNRESOLVED_XFAIL = "UNRESOLVED now XFAIL [UNRES=>XFAIL]";
50my $UNRESOLVED_DISAPPEARS = "UNRESOLVED disappears [UNRES=> ]";
Christophe Lyondc66fc52016-04-05 17:38:07 +020051my $UNSUPPORTED_APPEARS = "UNSUPPORTED appears [ =>UNSUP]";
52my $UNTESTED_APPEARS = "UNTESTED appears [ =>UNTES]";
Christophe Lyonbff39612015-11-18 16:29:11 +010053
Christophe Lyona140aa82015-12-17 22:53:03 +010054# REGRESSIONS
55my $PASS_NOW_XPASS = "PASS now XPASS [PASS =>XPASS]";
56my $PASSED_NOW_FAILS = "PASS now FAIL [PASS => FAIL]";
57my $PASS_DISAPPEARS = "PASS disappears [PASS => ]";
58my $XPASS_DISAPPEARS = "XPASS disappears [XPASS=> ]";
59my $FAIL_APPEARS = "FAIL appears [ => FAIL]";
60my $XPASS_APPEARS = "XPASS appears [ =>XPASS]";
Christophe Lyondc66fc52016-04-05 17:38:07 +020061my $UNRESOLVED_APPEARS = "UNRESOLVED appears [ =>UNRES]";
Christophe Lyona140aa82015-12-17 22:53:03 +010062my $XPASS_NOW_FAIL = "XPASS now FAIL [XPASS=> FAIL]";
63my $XFAIL_NOW_FAIL = "XFAIL now FAIL [XFAIL=> FAIL]";
64my $XFAIL_DISAPPEARS = "XFAIL disappears [XFAIL=> ]";
65
66my $UNSUPPORTED_PASS = "UNSUPPORTED now PASS [UNSUP=> PASS]";
67my $UNSUPPORTED_FAIL = "UNSUPPORTED now FAIL [UNSUP=> FAIL]";
68my $UNTESTED_FAIL = "UNTESTED now FAIL [UNTES=> FAIL]";
69my $UNTESTED_XPASS = "UNTESTED now XPASS [UNTES=>XPASS]";
70my $UNRESOLVED_FAIL = "UNRESOLVED now FAIL [UNRES=> FAIL]";
71my $UNRESOLVED_XPASS = "UNRESOLVED now XPASS [UNRES=>XPASS]";
Christophe Lyonbff39612015-11-18 16:29:11 +010072
73my @handler_list = (
74 {was=>"PASS", is=>"PASS", cat=>$STILL_PASSES},
Christophe Lyona140aa82015-12-17 22:53:03 +010075 {was=>"PASS", is=>"XPASS", cat=>$PASS_NOW_XPASS},
76 {was=>"XPASS", is=>"PASS", cat=>$XPASS_NOW_PASSES},
77 {was=>"XPASS", is=>"XPASS", cat=>$STILL_XPASS},
Christophe Lyonbff39612015-11-18 16:29:11 +010078 {was=>"FAIL", is=>"FAIL", cat=>$STILL_FAILS},
Christophe Lyona140aa82015-12-17 22:53:03 +010079 {was=>"FAIL", is=>"XFAIL", cat=>$FAIL_NOW_XFAIL},
80 {was=>"XFAIL", is=>"FAIL", cat=>$XFAIL_NOW_FAIL},
81 {was=>"XFAIL", is=>"XFAIL", cat=>$STILL_XFAIL},
Christophe Lyonbff39612015-11-18 16:29:11 +010082
Christophe Lyona140aa82015-12-17 22:53:03 +010083 {was=>"XPASS", is=>"XFAIL", cat=>$XPASS_NOW_XFAIL},
84 {was=>"PASS", is=>"XFAIL", cat=>$PASS_NOW_XFAIL},
Christophe Lyonbff39612015-11-18 16:29:11 +010085 {was=>"FAIL", is=>"NO_EXIST", cat=>$FAIL_DISAPPEARS},
Christophe Lyona140aa82015-12-17 22:53:03 +010086 {was=>"XFAIL", is=>"NO_EXIST", cat=>$XFAIL_DISAPPEARS},
Christophe Lyonbff39612015-11-18 16:29:11 +010087 {was=>"XFAIL", is=>"PASS", cat=>$XFAIL_NOW_PASSES},
Christophe Lyona140aa82015-12-17 22:53:03 +010088 {was=>"XFAIL", is=>"XPASS", cat=>$XFAIL_NOW_XPASS},
Christophe Lyonbff39612015-11-18 16:29:11 +010089 {was=>"FAIL", is=>"PASS", cat=>$FAIL_NOW_PASSES},
Christophe Lyona140aa82015-12-17 22:53:03 +010090 {was=>"FAIL", is=>"XPASS", cat=>$FAIL_NOW_XPASS},
Christophe Lyonbff39612015-11-18 16:29:11 +010091 {was=>"NO_EXIST", is=>"PASS", cat=>$NEW_PASSES},
Christophe Lyona140aa82015-12-17 22:53:03 +010092 {was=>"NO_EXIST", is=>"XPASS", cat=>$XPASS_APPEARS},
Christophe Lyonbff39612015-11-18 16:29:11 +010093
94 {was=>"PASS", is=>"FAIL", handler=>\&handle_pass_fail},
Christophe Lyona140aa82015-12-17 22:53:03 +010095 {was=>"XPASS", is=>"FAIL", cat=>$XPASS_NOW_FAIL},
Christophe Lyonbff39612015-11-18 16:29:11 +010096 {was=>"PASS", is=>"NO_EXIST", cat=>$PASS_DISAPPEARS},
Christophe Lyona140aa82015-12-17 22:53:03 +010097 {was=>"XPASS", is=>"NO_EXIST", cat=>$XPASS_DISAPPEARS},
Christophe Lyonbff39612015-11-18 16:29:11 +010098 {was=>"NO_EXIST", is=>"FAIL", cat=>$FAIL_APPEARS},
99 {was=>"NO_EXIST", is=>"XFAIL", cat=>$XFAIL_APPEARS},
100
Christophe Lyona140aa82015-12-17 22:53:03 +0100101 {was=>"UNSUPPORTED", is=>"PASS", cat=>$UNSUPPORTED_PASS},
102 {was=>"UNSUPPORTED", is=>"XPASS", cat=>$UNSUPPORTED_XPASS},
103 {was=>"UNSUPPORTED", is=>"FAIL", cat=>$UNSUPPORTED_FAIL},
104 {was=>"UNSUPPORTED", is=>"XFAIL", cat=>$UNSUPPORTED_XFAIL},
105 {was=>"UNSUPPORTED", is=>"NO_EXIST", cat=>$UNSUPPORTED_DISAPPEARS},
106
107 {was=>"UNTESTED", is=>"PASS", cat=>$UNTESTED_PASS},
108 {was=>"UNTESTED", is=>"XPASS", cat=>$UNTESTED_XPASS},
109 {was=>"UNTESTED", is=>"FAIL", cat=>$UNTESTED_FAIL},
110 {was=>"UNTESTED", is=>"XFAIL", cat=>$UNTESTED_XFAIL},
111 {was=>"UNTESTED", is=>"NO_EXIST", cat=>$UNTESTED_DISAPPEARS},
112
113 {was=>"UNRESOLVED", is=>"PASS", cat=>$UNRESOLVED_PASS},
114 {was=>"UNRESOLVED", is=>"XPASS", cat=>$UNRESOLVED_XPASS},
115 {was=>"UNRESOLVED", is=>"FAIL", cat=>$UNRESOLVED_FAIL},
116 {was=>"UNRESOLVED", is=>"XFAIL", cat=>$UNRESOLVED_XFAIL},
117 {was=>"UNRESOLVED", is=>"NO_EXIST", cat=>$UNRESOLVED_DISAPPEARS},
118
Christophe Lyondc66fc52016-04-05 17:38:07 +0200119 {was=>"NO_EXIST", is=>"UNRESOLVED", cat=>$UNRESOLVED_APPEARS},
120 {was=>"NO_EXIST", is=>"UNTESTED", cat=>$UNTESTED_APPEARS},
121 {was=>"NO_EXIST", is=>"UNSUPPORTED", cat=>$UNSUPPORTED_APPEARS},
122
Christophe Lyonbff39612015-11-18 16:29:11 +0100123# {was=>"NO_EXIST", is=>"NO_EXIST", handler=>\&handle_not_yet_supported}
124);
125
126######################################################
127# TREAT ARGUMENTS
128
129my $verbose=0;
130my $quiet=0;
131my $long=0;
132my $short=0;
133my $debug=0;
134my ($testroot, $basename);
135my ($ref_file_name, $res_file_name);
136my $nounstable=0;
137my $unstablefile=0;
138my @unstable_markers=();
139
140GetOptions ("l" => \$long,
141 "s" => \$short,
142 "q" => \$quiet,
143 "v" => \$verbose,
144 "dbg" => \$debug,
145 "testroot=s" => \$testroot,
146 "basename=s" => \$basename,
147 "no-unstable" => \$nounstable,
148 "unstable-tests=s" => \$unstablefile,
149 "unstable-marker=s" => \@unstable_markers);
150
151$ref_file_name = $ARGV[0] if ($#ARGV == 1);
152$res_file_name = $ARGV[1] if ($#ARGV == 1);
153
154$ref_file_name = $testroot."/expected_results/".$basename if ($testroot and $basename);
155$res_file_name = $testroot."/testing/run/".$basename if ($testroot and $basename);
156&usage if (not $ref_file_name or not $res_file_name);
157
158my ($col_boldred, $col_red, $col_boldgreen, $col_green, $col_boldpink, $col_pink, $col_reset)
159 = ("\033[31;1m","\033[31;3m","\033[32;1m","\033[32;3m","\033[35;1m","\033[35;2m","\033[0m");
160($col_boldred, $col_red, $col_boldgreen, $col_green, $col_boldpink, $col_pink, $col_reset)
161 = ("","","","","","","") if (not I_am_interactive());
162
163######################################################
164# MAIN PROGRAM
165# print "comparing $ref_file_name $res_file_name\n";
166
167# If none of the 2 .sum exists, nothing to compare: exit early.
168exit 0 if ( (! -e $ref_file_name) && (! -e $res_file_name ));
169
170my $ref = read_sum($ref_file_name) ;
171my $res = read_sum($res_file_name) ;
172my @unstablelist = ();
173
174@unstablelist = read_unstable($unstablefile) if ($unstablefile ne 0);
175
176compare_results($ref, $res);
177
178my $final_result = print_compare_results_summary($ref, $res);
179
180exit $final_result;
181
182######################################################
183# UTILITIES
184
185sub empty_result()
186{
187 my %empty_result;# = {PASS=>0, FAIL=>0, XPASS=>0, XFAIL=>0, UNSUPPORTED=>0, UNTESTED=>0, UNRESOLVED=>0};
188 $empty_result{PASS}=$empty_result{FAIL}=$empty_result{XPASS}=$empty_result{XFAIL}=0;
189 $empty_result{UNSUPPORTED}=$empty_result{UNTESTED}=$empty_result{UNRESOLVED}=$empty_result{NO_EXIST}=0;
190 return \%empty_result;
191}
192sub I_am_interactive {
193 return -t STDIN && -t STDOUT;
194}
195sub usage()
196{
197 print "Usage : $app <ref_file.sum> <result_file.sum>\n";
198 exit 1;
199}
200
201
202######################################################
203# PARSING
204sub read_sum($)
205{
206 my ($sum_file) = @_;
207 my $res = empty_result();
208 my %testcases;
209 my %unsupported;
210 $res->{testcases} = \%testcases;
211 my $pending_timeout=0;
212
Christophe Lyonad8c7242016-02-03 13:04:28 +0100213 $res->{EXEC}->{PASS} = 0;
214 $res->{EXEC}->{FAIL} = 0;
215
Christophe Lyonbff39612015-11-18 16:29:11 +0100216 open SUMFILE, $sum_file or die $!;
217 while (<SUMFILE>)
218 {
219 if (m/^(PASS|XPASS|FAIL|XFAIL|UNSUPPORTED|UNTESTED|UNRESOLVED): (.*)/)
220 {
221 my ($diag,$tc) = ($1,$2);
222 my %tcresult;
223 $tc =~ s/==[0-9]+== Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly./==<pid>== Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly./;
224 $testcases{$tc} = empty_result() if (not exists $testcases{$tc});
225 $testcases{$tc}->{$diag}++;
226 $testcases{$tc}->{HAS_TIMED_OUT} = $pending_timeout;
227 $pending_timeout = 0;
228 $res->{$diag}++;
Christophe Lyonad8c7242016-02-03 13:04:28 +0100229 # Count execution tests, for a sanity check
230 if ($tc =~ /execution/)
231 {
232 $res->{EXEC}->{$diag}++;
233 }
Christophe Lyonbff39612015-11-18 16:29:11 +0100234 }
235 elsif (m/WARNING: program timed out/)
236 {
237 $pending_timeout = 1;
238 }
239 elsif (m/^(# of expected passes|# of unexpected failures|# of expected failures|# of known failures|# of unsupported tests|# of untested testcases)\s+(.*)/)
240 {
241 $res->{"summary - "."$1"} = $2;
242 }
243 elsif (m/^\/.*\/([^\/]+)\s+version\s+(.*)/)
244 {
245 $res->{tool} = $1;
246 $res->{version} = $2;
247 $res->{version} =~ s/ [-(].*//;
248 }
249 }
250 close SUMFILE;
251 return $res;
252}
253
254# Parse list on unstable tests
255sub read_unstable($)
256{
257 my ($unstable_file) = @_;
258 my @unstable_tests = ();
259
260 open UNSTABLEFILE, $unstable_file or die $!;
261 while (<UNSTABLEFILE>)
262 {
263 # Skip lines starting with '#', or with spaces only
264 if ((/^#/) || (/^[ ]*$/))
265 {
266 }
267 else
268 {
269 chomp;
270
271 my $test = $_;
272
273 # Check if line is of type: target:testname
Christophe Lyon5e7241c2015-12-04 12:57:27 +0100274 if (/^(.*?):/)
Christophe Lyonbff39612015-11-18 16:29:11 +0100275 {
276 foreach my $unstable_marker (@unstable_markers)
277 {
278 if ($unstable_marker eq $1) {
279 # If target matches the one supplied as script
280 # argument, add the testname to the list
Christophe Lyon5e7241c2015-12-04 12:57:27 +0100281 $test =~ s/.*?://;
Christophe Lyonbff39612015-11-18 16:29:11 +0100282 push @unstable_tests, $test;
283 }
284 }
285 } else {
286 push @unstable_tests, $test;
287 }
288 }
289 }
290 close UNSTABLEFILE;
291 return @unstable_tests;
292}
293
294######################################################
295# DIFFING
296sub handle_pass_fail($$$$)
297{
298 my ($ref, $res, $diag_diag, $tc) = @_;
299 if ($res->{testcases}->{$tc}->{HAS_TIMED_OUT})
300 {
301 push @{$res->{$PASSED_NOW_TIMEOUTS}}, $tc;
302 }
303 else
304 {
305 push @{$res->{$PASSED_NOW_FAILS}}, $tc;
306 }
307}
308
309sub compare_results($$)
310{
311 my ($ref, $res) = @_;
312
313 @{$res->{$STILL_PASSES}} = ();
314 @{$res->{$STILL_FAILS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100315 @{$res->{$STILL_XPASS}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100316 @{$res->{$PASSED_NOW_FAILS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100317 @{$res->{$XPASS_NOW_FAIL}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100318 @{$res->{$PASS_DISAPPEARS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100319 @{$res->{$XPASS_DISAPPEARS}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100320 @{$res->{$FAIL_APPEARS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100321 @{$res->{$XPASS_APPEARS}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100322 @{$res->{$NEW_PASSES}} = ();
323 @{$res->{$FAIL_DISAPPEARS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100324 @{$res->{$XFAIL_DISAPPEARS}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100325 @{$res->{$XFAIL_APPEARS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100326 @{$res->{$FAIL_NOW_XFAIL}} = ();
327 @{$res->{$PASS_NOW_XFAIL}} = ();
328 @{$res->{$XPASS_NOW_XFAIL}} = ();
329 @{$res->{$XPASS_APPEARS}} = ();
330 @{$res->{$PASS_NOW_XPASS}} = ();
331 @{$res->{$XPASS_NOW_PASSES}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100332 @{$res->{$XFAIL_NOW_PASSES}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100333 @{$res->{$XFAIL_NOW_XPASS}} = ();
334 @{$res->{$XFAIL_NOW_FAIL}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100335 @{$res->{$FAIL_NOW_PASSES}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100336 @{$res->{$FAIL_NOW_XPASS}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100337 @{$res->{$PASSED_NOW_TIMEOUTS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100338 @{$res->{$UNSUPPORTED_PASS}} = ();
339 @{$res->{$UNSUPPORTED_XPASS}} = ();
340 @{$res->{$UNSUPPORTED_FAIL}} = ();
341 @{$res->{$UNSUPPORTED_XFAIL}} = ();
342 @{$res->{$UNSUPPORTED_DISAPPEARS}} = ();
Christophe Lyondc66fc52016-04-05 17:38:07 +0200343 @{$res->{$UNSUPPORTED_APPEARS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100344 @{$res->{$UNTESTED_PASS}} = ();
345 @{$res->{$UNTESTED_XPASS}} = ();
346 @{$res->{$UNTESTED_FAIL}} = ();
347 @{$res->{$UNTESTED_XFAIL}} = ();
348 @{$res->{$UNTESTED_DISAPPEARS}} = ();
Christophe Lyondc66fc52016-04-05 17:38:07 +0200349 @{$res->{$UNTESTED_APPEARS}} = ();
Christophe Lyona140aa82015-12-17 22:53:03 +0100350 @{$res->{$UNRESOLVED_PASS}} = ();
351 @{$res->{$UNRESOLVED_XPASS}} = ();
352 @{$res->{$UNRESOLVED_FAIL}} = ();
353 @{$res->{$UNRESOLVED_XFAIL}} = ();
354 @{$res->{$UNRESOLVED_DISAPPEARS}} = ();
Christophe Lyondc66fc52016-04-05 17:38:07 +0200355 @{$res->{$UNRESOLVED_APPEARS}} = ();
Christophe Lyonbff39612015-11-18 16:29:11 +0100356 @{$res->{$UNHANDLED_CASES}} = ();
357 @{$res->{$UNSTABLE_CASES}} = ();
358
359 #### MERGE REF AND RES
360 foreach my $key (sort (keys %{$res->{testcases}}))
361 {
362 if (not exists $ref->{testcases}->{$key}) {
363 $ref->{testcases}->{$key} = empty_result();
364 $ref->{testcases}->{$key}->{NO_EXIST} = 1;
365 }
366 }
367 foreach my $key (keys %{$ref->{testcases}})
368 {
369 if (not exists $res->{testcases}->{$key})
370 {
371 $res->{testcases}->{$key} = empty_result();
372 $res->{testcases}->{$key}->{NO_EXIST} = 1;
373 }
374 }
375
376 #### ACTIONS FOR EACH CASES
377 my %unstable_found;
378
379 foreach my $key (sort (keys %{$ref->{testcases}}))
380 {
381 foreach my $diag_diag (@handler_list)
382 {
383 if ($ref->{testcases}->{$key}->{$diag_diag->{was}} != $res->{testcases}->{$key}->{$diag_diag->{was}}
384 and $res->{testcases}->{$key}->{$diag_diag->{is}})
385 {
Christophe Lyondc66fc52016-04-05 17:38:07 +0200386 print "$key ref was:$ref->{testcases}->{$key}->{$diag_diag->{was}}, res was:$res->{testcases}->{$key}->{$diag_diag->{was}}, res is:$res->{testcases}->{$key}->{$diag_diag->{is}} \n" if ($debug);
Christophe Lyonbff39612015-11-18 16:29:11 +0100387 # If testcase is listed as 'unstable' mark it as
388 # such and skip other processing.
389 {
390 if (grep { (index $key,$_)!=-1} @unstablelist)
391 {
392 print "[unstable] $key\n" if ($debug);
393 $unstable_found{$key}=1;
394 }
395 else {
396 print "[$diag_diag->{was} => $diag_diag->{is}] $key\n" if ($debug);
397 if ($diag_diag->{handler})
398 {
399 $diag_diag->{handler} ($ref, $res, $diag_diag, $key);
400 }
401 else
402 {
403 push @{$res->{$diag_diag->{cat}}}, $key;
404 }
405 }
406 }
407 }
408 }
409 }
410 push @{$res->{$UNSTABLE_CASES}}, (sort (keys (%unstable_found))) if ($nounstable == 0);
411
412}
413
414######################################################
415# PRINTING
416sub print_tclist($@)
417{
418 my ($cat, @tclist) = @_;
419 print " - ".$cat.":\n\n ". join("\n ",@tclist) . "\n\n" if (scalar(@tclist));
420}
421
422sub print_compare_results_summary($$)
423{
424 my ($ref, $res) = @_;
425 my $return_value=0;
Christophe Lyonf5aeb342015-12-08 14:47:16 +0100426 my $total_better = 0;
Christophe Lyonbff39612015-11-18 16:29:11 +0100427 my $rtotal = 0;
428 my $quiet_reg = $quiet;
Christophe Lyond618f662016-02-02 19:07:58 +0100429 my $ref_ratio = 0;
Christophe Lyon0ab7d352016-04-06 10:39:58 +0200430 my $ref_total = 0;
Christophe Lyond618f662016-02-02 19:07:58 +0100431 my $res_ratio = 0;
Christophe Lyon0ab7d352016-04-06 10:39:58 +0200432 my $res_total = 0;
Christophe Lyond618f662016-02-02 19:07:58 +0100433 my $ratio_thresh = 0.95; # Warn if pass ratio is below this threshold
Christophe Lyonad8c7242016-02-03 13:04:28 +0100434 my $ignore_exec = 0;
435 my $ref_has_exec_tests = 0;
436 my $res_has_exec_tests = 0;
Christophe Lyond618f662016-02-02 19:07:58 +0100437
438 # Compute the pass ratio as a sanity check
Christophe Lyon0ab7d352016-04-06 10:39:58 +0200439 $ref_total = $ref->{PASS} +
440 $ref->{XFAIL} +
441 $ref->{XPASS} +
442 $ref->{FAIL} +
443 $ref->{UNRESOLVED} +
444 $ref->{UNSUPPORTED} +
445 $ref->{UNTESTED};
446
447 # It is possible that no test is executed at all (for instance if
448 # RUNTESTFLAGS was too restrictive). Avoid division by 0.
449 if ($ref_total > 0) {
450 $ref_ratio = ($ref->{PASS} + $ref->{XFAIL}) /
451 $ref_total;
452 }
453
454 $res_total = $res->{PASS} +
455 $res->{XFAIL} +
456 $res->{XPASS} +
457 $res->{FAIL} +
458 $res->{UNRESOLVED} +
459 $res->{UNSUPPORTED} +
460 $res->{UNTESTED};
461
462 if ($res_total > 0) {
463 $res_ratio = ($res->{PASS} + $res->{XFAIL}) /
464 $res_total;
465 }
Christophe Lyonbff39612015-11-18 16:29:11 +0100466
467 if (not $quiet)
468 {
469 printf "Comparing:\n";
470 printf "REFERENCE:$ref_file_name\n";
471 printf "CURRENT: $res_file_name\n\n";
472 }
473
474 #### TESTS STATUS
475 if (not $quiet and not $short)
476 {
477 printf " ` +---------+---------+\n";
Christophe Lyona140aa82015-12-17 22:53:03 +0100478 printf "o RUN STATUS: | REF | RES |\n";
Christophe Lyonbff39612015-11-18 16:29:11 +0100479 printf " +------------------------------------------+---------+---------+\n";
Christophe Lyona140aa82015-12-17 22:53:03 +0100480 printf " | %-40s | %7d | %7d |\n", "Passes [PASS]", $ref->{PASS}, $res->{PASS};
Christophe Lyonbff39612015-11-18 16:29:11 +0100481 printf " | %-40s | %7d | %7d |\n", "Unexpected fails [FAIL]", $ref->{FAIL}, $res->{FAIL};
Christophe Lyona140aa82015-12-17 22:53:03 +0100482 printf " | %-40s | %7d | %7d |\n", "Unexpected passes [XPASS]", $ref->{XPASS}, $res->{XPASS};
Christophe Lyonbff39612015-11-18 16:29:11 +0100483 printf " | %-40s | %7d | %7d |\n", "Expected fails [XFAIL]", $ref->{XFAIL}, $res->{XFAIL};
484 printf " | %-40s | %7d | %7d |\n", "Unresolved [UNRESOLVED]", $ref->{UNRESOLVED}, $res->{UNRESOLVED};
Christophe Lyona140aa82015-12-17 22:53:03 +0100485 printf " | %-40s | %7d | %7d |\n", "Unsupported [UNSUPPORTED]", $ref->{UNSUPPORTED}, $res->{UNSUPPORTED};
486 printf " | %-40s | %7d | %7d |\n", "Untested [UNTESTED]", $ref->{UNTESTED}, $res->{UNTESTED};
Christophe Lyonbff39612015-11-18 16:29:11 +0100487 printf " +------------------------------------------+---------+---------+\n";
488 printf "\n";
Christophe Lyond618f662016-02-02 19:07:58 +0100489
Christophe Lyon3d195c22016-04-06 16:00:25 +0200490 printf " REF PASS ratio: %f\n", $ref_ratio;
491 printf " RES PASS ratio: %f\n", $res_ratio;
Christophe Lyond618f662016-02-02 19:07:58 +0100492 if ($ref_ratio < $ratio_thresh)
493 {
Christophe Lyon1176f962016-03-03 18:01:10 +0100494 printf " ***** ERROR: REF PASS ratio is abnormally low *****\n";
Christophe Lyond618f662016-02-02 19:07:58 +0100495 }
496 if ($res_ratio < $ratio_thresh)
497 {
Christophe Lyon1176f962016-03-03 18:01:10 +0100498 printf " ***** ERROR: RES PASS ratio is abnormally low *****\n";
Christophe Lyond618f662016-02-02 19:07:58 +0100499 }
500
Christophe Lyonad8c7242016-02-03 13:04:28 +0100501 # If both PASS and FAIL EXEC tests are zero, assume there is no
502 # execution test for this tool, and do not warn.
503 $ref_has_exec_tests = ($ref->{EXEC}->{PASS} + $ref->{EXEC}->{FAIL}) != 0;
504 if ($ref_has_exec_tests)
505 {
506 printf " ***** ERROR: No REF execution test PASSed. Check execution engine configuration. *****\n" if ($ref->{EXEC}->{PASS} == 0);
507 printf " ***** WARNING: No REF execution test FAILed. Check execution engine configuration. *****\n" if ($ref->{EXEC}->{FAIL} == 0);
508 }
509
510 $res_has_exec_tests = ($res->{EXEC}->{PASS} + $res->{EXEC}->{FAIL}) != 0;
511 if ($res_has_exec_tests)
512 {
513 printf " ***** ERROR: No RES execution test PASSed. Check execution engine configuration. *****\n" if ($res->{EXEC}->{PASS} == 0);
514 printf " ***** WARNING: No RES execution test FAILed. Check execution engine configuration. *****\n" if ($res->{EXEC}->{FAIL} == 0);
515 }
516
517 # Ignore number of execution tests when computing the return
518 # value, if both REF and RES have no execution test.
519 $ignore_exec = !$ref_has_exec_tests && !$res_has_exec_tests;
Christophe Lyonbff39612015-11-18 16:29:11 +0100520 }
521
522 #### REGRESSIONS ?
Christophe Lyona140aa82015-12-17 22:53:03 +0100523 $rtotal = scalar(@{$res->{$PASSED_NOW_FAILS}})
524 +scalar(@{$res->{$XPASS_NOW_FAIL}})
525 +scalar(@{$res->{$PASS_DISAPPEARS}})
526 +scalar(@{$res->{$XPASS_DISAPPEARS}})
527 +scalar(@{$res->{$FAIL_APPEARS}})
528 +scalar(@{$res->{$XPASS_APPEARS}})
529 +scalar(@{$res->{$PASS_NOW_XPASS}})
530 +scalar(@{$res->{$XFAIL_NOW_FAIL}})
531 +scalar(@{$res->{$XFAIL_DISAPPEARS}})
532 +scalar(@{$res->{$UNSUPPORTED_FAIL}})
533 +scalar(@{$res->{$UNSUPPORTED_XPASS}})
534 +scalar(@{$res->{$UNTESTED_FAIL}})
535 +scalar(@{$res->{$UNTESTED_XPASS}})
536 +scalar(@{$res->{$UNRESOLVED_FAIL}})
537 +scalar(@{$res->{$UNRESOLVED_XPASS}})
Christophe Lyondc66fc52016-04-05 17:38:07 +0200538 +scalar(@{$res->{$UNRESOLVED_APPEARS}})
Christophe Lyona140aa82015-12-17 22:53:03 +0100539 +scalar(@{$res->{$PASSED_NOW_TIMEOUTS}});
540
541 $quiet_reg=1 if ($short and not $rtotal);
Christophe Lyonbff39612015-11-18 16:29:11 +0100542
543 if (not $quiet_reg)
544 {
Christophe Lyona140aa82015-12-17 22:53:03 +0100545 printf "\n$col_red"."o REGRESSIONS:\n";
Christophe Lyonbff39612015-11-18 16:29:11 +0100546 printf " +------------------------------------------+---------+\n";
547 printf " | %-40s | %7d |\n", $PASSED_NOW_FAILS, scalar(@{$res->{$PASSED_NOW_FAILS}}) if (scalar(@{$res->{$PASSED_NOW_FAILS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100548 printf " | %-40s | %7d |\n", $XPASS_NOW_FAIL, scalar(@{$res->{$XPASS_NOW_FAIL}}) if (scalar(@{$res->{$XPASS_NOW_FAIL}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100549 printf " | %-40s | %7d |\n", $PASS_DISAPPEARS, scalar(@{$res->{$PASS_DISAPPEARS}}) if (scalar(@{$res->{$PASS_DISAPPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100550 printf " | %-40s | %7d |\n", $XPASS_DISAPPEARS, scalar(@{$res->{$XPASS_DISAPPEARS}}) if (scalar(@{$res->{$XPASS_DISAPPEARS}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100551 printf " | %-40s | %7d |\n", $FAIL_APPEARS, scalar(@{$res->{$FAIL_APPEARS}}) if (scalar(@{$res->{$FAIL_APPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100552 printf " | %-40s | %7d |\n", $XPASS_APPEARS, scalar(@{$res->{$XPASS_APPEARS}}) if (scalar(@{$res->{$XPASS_APPEARS}}));
553 printf " | %-40s | %7d |\n", $PASS_NOW_XPASS, scalar(@{$res->{$PASS_NOW_XPASS}}) if (scalar(@{$res->{$PASS_NOW_XPASS}}));
554 printf " | %-40s | %7d |\n", $XFAIL_NOW_FAIL, scalar(@{$res->{$XFAIL_NOW_FAIL}}) if (scalar(@{$res->{$XFAIL_NOW_FAIL}}));
555 printf " | %-40s | %7d |\n", $XFAIL_DISAPPEARS, scalar(@{$res->{$XFAIL_DISAPPEARS}}) if (scalar(@{$res->{$XFAIL_DISAPPEARS}}));
556 printf " | %-40s | %7d |\n", $UNSUPPORTED_FAIL, scalar(@{$res->{$UNSUPPORTED_FAIL}}) if (scalar(@{$res->{$UNSUPPORTED_FAIL}}));
557 printf " | %-40s | %7d |\n", $UNSUPPORTED_XPASS, scalar(@{$res->{$UNSUPPORTED_XPASS}}) if (scalar(@{$res->{$UNSUPPORTED_XPASS}}));
558 printf " | %-40s | %7d |\n", $UNTESTED_FAIL, scalar(@{$res->{$UNTESTED_FAIL}}) if (scalar(@{$res->{$UNTESTED_FAIL}}));
559 printf " | %-40s | %7d |\n", $UNTESTED_XPASS, scalar(@{$res->{$UNTESTED_XPASS}}) if (scalar(@{$res->{$UNTESTED_XPASS}}));
560 printf " | %-40s | %7d |\n", $UNRESOLVED_FAIL, scalar(@{$res->{$UNRESOLVED_FAIL}}) if (scalar(@{$res->{$UNRESOLVED_FAIL}}));
561 printf " | %-40s | %7d |\n", $UNRESOLVED_XPASS, scalar(@{$res->{$UNRESOLVED_XPASS}}) if (scalar(@{$res->{$UNRESOLVED_XPASS}}));
Christophe Lyondc66fc52016-04-05 17:38:07 +0200562 printf " | %-40s | %7d |\n", $UNRESOLVED_APPEARS, scalar(@{$res->{$UNRESOLVED_APPEARS}}) if (scalar(@{$res->{$UNRESOLVED_APPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100563 printf " | %-40s | %7d |\n", $PASSED_NOW_TIMEOUTS, scalar(@{$res->{$PASSED_NOW_TIMEOUTS}}) if (scalar(@{$res->{$PASSED_NOW_TIMEOUTS}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100564 printf " +------------------------------------------+---------+\n";
565 printf " | %-40s | %7d |\n", "TOTAL_REGRESSIONS", $rtotal;
566 printf " +------------------------------------------+---------+\n";
567 printf "\n";
568
569 if ($long)
570 {
571 print_tclist($PASSED_NOW_FAILS, @{$res->{$PASSED_NOW_FAILS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100572 print_tclist($XPASS_NOW_FAIL, @{$res->{$XPASS_NOW_FAIL}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100573 print_tclist($PASS_DISAPPEARS, @{$res->{$PASS_DISAPPEARS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100574 print_tclist($XPASS_DISAPPEARS, @{$res->{$XPASS_DISAPPEARS}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100575 print_tclist($FAIL_APPEARS, @{$res->{$FAIL_APPEARS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100576 print_tclist($XPASS_APPEARS, @{$res->{$XPASS_APPEARS}});
577 print_tclist($PASS_NOW_XPASS, @{$res->{$PASS_NOW_XPASS}});
578 print_tclist($XFAIL_NOW_FAIL, @{$res->{$XFAIL_NOW_FAIL}});
579 print_tclist($XFAIL_DISAPPEARS, @{$res->{$XFAIL_DISAPPEARS}});
580 print_tclist($UNSUPPORTED_FAIL, @{$res->{$UNSUPPORTED_FAIL}});
581 print_tclist($UNSUPPORTED_XPASS, @{$res->{$UNSUPPORTED_XPASS}});
582 print_tclist($UNTESTED_FAIL, @{$res->{$UNTESTED_FAIL}});
583 print_tclist($UNTESTED_XPASS, @{$res->{$UNTESTED_XPASS}});
584 print_tclist($UNRESOLVED_FAIL, @{$res->{$UNRESOLVED_FAIL}});
585 print_tclist($UNRESOLVED_XPASS, @{$res->{$UNRESOLVED_XPASS}});
Christophe Lyondc66fc52016-04-05 17:38:07 +0200586 print_tclist($UNRESOLVED_APPEARS, @{$res->{$UNRESOLVED_APPEARS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100587 print_tclist($PASSED_NOW_TIMEOUTS, @{$res->{$PASSED_NOW_TIMEOUTS}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100588 }
589 printf "$col_reset\n";
590 }
591
592 #### MINOR TO BE CHECKED ?
593 if (not $quiet and not $short)
594 {
Christophe Lyona140aa82015-12-17 22:53:03 +0100595 $total_better = scalar(@{$res->{$XPASS_NOW_PASSES}})+
596 scalar(@{$res->{$XFAIL_NOW_PASSES}})+
597 scalar(@{$res->{$XFAIL_NOW_XPASS}})+
Christophe Lyonbff39612015-11-18 16:29:11 +0100598 scalar(@{$res->{$FAIL_NOW_PASSES}})+
Christophe Lyona140aa82015-12-17 22:53:03 +0100599 scalar(@{$res->{$FAIL_NOW_XPASS}})+
Christophe Lyonbff39612015-11-18 16:29:11 +0100600 scalar(@{$res->{$NEW_PASSES}})+
601 scalar(@{$res->{$FAIL_DISAPPEARS}})+
602 scalar(@{$res->{$XFAIL_APPEARS}})+
Christophe Lyona140aa82015-12-17 22:53:03 +0100603 scalar(@{$res->{$FAIL_NOW_XFAIL}})+
604 scalar(@{$res->{$PASS_NOW_XFAIL}})+
605 scalar(@{$res->{$XPASS_NOW_XFAIL}})+
606 scalar(@{$res->{$UNSUPPORTED_PASS}})+
607 scalar(@{$res->{$UNSUPPORTED_XFAIL}})+
608 scalar(@{$res->{$UNSUPPORTED_DISAPPEARS}})+
Christophe Lyondc66fc52016-04-05 17:38:07 +0200609 scalar(@{$res->{$UNSUPPORTED_APPEARS}})+
Christophe Lyona140aa82015-12-17 22:53:03 +0100610 scalar(@{$res->{$UNTESTED_PASS}})+
611 scalar(@{$res->{$UNTESTED_XFAIL}})+
612 scalar(@{$res->{$UNTESTED_DISAPPEARS}})+
Christophe Lyondc66fc52016-04-05 17:38:07 +0200613 scalar(@{$res->{$UNTESTED_APPEARS}})+
Christophe Lyona140aa82015-12-17 22:53:03 +0100614 scalar(@{$res->{$UNRESOLVED_PASS}})+
615 scalar(@{$res->{$UNRESOLVED_XFAIL}})+
616 scalar(@{$res->{$UNRESOLVED_DISAPPEARS}})+
Christophe Lyonf5aeb342015-12-08 14:47:16 +0100617 scalar(@{$res->{$UNHANDLED_CASES}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100618
Christophe Lyona140aa82015-12-17 22:53:03 +0100619 printf "$col_pink"."o MINOR TO BE CHECKED:\n";
Christophe Lyonbff39612015-11-18 16:29:11 +0100620 printf " +------------------------------------------+---------+\n";
621 printf " | %-40s | %7d |\n", $XFAIL_APPEARS, scalar(@{$res->{$XFAIL_APPEARS}}) if (scalar(@{$res->{$XFAIL_APPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100622 printf " | %-40s | %7d |\n", $FAIL_NOW_XFAIL, scalar(@{$res->{$FAIL_NOW_XFAIL}}) if (scalar(@{$res->{$FAIL_NOW_XFAIL}}));
623 printf " | %-40s | %7d |\n", $PASS_NOW_XFAIL, scalar(@{$res->{$PASS_NOW_XFAIL}}) if (scalar(@{$res->{$PASS_NOW_XFAIL}}));
624 printf " | %-40s | %7d |\n", $XPASS_NOW_XFAIL, scalar(@{$res->{$XPASS_NOW_XFAIL}}) if (scalar(@{$res->{$XPASS_NOW_XFAIL}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100625 printf " | %-40s | %7d |\n", $FAIL_DISAPPEARS, scalar(@{$res->{$FAIL_DISAPPEARS}}) if (scalar(@{$res->{$FAIL_DISAPPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100626 printf " | %-40s | %7d |\n", $XPASS_NOW_PASSES, scalar(@{$res->{$XPASS_NOW_PASSES}}) if (scalar(@{$res->{$XPASS_NOW_PASSES}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100627 printf " | %-40s | %7d |\n", $XFAIL_NOW_PASSES, scalar(@{$res->{$XFAIL_NOW_PASSES}}) if (scalar(@{$res->{$XFAIL_NOW_PASSES}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100628 printf " | %-40s | %7d |\n", $XFAIL_NOW_XPASS, scalar(@{$res->{$XFAIL_NOW_XPASS}}) if (scalar(@{$res->{$XFAIL_NOW_XPASS}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100629 printf " | %-40s | %7d |\n", $FAIL_NOW_PASSES, scalar(@{$res->{$FAIL_NOW_PASSES}}) if (scalar(@{$res->{$FAIL_NOW_PASSES}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100630 printf " | %-40s | %7d |\n", $FAIL_NOW_XPASS, scalar(@{$res->{$FAIL_NOW_XPASS}}) if (scalar(@{$res->{$FAIL_NOW_XPASS}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100631 printf " | %-40s | %7d |\n", $NEW_PASSES, scalar(@{$res->{$NEW_PASSES}}) if (scalar(@{$res->{$NEW_PASSES}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100632 printf " | %-40s | %7d |\n", $UNSUPPORTED_PASS, scalar(@{$res->{$UNSUPPORTED_PASS}}) if (scalar(@{$res->{$UNSUPPORTED_PASS}}));
633 printf " | %-40s | %7d |\n", $UNSUPPORTED_XFAIL, scalar(@{$res->{$UNSUPPORTED_XFAIL}}) if (scalar(@{$res->{$UNSUPPORTED_XFAIL}}));
634 printf " | %-40s | %7d |\n", $UNSUPPORTED_DISAPPEARS, scalar(@{$res->{$UNSUPPORTED_DISAPPEARS}}) if (scalar(@{$res->{$UNSUPPORTED_DISAPPEARS}}));
Christophe Lyondc66fc52016-04-05 17:38:07 +0200635 printf " | %-40s | %7d |\n", $UNSUPPORTED_APPEARS, scalar(@{$res->{$UNSUPPORTED_APPEARS}}) if (scalar(@{$res->{$UNSUPPORTED_APPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100636 printf " | %-40s | %7d |\n", $UNTESTED_PASS, scalar(@{$res->{$UNTESTED_PASS}}) if (scalar(@{$res->{$UNTESTED_PASS}}));
637 printf " | %-40s | %7d |\n", $UNTESTED_XFAIL, scalar(@{$res->{$UNTESTED_XFAIL}}) if (scalar(@{$res->{$UNTESTED_XFAIL}}));
638 printf " | %-40s | %7d |\n", $UNTESTED_DISAPPEARS, scalar(@{$res->{$UNTESTED_DISAPPEARS}}) if (scalar(@{$res->{$UNTESTED_DISAPPEARS}}));
Christophe Lyondc66fc52016-04-05 17:38:07 +0200639 printf " | %-40s | %7d |\n", $UNTESTED_APPEARS, scalar(@{$res->{$UNTESTED_APPEARS}}) if (scalar(@{$res->{$UNTESTED_APPEARS}}));
Christophe Lyona140aa82015-12-17 22:53:03 +0100640 printf " | %-40s | %7d |\n", $UNRESOLVED_PASS, scalar(@{$res->{$UNRESOLVED_PASS}}) if (scalar(@{$res->{$UNRESOLVED_PASS}}));
641 printf " | %-40s | %7d |\n", $UNRESOLVED_XFAIL, scalar(@{$res->{$UNRESOLVED_XFAIL}}) if (scalar(@{$res->{$UNRESOLVED_XFAIL}}));
642 printf " | %-40s | %7d |\n", $UNRESOLVED_DISAPPEARS, scalar(@{$res->{$UNRESOLVED_DISAPPEARS}}) if (scalar(@{$res->{$UNRESOLVED_DISAPPEARS}}));
Christophe Lyonbff39612015-11-18 16:29:11 +0100643 printf " | %-40s | %7d |\n", $UNHANDLED_CASES, scalar(@{$res->{$UNHANDLED_CASES}}) if (scalar(@{$res->{$UNHANDLED_CASES}}));
644 printf " | %-40s | %7d |\n", $UNSTABLE_CASES, scalar(@{$res->{$UNSTABLE_CASES}}) if (scalar(@{$res->{$UNSTABLE_CASES}}));
645 printf " +------------------------------------------+---------+\n";
Christophe Lyonf5aeb342015-12-08 14:47:16 +0100646 printf " | %-40s | %7d |\n", "TOTAL_MINOR_TO_BE_CHECKED", $total_better + scalar(@{$res->{$UNSTABLE_CASES}});;
Christophe Lyonbff39612015-11-18 16:29:11 +0100647 printf " +------------------------------------------+---------+\n";
648 printf "\n";
649
650 if ($long)
651 {
Christophe Lyona140aa82015-12-17 22:53:03 +0100652 print_tclist($XPASS_NOW_PASSES, @{$res->{$XPASS_NOW_PASSES}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100653 print_tclist($XFAIL_NOW_PASSES, @{$res->{$XFAIL_NOW_PASSES}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100654 print_tclist($XFAIL_NOW_XPASS, @{$res->{$XFAIL_NOW_XPASS}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100655 print_tclist($FAIL_NOW_PASSES, @{$res->{$FAIL_NOW_PASSES}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100656 print_tclist($FAIL_NOW_XPASS, @{$res->{$FAIL_NOW_XPASS}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100657 print_tclist($FAIL_DISAPPEARS, @{$res->{$FAIL_DISAPPEARS}});
658 print_tclist($XFAIL_APPEARS, @{$res->{$XFAIL_APPEARS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100659 print_tclist($FAIL_NOW_XFAIL, @{$res->{$FAIL_NOW_XFAIL}});
660 print_tclist($PASS_NOW_XFAIL, @{$res->{$PASS_NOW_XFAIL}});
661 print_tclist($XPASS_NOW_XFAIL, @{$res->{$XPASS_NOW_XFAIL}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100662 print_tclist($UNHANDLED_CASES, @{$res->{$UNHANDLED_CASES}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100663 print_tclist($UNSUPPORTED_PASS, @{$res->{$UNSUPPORTED_PASS}});
664 print_tclist($UNSUPPORTED_XFAIL, @{$res->{$UNSUPPORTED_XFAIL}});
665 print_tclist($UNSUPPORTED_DISAPPEARS, @{$res->{$UNSUPPORTED_DISAPPEARS}});
Christophe Lyondc66fc52016-04-05 17:38:07 +0200666 print_tclist($UNSUPPORTED_APPEARS, @{$res->{$UNSUPPORTED_APPEARS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100667 print_tclist($UNTESTED_PASS, @{$res->{$UNTESTED_PASS}});
668 print_tclist($UNTESTED_XFAIL, @{$res->{$UNTESTED_XFAIL}});
669 print_tclist($UNTESTED_DISAPPEARS, @{$res->{$UNTESTED_DISAPPEARS}});
Christophe Lyondc66fc52016-04-05 17:38:07 +0200670 print_tclist($UNTESTED_APPEARS, @{$res->{$UNTESTED_APPEARS}});
Christophe Lyona140aa82015-12-17 22:53:03 +0100671 print_tclist($UNRESOLVED_PASS, @{$res->{$UNRESOLVED_PASS}});
672 print_tclist($UNRESOLVED_XFAIL, @{$res->{$UNRESOLVED_XFAIL}});
673 print_tclist($UNRESOLVED_DISAPPEARS, @{$res->{$UNRESOLVED_DISAPPEARS}});
Christophe Lyonbff39612015-11-18 16:29:11 +0100674 print_tclist($UNSTABLE_CASES, @{$res->{$UNSTABLE_CASES}});
675 print_tclist($NEW_PASSES, @{$res->{$NEW_PASSES}});
676 }
677 printf "$col_reset\n";
678 }
679
Christophe Lyonf5aeb342015-12-08 14:47:16 +0100680 $return_value = 1 if ($total_better);
Christophe Lyonbff39612015-11-18 16:29:11 +0100681
682 $return_value = 2 if ($rtotal);
683
Christophe Lyond618f662016-02-02 19:07:58 +0100684 # Error if there was no PASS (eg when sth went wrong and no .sum was generated)
685 $return_value = 2 if (($res->{PASS} + $res->{XFAIL}) == 0);
686
687 # Error if every test passed, or the ratio was too low. This
688 # generally means the simulator is not configured well.
689 $return_value = 2 if (($ref_ratio == 100) || ($ref_ratio < $ratio_thresh));
690 $return_value = 2 if (($res_ratio == 100) || ($res_ratio < $ratio_thresh));
Christophe Lyonbff39612015-11-18 16:29:11 +0100691
Christophe Lyonad8c7242016-02-03 13:04:28 +0100692 # Error if no execution test passed.
693 # It is possible that no execution test fails, though.
694 $return_value = 2 if (($ignore_exec == 0)
695 && (($ref->{EXEC}->{PASS} == 0)
696 || ($res->{EXEC}->{PASS} == 0)));
697
Christophe Lyonbff39612015-11-18 16:29:11 +0100698 return $return_value;
699}