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