#!/usr/bin/perl
# ====================================================================
# The Vovida Software License, Version 1.0
#
# Copyright (c) 2000 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
# .
# test-analyzer
# this program does test analysis, by doing the following things in
# the following modes:
# in canonical mode (-c), it takes the given log file(s), and prints
# to stdout a file which contains only the most recent runs, in
# canonical (alphabetical by test name) order.
# in diffable mode (-d), it does the same as -c, but does NOT include
# the date. This produces a file which can be compared via diff.
# in report mode (-r), it takes two files from the command line, runs them
# through the diffable mode, and then diffs the two files.
require "getopts.pl";
&Getopts("cdr");
if($opt_c) {
foreach(@ARGV) {
$data = &canonical_mode(0, $_);
print $data;
}
}
if($opt_d) {
foreach(@ARGV) {
$data = &canonical_mode(1, $_); # 1 means diff mode
print $data;
}
}
if($opt_r) {
$data_0 = &canonical_mode(1, $ARGV[0]);
$data_1 = &canonical_mode(1, $ARGV[1]);
# now, do a diff on these two entries
$filename_1 = "/tmp/test-analyzer.$$.file1";
$filename_2 = "/tmp/test-analyzer.$$.file2";
open(F1, ">$filename_1") || die "can't open $filename_1 for writing";
print F1 $data_0;
close(F1);
open(F2, ">$filename_2") || die "can't open $filename_2 for writing";
print F2 $data_1;
close(F2);
print "Report for $ARGV[0] compared to $ARGV[1]\n";
print "----------------------------------------\n";
system("diff -c $filename_1 $filename_2");
unlink $filename_1;
unlink $filename_2;
}
sub canonical_mode {
my($diff_mode) = $_[0];
my($filename) = $_[1];
my($data);
$test_data = "";
open(F, $filename) || die "can't open $filename";
while() {
if(/^>>>> START ([^\(]*) \( ([0-9\-]*) \) \( ([a-zA-Z0-9\.]*) \)$/) {
# this is the start of a test
# print STDERR "got start $3:$1\n";
$test_name = $1;
$test_time = $2;
$test_bin = $3;
$hashkey = "$test_bin:$test_name";
if($test_time gt $test_time_hash{$hashkey}) {
# test is later, so replace
# print STDERR "$hashkey: replacing $test_time_hash{$hashkey} with $test_time\n";
$replace = 1;
$test_time_hash{$hashkey} = $test_time;
} else {
$replace = 0;
}
# print "$test_name : $test_time\n";
} elsif(/^<<<< END ([^\(]*) \( ([0-9\-]*) \) \( ([a-zA-Z0-9\.]*) \)$/) {
if($replace) {
# print STDERR "got end $3:$1\n";
$test_name = $1;
$test_time = $2;
$test_bin = $3;
$hashkey = "$test_bin:$test_name";
$test_data_hash{$hashkey} = $test_data;
$test_bin_hash{$hashkey} = $test_bin;
$test_name_hash{$hashkey} = $test_name;
$test_data = "";
$replace = 0;
}
} else {
if ($replace) {
$test_data .= $_;
}
}
}
close(F);
if($diff_mode) {
foreach(sort keys %test_data_hash) {
$data .= ">>>> START $test_name_hash{$_} ( ) ( $test_bin_hash{$_} )\n";
$data .= $test_data_hash{$_};
$data .= "<<<< END $test_name_hash{$_} ( ) ( $test_bin_hash{$_} )\n";
}
} else {
foreach(sort keys %test_data_hash) {
$data .= ">>>> START $test_name_hash{$_} ( $test_time_hash{$_} ) ( $test_bin_hash{$_} )\n";
$data .= $test_data_hash{$_};
$data .= "<<<< END $test_name_hash{$_} ( $test_time_hash{$_} ) ( $test_bin_hash{$_} )\n";
}
}
return $data;
}