xref: /dflybsd-src/test/libpthread/verify (revision 624815385bcf105ef0d61ce7430127aa835132e7)
1*e5a92d33SSascha Wildner#!/usr/bin/env perl -w
2*e5a92d33SSascha Wildner#-*-mode:perl-*-
3*e5a92d33SSascha Wildner#############################################################################
4*e5a92d33SSascha Wildner#
5*e5a92d33SSascha Wildner# Copyright (C) 1999-2001 Jason Evans <jasone@freebsd.org>.
6*e5a92d33SSascha Wildner# All rights reserved.
7*e5a92d33SSascha Wildner#
8*e5a92d33SSascha Wildner# Redistribution and use in source and binary forms, with or without
9*e5a92d33SSascha Wildner# modification, are permitted provided that the following conditions
10*e5a92d33SSascha Wildner# are met:
11*e5a92d33SSascha Wildner# 1. Redistributions of source code must retain the above copyright
12*e5a92d33SSascha Wildner#    notice(s), this list of conditions and the following disclaimer as
13*e5a92d33SSascha Wildner#    the first lines of this file unmodified other than the possible
14*e5a92d33SSascha Wildner#    addition of one or more copyright notices.
15*e5a92d33SSascha Wildner# 2. Redistributions in binary form must reproduce the above copyright
16*e5a92d33SSascha Wildner#    notice(s), this list of conditions and the following disclaimer in
17*e5a92d33SSascha Wildner#    the documentation and/or other materials provided with the
18*e5a92d33SSascha Wildner#    distribution.
19*e5a92d33SSascha Wildner#
20*e5a92d33SSascha Wildner# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
21*e5a92d33SSascha Wildner# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22*e5a92d33SSascha Wildner# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*e5a92d33SSascha Wildner# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
24*e5a92d33SSascha Wildner# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25*e5a92d33SSascha Wildner# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26*e5a92d33SSascha Wildner# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
27*e5a92d33SSascha Wildner# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*e5a92d33SSascha Wildner# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29*e5a92d33SSascha Wildner# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*e5a92d33SSascha Wildner# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*e5a92d33SSascha Wildner#
32*e5a92d33SSascha Wildner#############################################################################
33*e5a92d33SSascha Wildner#
34*e5a92d33SSascha Wildner# Test harness.
35*e5a92d33SSascha Wildner#
36*e5a92d33SSascha Wildner# $FreeBSD: src/lib/libc_r/test/verify,v 1.1.2.2 2001/06/22 21:44:27 jasone Exp $
37*e5a92d33SSascha Wildner#
38*e5a92d33SSascha Wildner#############################################################################
39*e5a92d33SSascha Wildner
40*e5a92d33SSascha Wildner# Shut off buffering.
41*e5a92d33SSascha Wildnerselect(STDOUT);
42*e5a92d33SSascha Wildner$| = 1;
43*e5a92d33SSascha Wildner
44*e5a92d33SSascha Wildner#
45*e5a92d33SSascha Wildner# Parse command-line arguments.
46*e5a92d33SSascha Wildner#
47*e5a92d33SSascha Wildneruse Getopt::Long;
48*e5a92d33SSascha WildnerGetopt::Long::config("bundling"); # Allow -hv rather than forcing -h -v.
49*e5a92d33SSascha Wildner
50*e5a92d33SSascha Wildner# Set option defaults for optional arguments.
51*e5a92d33SSascha Wildner$opt_help = 0;
52*e5a92d33SSascha Wildner$opt_verbose = 0;
53*e5a92d33SSascha Wildner$opt_quiet = 0;
54*e5a92d33SSascha Wildner$opt_srcdir = ".";
55*e5a92d33SSascha Wildner$opt_objdir = ".";
56*e5a92d33SSascha Wildner$opt_ustats = 0;
57*e5a92d33SSascha Wildner$opt_zero = 0;
58*e5a92d33SSascha Wildner
59*e5a92d33SSascha Wildner$opt_retval =
60*e5a92d33SSascha Wildner&GetOptions("h|help" => \$opt_help,
61*e5a92d33SSascha Wildner	    "v|verbose" => \$opt_verbose,
62*e5a92d33SSascha Wildner	    "q|quiet" => \$opt_quiet,
63*e5a92d33SSascha Wildner	    "s|srcdir=s" => \$opt_srcdir,
64*e5a92d33SSascha Wildner            "o|objdir=s" => \$opt_objdir,
65*e5a92d33SSascha Wildner	    "u|ustats" => \$opt_ustats,
66*e5a92d33SSascha Wildner	    "z|zero" => \$opt_zero
67*e5a92d33SSascha Wildner	    );
68*e5a92d33SSascha Wildner
69*e5a92d33SSascha Wildnerif ($opt_help)
70*e5a92d33SSascha Wildner{
71*e5a92d33SSascha Wildner    &usage();
72*e5a92d33SSascha Wildner    exit(0);
73*e5a92d33SSascha Wildner}
74*e5a92d33SSascha Wildner
75*e5a92d33SSascha Wildnerif ($opt_retval == 0)
76*e5a92d33SSascha Wildner{
77*e5a92d33SSascha Wildner    &usage();
78*e5a92d33SSascha Wildner    exit 1;
79*e5a92d33SSascha Wildner}
80*e5a92d33SSascha Wildner
81*e5a92d33SSascha Wildnerif ($opt_verbose && $opt_quiet)
82*e5a92d33SSascha Wildner{
83*e5a92d33SSascha Wildner    print STDERR "-v and -q are incompatible\n";
84*e5a92d33SSascha Wildner    &usage();
85*e5a92d33SSascha Wildner    exit 1;
86*e5a92d33SSascha Wildner}
87*e5a92d33SSascha Wildner
88*e5a92d33SSascha Wildnerif ($#ARGV + 1 == 0)
89*e5a92d33SSascha Wildner{
90*e5a92d33SSascha Wildner    print STDERR "No tests specified\n";
91*e5a92d33SSascha Wildner    &usage();
92*e5a92d33SSascha Wildner    exit 1;
93*e5a92d33SSascha Wildner}
94*e5a92d33SSascha Wildner
95*e5a92d33SSascha Wildnerif ($opt_verbose)
96*e5a92d33SSascha Wildner{
97*e5a92d33SSascha Wildner    print STDERR "Option values: h:$opt_help, v:$opt_verbose, "
98*e5a92d33SSascha Wildner	. "s:\"$opt_srcdir\", o:\"$opt_objdir\" "
99*e5a92d33SSascha Wildner	. "q:$opt_quiet, u:$opt_ustats, z:$opt_zero\n";
100*e5a92d33SSascha Wildner    printf STDERR "Tests (%d total): @ARGV\n", $#ARGV + 1;
101*e5a92d33SSascha Wildner}
102*e5a92d33SSascha Wildner
103*e5a92d33SSascha Wildner#
104*e5a92d33SSascha Wildner# Create and print header.
105*e5a92d33SSascha Wildner#
106*e5a92d33SSascha Wildner@TSTATS =
107*e5a92d33SSascha Wildner(
108*e5a92d33SSascha Wildner "--------------------------------------------------------------------------\n",
109*e5a92d33SSascha Wildner "Test                                      c_user c_system c_total     chng\n",
110*e5a92d33SSascha Wildner " passed/FAILED                            h_user h_system h_total   %% chng\n"
111*e5a92d33SSascha Wildner );
112*e5a92d33SSascha Wildner
113*e5a92d33SSascha Wildnerif (!$opt_quiet)
114*e5a92d33SSascha Wildner{
115*e5a92d33SSascha Wildner    foreach $line (@TSTATS)
116*e5a92d33SSascha Wildner    {
117*e5a92d33SSascha Wildner	printf STDOUT "$line";
118*e5a92d33SSascha Wildner    }
119*e5a92d33SSascha Wildner}
120*e5a92d33SSascha Wildner
121*e5a92d33SSascha Wildner#
122*e5a92d33SSascha Wildner# Run sequence test(s).
123*e5a92d33SSascha Wildner#
124*e5a92d33SSascha Wildner$total_utime = 0.0; # Total user time.
125*e5a92d33SSascha Wildner$total_stime = 0.0; # Total system time.
126*e5a92d33SSascha Wildner$total_hutime = 0.0; # Total historical user time.
127*e5a92d33SSascha Wildner$total_hstime = 0.0; # Total historical system time.
128*e5a92d33SSascha Wildner$total_ntime = 0.0; # Total time for tests that have historical data.
129*e5a92d33SSascha Wildner
130*e5a92d33SSascha Wildnerforeach $test (@ARGV)
131*e5a92d33SSascha Wildner{
132*e5a92d33SSascha Wildner    # Strip out any whitespace in $test.
133*e5a92d33SSascha Wildner    $test =~ s/^\s*(.*)\s*$/$1/;
134*e5a92d33SSascha Wildner
135*e5a92d33SSascha Wildner    $okay = 1;
136*e5a92d33SSascha Wildner
137*e5a92d33SSascha Wildner    if (-e "$opt_srcdir/$test.exp")
138*e5a92d33SSascha Wildner    {
139*e5a92d33SSascha Wildner	# Diff mode.
140*e5a92d33SSascha Wildner
141*e5a92d33SSascha Wildner	($okay, $utime, $stime) = &run_test($test);
142*e5a92d33SSascha Wildner
143*e5a92d33SSascha Wildner	if (-e "$opt_objdir/$test.out")
144*e5a92d33SSascha Wildner	{
145*e5a92d33SSascha Wildner	    `diff $opt_srcdir/$test.exp $opt_objdir/$test.out > $opt_objdir/$test.diff 2>&1`;
146*e5a92d33SSascha Wildner	    if ($?)
147*e5a92d33SSascha Wildner	    {
148*e5a92d33SSascha Wildner		# diff returns non-zero if there is a difference.
149*e5a92d33SSascha Wildner		$okay = 0;
150*e5a92d33SSascha Wildner	    }
151*e5a92d33SSascha Wildner	}
152*e5a92d33SSascha Wildner	else
153*e5a92d33SSascha Wildner	{
154*e5a92d33SSascha Wildner	    $okay = 0;
155*e5a92d33SSascha Wildner	    if ($opt_verbose)
156*e5a92d33SSascha Wildner	    {
157*e5a92d33SSascha Wildner		print STDERR
158*e5a92d33SSascha Wildner		    "Nonexistent output file \"$opt_objdir/$test.out\"\n";
159*e5a92d33SSascha Wildner	    }
160*e5a92d33SSascha Wildner	}
161*e5a92d33SSascha Wildner
162*e5a92d33SSascha Wildner	($hutime, $hstime) = &print_stats($test, $okay, 0, 0, $utime, $stime);
163*e5a92d33SSascha Wildner    }
164*e5a92d33SSascha Wildner    else
165*e5a92d33SSascha Wildner    {
166*e5a92d33SSascha Wildner	# Sequence mode.
167*e5a92d33SSascha Wildner
168*e5a92d33SSascha Wildner	($okay, $utime, $stime) = &run_test($test);
169*e5a92d33SSascha Wildner
170*e5a92d33SSascha Wildner	if (open (STEST_OUT, "<$opt_objdir/$test.out"))
171*e5a92d33SSascha Wildner	{
172*e5a92d33SSascha Wildner	    $num_subtests = 0;
173*e5a92d33SSascha Wildner	    $num_failed_subtests = 0;
174*e5a92d33SSascha Wildner
175*e5a92d33SSascha Wildner	    while (defined($line = <STEST_OUT>))
176*e5a92d33SSascha Wildner	    {
177*e5a92d33SSascha Wildner		if ($line =~ /1\.\.(\d+)/)
178*e5a92d33SSascha Wildner		{
179*e5a92d33SSascha Wildner		    $num_subtests = $1;
180*e5a92d33SSascha Wildner		    last;
181*e5a92d33SSascha Wildner		}
182*e5a92d33SSascha Wildner	    }
183*e5a92d33SSascha Wildner	    if ($num_subtests == 0)
184*e5a92d33SSascha Wildner	    {
185*e5a92d33SSascha Wildner		$okay = 0;
186*e5a92d33SSascha Wildner		if ($opt_verbose)
187*e5a92d33SSascha Wildner		{
188*e5a92d33SSascha Wildner		    print STDERR "Malformed or missing 1..n line\n";
189*e5a92d33SSascha Wildner		}
190*e5a92d33SSascha Wildner	    }
191*e5a92d33SSascha Wildner	    else
192*e5a92d33SSascha Wildner	    {
193*e5a92d33SSascha Wildner		for ($subtest = 1; $subtest <= $num_subtests; $subtest++)
194*e5a92d33SSascha Wildner		{
195*e5a92d33SSascha Wildner		    while (defined($line = <STEST_OUT>))
196*e5a92d33SSascha Wildner		    {
197*e5a92d33SSascha Wildner			if ($line =~ /^not\s+ok\s+(\d+)?/)
198*e5a92d33SSascha Wildner			{
199*e5a92d33SSascha Wildner			    $not = 1;
200*e5a92d33SSascha Wildner			    $test_num = $1;
201*e5a92d33SSascha Wildner			    last;
202*e5a92d33SSascha Wildner			}
203*e5a92d33SSascha Wildner			elsif ($line =~ /^ok\s+(\d+)?/)
204*e5a92d33SSascha Wildner			{
205*e5a92d33SSascha Wildner			    $not = 0;
206*e5a92d33SSascha Wildner			    $test_num = $1;
207*e5a92d33SSascha Wildner			    last;
208*e5a92d33SSascha Wildner			}
209*e5a92d33SSascha Wildner		    }
210*e5a92d33SSascha Wildner		    if (defined($line))
211*e5a92d33SSascha Wildner		    {
212*e5a92d33SSascha Wildner			if (defined($test_num) && ($test_num != $subtest))
213*e5a92d33SSascha Wildner			{
214*e5a92d33SSascha Wildner			    # There was no output printed for one or more tests.
215*e5a92d33SSascha Wildner			    for (; $subtest < $test_num; $subtest++)
216*e5a92d33SSascha Wildner			    {
217*e5a92d33SSascha Wildner				$num_failed_subtests++;
218*e5a92d33SSascha Wildner			    }
219*e5a92d33SSascha Wildner			}
220*e5a92d33SSascha Wildner			if ($not)
221*e5a92d33SSascha Wildner			{
222*e5a92d33SSascha Wildner			    $num_failed_subtests++;
223*e5a92d33SSascha Wildner			}
224*e5a92d33SSascha Wildner		    }
225*e5a92d33SSascha Wildner		    else
226*e5a92d33SSascha Wildner		    {
227*e5a92d33SSascha Wildner			for (; $subtest <= $num_subtests; $subtest++)
228*e5a92d33SSascha Wildner			{
229*e5a92d33SSascha Wildner			    $num_failed_subtests++;
230*e5a92d33SSascha Wildner			}
231*e5a92d33SSascha Wildner		    }
232*e5a92d33SSascha Wildner		}
233*e5a92d33SSascha Wildner
234*e5a92d33SSascha Wildner		if (0 < $num_failed_subtests)
235*e5a92d33SSascha Wildner		{
236*e5a92d33SSascha Wildner		    $okay = 0;
237*e5a92d33SSascha Wildner		}
238*e5a92d33SSascha Wildner	    }
239*e5a92d33SSascha Wildner	}
240*e5a92d33SSascha Wildner	else
241*e5a92d33SSascha Wildner	{
242*e5a92d33SSascha Wildner	    if (!$opt_quiet)
243*e5a92d33SSascha Wildner	    {
244*e5a92d33SSascha Wildner		print STDERR "Cannot open output file \"$opt_objdir/$test.out\"\n";
245*e5a92d33SSascha Wildner	    }
246*e5a92d33SSascha Wildner	    exit 1;
247*e5a92d33SSascha Wildner	}
248*e5a92d33SSascha Wildner
249*e5a92d33SSascha Wildner	($hutime, $hstime) = &print_stats($test, $okay,
250*e5a92d33SSascha Wildner					  $num_failed_subtests, $num_subtests,
251*e5a92d33SSascha Wildner					  $utime, $stime);
252*e5a92d33SSascha Wildner    }
253*e5a92d33SSascha Wildner
254*e5a92d33SSascha Wildner    $total_hutime += $hutime;
255*e5a92d33SSascha Wildner    $total_hstime += $hstime;
256*e5a92d33SSascha Wildner
257*e5a92d33SSascha Wildner    if ($okay)
258*e5a92d33SSascha Wildner    {
259*e5a92d33SSascha Wildner	$total_utime += $utime;
260*e5a92d33SSascha Wildner	$total_stime += $stime;
261*e5a92d33SSascha Wildner    }
262*e5a92d33SSascha Wildner    else
263*e5a92d33SSascha Wildner    {
264*e5a92d33SSascha Wildner	@FAILED_TESTS = (@FAILED_TESTS, $test);
265*e5a92d33SSascha Wildner    }
266*e5a92d33SSascha Wildner
267*e5a92d33SSascha Wildner    # If there were historical data, add the run time to the total time to
268*e5a92d33SSascha Wildner    # compare against the historical run time.
269*e5a92d33SSascha Wildner    if (0 < ($hutime + $hstime))
270*e5a92d33SSascha Wildner    {
271*e5a92d33SSascha Wildner	$total_ntime += $utime + $stime;
272*e5a92d33SSascha Wildner    }
273*e5a92d33SSascha Wildner}
274*e5a92d33SSascha Wildner
275*e5a92d33SSascha Wildner# Print summary stats.
276*e5a92d33SSascha Wildner$tt_str = sprintf ("%d / %d passed (%5.2f%%%%)",
277*e5a92d33SSascha Wildner		   ($#ARGV + 1) - ($#FAILED_TESTS + 1),
278*e5a92d33SSascha Wildner		   $#ARGV + 1,
279*e5a92d33SSascha Wildner		   (($#ARGV + 1) - ($#FAILED_TESTS + 1))
280*e5a92d33SSascha Wildner		   / ($#ARGV + 1) * 100);
281*e5a92d33SSascha Wildner
282*e5a92d33SSascha Wildner$t_str = sprintf ("Totals                                   %7.2f  %7.2f %7.2f"
283*e5a92d33SSascha Wildner                  . "  %7.2f\n"
284*e5a92d33SSascha Wildner		  . " %s %7.2f  %7.2f %7.2f %7.2f%%%%\n",
285*e5a92d33SSascha Wildner		  $total_utime, $total_stime, $total_utime + $total_stime,
286*e5a92d33SSascha Wildner		  ($total_ntime - ($total_hutime + $total_hstime)),
287*e5a92d33SSascha Wildner		  $tt_str . ' ' x (40 - length($tt_str)),
288*e5a92d33SSascha Wildner		  $total_hutime, $total_hstime, $total_hutime + $total_hstime,
289*e5a92d33SSascha Wildner		  ($total_hutime + $total_hstime == 0.0) ? 0.0 :
290*e5a92d33SSascha Wildner		  (($total_ntime
291*e5a92d33SSascha Wildner		    - ($total_hutime + $total_hstime))
292*e5a92d33SSascha Wildner		   / ($total_hutime + $total_hstime) * 100));
293*e5a92d33SSascha Wildner
294*e5a92d33SSascha Wildner@TSTATS = ("--------------------------------------------------------------------------\n",
295*e5a92d33SSascha Wildner	   $t_str,
296*e5a92d33SSascha Wildner	   "--------------------------------------------------------------------------\n"
297*e5a92d33SSascha Wildner	   );
298*e5a92d33SSascha Wildnerif (!$opt_quiet)
299*e5a92d33SSascha Wildner{
300*e5a92d33SSascha Wildner    foreach $line (@TSTATS)
301*e5a92d33SSascha Wildner    {
302*e5a92d33SSascha Wildner	printf STDOUT "$line";
303*e5a92d33SSascha Wildner    }
304*e5a92d33SSascha Wildner}
305*e5a92d33SSascha Wildner
306*e5a92d33SSascha Wildnerif ($#FAILED_TESTS >= 0)
307*e5a92d33SSascha Wildner{
308*e5a92d33SSascha Wildner    # One or more tests failed, so return an error.
309*e5a92d33SSascha Wildner    exit 1;
310*e5a92d33SSascha Wildner}
311*e5a92d33SSascha Wildner# End of main execution.
312*e5a92d33SSascha Wildner
313*e5a92d33SSascha Wildnersub run_test
314*e5a92d33SSascha Wildner{
315*e5a92d33SSascha Wildner    my ($test) = @_;
316*e5a92d33SSascha Wildner    my ($okay) = 1;
317*e5a92d33SSascha Wildner    my ($tutime, $tstime);
318*e5a92d33SSascha Wildner    my ($utime, $stime, $cutime, $cstime);
319*e5a92d33SSascha Wildner    my (@TSTATS, @TPATH);
320*e5a92d33SSascha Wildner    my ($t_str);
321*e5a92d33SSascha Wildner    my ($srcdir, $objdir);
322*e5a92d33SSascha Wildner
323*e5a92d33SSascha Wildner    # Get the path component of $test, if any.
324*e5a92d33SSascha Wildner    @TPATH = split(/\//, $test);
325*e5a92d33SSascha Wildner    pop(@TPATH);
326*e5a92d33SSascha Wildner    $srcdir = join('/', ($opt_srcdir, @TPATH));
327*e5a92d33SSascha Wildner    $objdir = join('/', ($opt_objdir, @TPATH));
328*e5a92d33SSascha Wildner
329*e5a92d33SSascha Wildner    @TSTATS = ("--------------------------------------------------------------------------\n");
330*e5a92d33SSascha Wildner
331*e5a92d33SSascha Wildner    $t_str = sprintf ("%s%s", $test, ' ' x (40 - length($test)));
332*e5a92d33SSascha Wildner    @TSTATS = (@TSTATS, $t_str);
333*e5a92d33SSascha Wildner    @STATS = (@STATS, @TSTATS);
334*e5a92d33SSascha Wildner    if (!$opt_quiet)
335*e5a92d33SSascha Wildner    {
336*e5a92d33SSascha Wildner	foreach $line (@TSTATS)
337*e5a92d33SSascha Wildner	{
338*e5a92d33SSascha Wildner	    printf STDOUT "$line";
339*e5a92d33SSascha Wildner	}
340*e5a92d33SSascha Wildner    }
341*e5a92d33SSascha Wildner
342*e5a92d33SSascha Wildner    ($utime, $stime, $cutime, $cstime) = times;
343*e5a92d33SSascha Wildner    `$opt_objdir/$test $srcdir $objdir > $opt_objdir/$test.out 2>&1`;
344*e5a92d33SSascha Wildner    ($utime, $stime, $tutime, $tstime) = times;
345*e5a92d33SSascha Wildner
346*e5a92d33SSascha Wildner    # Subtract the before time from the after time.
347*e5a92d33SSascha Wildner    $tutime -= $cutime;
348*e5a92d33SSascha Wildner    $tstime -= $cstime;
349*e5a92d33SSascha Wildner
350*e5a92d33SSascha Wildner    if ($opt_zero)
351*e5a92d33SSascha Wildner    {
352*e5a92d33SSascha Wildner	if ($?)
353*e5a92d33SSascha Wildner	{
354*e5a92d33SSascha Wildner	    $okay = 0;
355*e5a92d33SSascha Wildner	    if ($opt_verbose)
356*e5a92d33SSascha Wildner	    {
357*e5a92d33SSascha Wildner		print STDERR
358*e5a92d33SSascha Wildner		    "\"$opt_objdir/$test > $opt_objdir/$test.out 2>&1\" returned $?\n";
359*e5a92d33SSascha Wildner	    }
360*e5a92d33SSascha Wildner	}
361*e5a92d33SSascha Wildner    }
362*e5a92d33SSascha Wildner
363*e5a92d33SSascha Wildner    return ($okay, $tutime, $tstime);
364*e5a92d33SSascha Wildner}
365*e5a92d33SSascha Wildner
366*e5a92d33SSascha Wildnersub print_stats
367*e5a92d33SSascha Wildner{
368*e5a92d33SSascha Wildner    my ($test, $okay, $failed_subtests, $subtests, $utime, $stime) = @_;
369*e5a92d33SSascha Wildner    my ($hutime, $hstime);
370*e5a92d33SSascha Wildner#    my (TEST_PERF);
371*e5a92d33SSascha Wildner    my (@TSTATS);
372*e5a92d33SSascha Wildner    my ($t_str, $pass_str);
373*e5a92d33SSascha Wildner
374*e5a92d33SSascha Wildner    $pass_str = $okay ? "passed" : "*** FAILED ***";
375*e5a92d33SSascha Wildner    if ((0 != $subtests) && (!$okay))
376*e5a92d33SSascha Wildner    {
377*e5a92d33SSascha Wildner	$pass_str = $pass_str . " ($failed_subtests/$subtests failed)";
378*e5a92d33SSascha Wildner    }
379*e5a92d33SSascha Wildner    $pass_str = $pass_str . ' ' x (39 - length($pass_str));
380*e5a92d33SSascha Wildner
381*e5a92d33SSascha Wildner    if (-r "$test.perf")
382*e5a92d33SSascha Wildner    {
383*e5a92d33SSascha Wildner	if (!open (TEST_PERF, "<$opt_objdir/$test.perf"))
384*e5a92d33SSascha Wildner	{
385*e5a92d33SSascha Wildner	    print STDERR "Unable to open \"$opt_objdir/$test.perf\"\n";
386*e5a92d33SSascha Wildner	    exit 1;
387*e5a92d33SSascha Wildner	}
388*e5a92d33SSascha Wildner	$_ = <TEST_PERF>;
389*e5a92d33SSascha Wildner
390*e5a92d33SSascha Wildner	($hutime, $hstime) = split;
391*e5a92d33SSascha Wildner	close TEST_PERF;
392*e5a92d33SSascha Wildner
393*e5a92d33SSascha Wildner	$t_str = sprintf (" %7.2f  %7.2f %7.2f  %7.2f\n"
394*e5a92d33SSascha Wildner			  . " %s %7.2f  %7.2f %7.2f %7.2f%%%%\n",
395*e5a92d33SSascha Wildner			  $utime, $stime, $utime + $stime,
396*e5a92d33SSascha Wildner			  ($utime + $stime) - ($hutime + $hstime),
397*e5a92d33SSascha Wildner			  $pass_str,
398*e5a92d33SSascha Wildner			  $hutime, $hstime, $hutime + $hstime,
399*e5a92d33SSascha Wildner			  (($hutime + $hstime) == 0.0) ? 0.0 :
400*e5a92d33SSascha Wildner			  ((($utime + $stime) - ($hutime + $hstime))
401*e5a92d33SSascha Wildner			   / ($hutime + $hstime) * 100));
402*e5a92d33SSascha Wildner    }
403*e5a92d33SSascha Wildner    else
404*e5a92d33SSascha Wildner    {
405*e5a92d33SSascha Wildner	$hutime = 0.0;
406*e5a92d33SSascha Wildner	$hstime = 0.0;
407*e5a92d33SSascha Wildner
408*e5a92d33SSascha Wildner	$t_str = sprintf (" %7.2f  %7.2f %7.2f        \n"
409*e5a92d33SSascha Wildner			  . " %s\n",
410*e5a92d33SSascha Wildner			  $utime, $stime, $utime + $stime,
411*e5a92d33SSascha Wildner			  $pass_str);
412*e5a92d33SSascha Wildner    }
413*e5a92d33SSascha Wildner    @TSTATS = ($t_str);
414*e5a92d33SSascha Wildner    if (!$opt_quiet)
415*e5a92d33SSascha Wildner    {
416*e5a92d33SSascha Wildner	foreach $line (@TSTATS)
417*e5a92d33SSascha Wildner	{
418*e5a92d33SSascha Wildner	    printf STDOUT "$line";
419*e5a92d33SSascha Wildner	}
420*e5a92d33SSascha Wildner    }
421*e5a92d33SSascha Wildner
422*e5a92d33SSascha Wildner    if ($okay && $opt_ustats)
423*e5a92d33SSascha Wildner    {
424*e5a92d33SSascha Wildner	if (!open (TEST_PERF, ">$opt_objdir/$test.perf"))
425*e5a92d33SSascha Wildner	{
426*e5a92d33SSascha Wildner	    if (!$opt_quiet)
427*e5a92d33SSascha Wildner	    {
428*e5a92d33SSascha Wildner		print STDERR "Unable to update \"$opt_objdir/$test.perf\"\n";
429*e5a92d33SSascha Wildner	    }
430*e5a92d33SSascha Wildner	}
431*e5a92d33SSascha Wildner	else
432*e5a92d33SSascha Wildner	{
433*e5a92d33SSascha Wildner	    print TEST_PERF "$utime $stime\n";
434*e5a92d33SSascha Wildner	    close TEST_PERF;
435*e5a92d33SSascha Wildner	}
436*e5a92d33SSascha Wildner    }
437*e5a92d33SSascha Wildner
438*e5a92d33SSascha Wildner    return ($hutime, $hstime);
439*e5a92d33SSascha Wildner}
440*e5a92d33SSascha Wildner
441*e5a92d33SSascha Wildnersub usage
442*e5a92d33SSascha Wildner{
443*e5a92d33SSascha Wildner    print <<EOF;
444*e5a92d33SSascha Wildner$0 usage:
445*e5a92d33SSascha Wildner    $0 [<options>] <test>+
446*e5a92d33SSascha Wildner
447*e5a92d33SSascha Wildner    Option        | Description
448*e5a92d33SSascha Wildner    --------------+-------------------------------------------------------------
449*e5a92d33SSascha Wildner    -h --help     | Print usage and exit.
450*e5a92d33SSascha Wildner    -v --verbose  | Verbose (incompatible with quiet).
451*e5a92d33SSascha Wildner    -q --quiet    | Quiet (incompatible with verbose).
452*e5a92d33SSascha Wildner    -s --srcdir   | Path to source tree (default is ".").
453*e5a92d33SSascha Wildner    -o --objdir   | Path to object tree (default is ".").
454*e5a92d33SSascha Wildner    -u --ustats   | Update historical statistics (stored in "<test>.perf".
455*e5a92d33SSascha Wildner    -z --zero     | Consider non-zero exit code to be an error.
456*e5a92d33SSascha Wildner    --------------+-------------------------------------------------------------
457*e5a92d33SSascha Wildner
458*e5a92d33SSascha Wildner    If <test>.exp exists, <test>'s output is diff'ed with <test>.exp.  Any
459*e5a92d33SSascha Wildner    difference is considered failure.
460*e5a92d33SSascha Wildner
461*e5a92d33SSascha Wildner    If <test>.exp does not exist, output to stdout of the following form is
462*e5a92d33SSascha Wildner    expected:
463*e5a92d33SSascha Wildner
464*e5a92d33SSascha Wildner        1..<n>
465*e5a92d33SSascha Wildner        {not }ok[ 1]
466*e5a92d33SSascha Wildner        {not }ok[ 2]
467*e5a92d33SSascha Wildner        ...
468*e5a92d33SSascha Wildner        {not }ok[ n]
469*e5a92d33SSascha Wildner
470*e5a92d33SSascha Wildner    1 <= <n> < 2^31
471*e5a92d33SSascha Wildner
472*e5a92d33SSascha Wildner    Lines which do not match the patterns shown above are ignored.
473*e5a92d33SSascha WildnerEOF
474*e5a92d33SSascha Wildner}
475