#!/usr/bin/perl #################################################### # Copyright (c) Open Source Development Labs, 2004 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See # the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # FILE : STPfailure_report.pl # DESCRIPTION : A script that will retrieve the run results through the net from # the STP results and then finds the corresponding source code # file in your LTP tree for each failure. It then prints the # description and details for each to STDOUT. # REQUIREMENTS: LWP::Simple, File::Find, and Text::Wrap must be installed # AUTHOR : Bryce Harrington <bryce@osdl.org> # HISTORY : # 04/28/2004 Robbie Williamson (robbiew@austin.ibm.com) # Adapted for and added to LTP #################################################### use strict; use LWP::Simple; use File::Find; use Text::Wrap; $Text::Wrap::columns = 72; my $test_uid = $ARGV[0]; die "Usage: STPfailure_report.pl TEST_RUN_ID\n" unless ($test_uid =~ /^\d+$/); # Location from which to retrieve test results my $stp_url = "http://khack.osdl.org/stp/$test_uid/"; # Name of the file containing the fail report data my $fail_report = $stp_url . "results/FAIL_summary.txt"; # Path to the top dir in the locally checked out version of LTP my $ltp_base = ".."; die "Cannot find testcases directory in '$ltp_base'" unless (-d "$ltp_base/testcases"); # Retrieve the results for the test run my $fail_results = get($fail_report) || die "Could not retrieve URL $fail_report\n"; # Process the results, extracting each test name & generating a report my $testname = ''; my $description = ''; my $failures = ''; foreach my $line (split /\n/, $fail_results) { next unless ($line =~ /^(\w+)\s/); # Is this a new testname or continuation of the previous? if ($1 ne $testname) { # Print the current test results print_report($testname, $description, $failures); # Init variables for next testcase $testname = $1; $description = get_description($testname, $ltp_base); $failures = ''; } $failures .= wrap('', ' 'x26, ($line)) . "\n"; } # Locates the matching .c file and extracts the DESCRIPTION field sub get_description { my $testname = shift || return undef; my $dir = shift || return undef; # Find $testname.c my $path = `find $dir -name '$testname.c'`; chomp $path; open(FILEHANDLE, "< $path") or return undef; # Seek in $testname.c for the DESCRIPTION line my $line; while (defined ($line = <FILEHANDLE>)) { last if ($line =~ /^\s+\*\s+DESCRIPTION/); last if ($line =~ /^\s+\*\s+Test Description/); } # Extract the description my $description = ''; while (defined ($line = <FILEHANDLE>)) { last if ($line !~ /^\s+\*\s\s+/); # Strip off the leading " * " $line =~ s/^\s+\*\s//; $description .= $line; } close(FILEHANDLE); $path =~ s|^$dir/||; return $description . "\nFor more see '$path'\n"; } # Prints out the failed test case report sub print_report { my ($testname, $description, $failures) = @_; return unless ($testname); $description ||= "No description available\n"; # Remove any trailing newlines chomp $description; chomp $testname; chomp $failures; print qq| ======================================================================== Test name: $testname Description: $description Test Result: FAIL Details: $failures ======================================================================== |; }