#!/usr/bin/perl

# ====================================================================
# The Vovida Software License, Version 1.0 
# 
# Copyright (c) 2000,2003 Vovida Networks, Inc.  All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
# 
# 3. The names "VOCAL", "Vovida Open Communication Application Library",
#    and "Vovida Open Communication Application Library (VOCAL)" must
#    not be used to endorse or promote products derived from this
#    software without prior written permission. For written
#    permission, please contact vocal\@vovida.org.
# 
# 4. Products derived from this software may not be called "VOCAL", nor
#    may "VOCAL" appear in their name, without prior written
#    permission of Vovida Networks, Inc.
# 
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
# NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
# NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
# IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
# 
# ====================================================================
# 
# This software consists of voluntary contributions made by Vovida
# Networks, Inc. and many individuals on behalf of Vovida Networks,
# Inc.  For more information on Vovida Networks, Inc., please see
# <http://www.vovida.org/>.

# $Id: run-tests,v 1.12.72.1 2003/02/18 19:36:33 bko Exp $

require "getopts.pl";

&Getopts("av");

# usage:

if($#ARGV < 0) {
    print "usage: $0 [-av] <tests....>\n";
    exit -1;
}

# run through all the tests (passed in ARGV) and make sure they work
$fail = 0;

foreach $test (@ARGV) {
    # do something
    my $record = {};
    $cmd = "./$test 2>&1|";
    $record->{name} = $test;

    print "running $cmd\n" if $opt_v;
    open(F, $cmd) || die "cannot run $cmd: $!";
    while(<F>) {
	if(/^VerifySummary/) {
	    # do something here
	    /:([0-9]*):([0-9]*):([0-9]*):([0-9]*):([0-9]*)$/; 

	    $record->{count} = $1;
	    $record->{passed} = $2;
	    $record->{failed} = $3;
	    $record->{broken} = $4;
	    $record->{fixed} = $5;
	}
    }
    $ret = close(F);
    $record->{exit_status} = $?;
    push(@recordlist, $record);
}


if($opt_a) {
    # print ALL failing tests, even ones that are "bugs"
    print "\n";
    print "============================================================\n";
    print "FAILING TESTS\n";
    print "    (All failing tests, even those which are known broken)\n";
    print "------------------------------------------------------------\n";
    
    $allok = 1;
    foreach $record (@recordlist) {
	if($record->{failed} > 0 || $record->{broken} > 0) {
	    print "  $record->{name}\n";
	    $allok = 0;
	}
    }
    
    if($allok) {
	print "\nPASSED:   All tests passed.\n";
    } else {
	print "\nFAILED:   Some tests failed.\n";
    }
} else {
    # normally, just print new failing tests
    print "\n";
    print "============================================================\n";
    print "FAILING TESTS\n";
    print "    (tests which used to pass don't anymore)\n";
    print "    run 'make verifyall' to show ALL failing tests\n";
    print "------------------------------------------------------------\n";
    
    $allok = 1;
    foreach $record (@recordlist) {
	if($record->{failed} > 0) {
	    print "  $record->{name}\n";
	    $allok = 0;
	}
    }
    
    if($allok) {
	print "\nPASSED:   All working tests passed.\n";
    } else {
	print "\nFAILED:   New bugs introduced\n";
    }
}


print "\n";


sub broken_header {
    print "\n";
    print "============================================================\n";
    print "BROKEN TESTS\n";
    print "   These are tests which fall into one of several categories:\n";
    print "   - segfaulted\n";
    print "   - the numbers don't add up (too many or too few test cases)\n";
    print "   - broken tests have been fixed but not moved into the\n";
    print "     'working' category\n";
    print "------------------------------------------------------------\n";
}

$allok = 1;
foreach $record (@recordlist) {
    if(( $record->{count} != ($record->{passed} + $record->{failed} +
			     $record->{broken} + $record->{fixed})) ||
       ( $record->{exit_status}) || 
       ( $record->{fixed} > 0)
      ){
	if($allok) {
	    &broken_header();
	}
	print "  $record->{name}\n";
	$retvalue = -1;
	$allok = 0;
    }
}

if($allok) {
#    print "\nPASSED:    No broken tests.\n";
} else {
    print "\nFAILED:    Please fix broken tests.\n";
}

print "\n";

exit $retvalue;


syntax highlighted by Code2HTML, v. 0.9.1