https://github.com/CGAL/cgal
Raw File
Tip revision: f12b3bf302dafe4ae5015c7dc2b7ad77b0917be5 authored by Laurent Rineau on 08 March 2018, 11:07:49 UTC
Prefix CMake options with `CGAL_`
Tip revision: f12b3bf
create_testresult_page
#!/usr/bin/env perl
#
# first author:  Geert-Jan Giezeman
# recent maintainer: Laurent Rineau (2009-2011)
#
# This script creates a WWW page with a table of test suite results.
#
# Usage:
#   create_testresult_page <directory>

# Creates the following files :
# - results-$version.shtml
# - versions.inc (contains the version selector)
# - index.shtml -> results-$version.shtml (symlink)

use Cwd;
use strict;
use Date::Format;

my $server_url="https://cgal.geometryfactory.com/";
my $cgal_members="${server_url}CGAL/Members/";
my $manual_test_url="${cgal_members}Manual_test/";
my $doxygen_manual_test_url="${cgal_members}Manual_doxygen_test/";
my $releases_url="${cgal_members}Releases/";
my $test_results_url="${cgal_members}testsuite/";

my ($PLATFORMS_BESIDE_RESULTS, $PLATFORMS_REF_BETWEEN_RESULTS)=(1,1);

my $TEMPPAGE="tmp$$.html";
my $TEMPPAGE2="tmp2$$.html";
my $release_name;
my @platforms_to_do;
my @known_platforms;
my %platform_short_names;
my %platform_is_optimized;
my %platform_is_64bits;
my @available_platforms;
my %test_directories = ();
my @testresults;
my $testresult_dir=cwd()."/TESTRESULTS";

# Inspired from
# http://cpansearch.perl.org/src/EDAVIS/Sort-Versions-1.5/Versions.pm
sub sort_releases($$)
{
    # Take arguments in revert order: one wants to sort from the recent to
    # the old releases.
    my $b = $_[0];
    my $a = $_[1];

    #take only the numbers from release id, skipping I and Ic
    my @A = ($a =~ /\d+/g);
    my @B = ($b =~ /\d+/g);

    while(@A and @B) {
        my $av = shift(@A);
        my $bv = shift(@B);
        #$av and $bv are integers
        if($av == $bv) { next; }
        return $av <=> $bv;
    }
    return @A <=> @B;
}

sub write_selects()
{
    print OUTPUTV "<p>You can browse the test results of a different version :</p>";
    my %releases;
    foreach $_  (glob("results-*.shtml")) {
        $_ =~ /results-([^I]*)((-Ic?)-([^I].*))\.shtml/;
        $releases{"$1$3"}=1;
    }
    print OUTPUTV "<table><tr>\n";
    print OUTPUTV "  <th>All releases (<a href=\"${test_results_url}\">last one</a>)</th>\n";
    my $count = 0;
    foreach $_ (sort sort_releases (keys %releases)) {
        print OUTPUTV "  <th>CGAL-$_</th>\n";
        $count++ > 3 && last;
    }
    print OUTPUTV "</tr>\n";
    print OUTPUTV "<tr>\n";
    write_select("sel", ".*");
    $count = 0;
    foreach $_ (sort sort_releases (keys %releases)) {
        write_select("sel" . $count, $_);
        $count++ > 3 && last;
    }
    print OUTPUTV "</tr>\n</table>\n";
}

sub write_select()
{
  my $id = shift(@_);
  my $pattern = shift(@_);
  my($filename, @result);
  print OUTPUTV "  <td><select id=\"$id\" onchange=\"sel=document.getElementById(\'$id\'); top.location.href=sel.options[sel.selectedIndex].value\">\n";

  print OUTPUTV '<option value="">', "</option>\n";
  foreach $_ (sort sort_releases (glob("results-*.shtml"))) {
      $_ =~ /results-${pattern}(-.*|)\.shtml/ || next;
      my $ctime = (stat($_))[10];
      my $date = time2str('%a %Y/%m/%d', $ctime);
     print OUTPUTV '<option value="', $_, '">';
     ($filename) = m/results-(.*?)\.shtml\s*/;
#     printf OUTPUTV "%-20s (last modified: %s)</option>\n", $filename, $date;
     printf OUTPUTV '%2$s: %1$s</option>\n', $filename, $date;
  }
  print OUTPUTV "</select></td>";
}

sub list_platforms()
{
    my ($filename, @result);
    foreach $_ (glob("results_*.txt")) {
	($filename) =  m/results_(.*?)\.txt\s*/;
	push(@result, $filename) if $filename;
    }
    return @result;
}

sub list_packages($)
#
# Fill %test_directories with the packages found in the argument platform.
# Return false if that platform does not have a list of packages.
{
    my ($platform) = @_;
    my $test_result="results_${platform}.txt";
    open(TESTRESULT, $test_result) or return 0;
    while (<TESTRESULT>) {
	if (/^\s*(.*?)\s+(\w)\s*$/) {
	    $test_directories{$1} = '';
	}
    }
    close TESTRESULT or return 0;
    return 1;
}

sub collect_results_of_platform($)
{
    my ($platform) = @_;
# Create an anonymous hash that hashes packages to their result.
    my $platform_results = {};
    my $test_result="results_${platform}.txt";
    my ($yeahs, $nays, $warnings,$reqs) = (0,0,0,0);
    my $resulttext;
    open(TESTRESULT, $test_result) or return $platform_results;
    while (<TESTRESULT>) {
	if (/^\s*(.*?)\s+(\w)\s*$/) {
	    #($package,$succes) = ($1,$2);
	    if ($2 eq 'y' or $2 eq 'Y') {
		$resulttext = 'y';
		++$yeahs;
	    } elsif ($2 eq 'w' or $2 eq 'W') {
		$resulttext = 'w';
		++$warnings;
	    } elsif ($2 eq 'n' or $2 eq 'N') {
		$resulttext = 'n';
		++$nays;
	    } elsif ($2 eq 'r') {
		$resulttext = 'r';
		++$reqs;
	    } else {
		$resulttext = ' ';
	    }
	    $platform_results->{$1} = $resulttext;
	}
    }
    close TESTRESULT;
    $platform_results->{"y"} = $yeahs;
    $platform_results->{"n"} = $nays;
    $platform_results->{"w"} = $warnings;
    $platform_results->{"r"} = $reqs;
    return $platform_results;
}

sub collect_results()
{
    my $platform;
    foreach $platform (@platforms_to_do) {
	list_packages($platform);
    }
    foreach $platform (@platforms_to_do) {
	push(@testresults, collect_results_of_platform($platform));
    }
}

sub print_result_table()
{
    my $platform_count = scalar(@platforms_to_do);

    print OUTPUT <<"EOF";
<table class="result" border="1" cellspacing="2" cellpadding="5">
<tr align="CENTER">
<th rowspan="2">Package</th>
<!-- <th rowspan="2">Version</th> -->
<th colspan="$platform_count">Test Platform</th>
</tr>
<tr align="center">
EOF

    print_platforms_numbers();

    print OUTPUT "</tr>\n";
    my $test_directory;
    my $test_num = 0;
    foreach $test_directory (sort keys %test_directories) {
    	if ($PLATFORMS_REF_BETWEEN_RESULTS) {
	    $test_num++;
	    if ($test_num == 15) {
	    	$test_num = 0;
	    	print OUTPUT "\n<tr>  <td align=\"center\">\n";
	    	print OUTPUT '<a href="#platforms">Platform Description</a>';
	    	print OUTPUT "\n";
		print_platforms_numbers();
	    	print OUTPUT "\n</tr>\n";
	    }
	}
	# my $version;
	# if ( -r "$test_directory/version" ) {
	#     open(VERSION, "$test_directory/version");
	#     while(<VERSION>) {
	# 	($version) = /^\s*([^\s]*)\s/;
	# 	last if $version;
	#     }
	#     close VERSION;
	# }
	print OUTPUT "\n<tr>\n";
	print OUTPUT "<td><a class=\"package_name\" href=\"\#$test_directory\" name=\"$test_directory\">$test_directory</a></td>\n";
	# if ( $version ) {
	#     print OUTPUT "<TD ALIGN=CENTER>$version</TD>\n";
	# } else {
	#     print OUTPUT "<TD ALIGN=CENTER>?.?</TD>\n";
	# }
	my ($platform_num,$platform)=(0,"");
	$platform_num=0;
	foreach $platform (@platforms_to_do) {
	    my ($result,$resulttext);
	    $resulttext = $testresults[$platform_num]->{$test_directory};
	    if (! defined($resulttext)) {
		$resulttext = ' ';
	    }
	    print OUTPUT '<td align=center';
	    if ($resulttext eq 'y') {
		print OUTPUT ' class="ok"';
	    } elsif ($resulttext eq 'w') {
		print OUTPUT ' class="warning"';
	    } elsif ($resulttext eq 'n') {
		print OUTPUT ' class="error"';
	    } elsif ($resulttext eq 'r') {
		print OUTPUT ' class="requirements"';
	    } 
	    else {
		print OUTPUT ' class="na"';
	    }
	    print OUTPUT '> <a href="',
	    "$release_name/$test_directory/TestReport_$platform.gz\"";
	    print OUTPUT '>', "$resulttext</a></td>\n";
	    ++$platform_num;

	}
	print OUTPUT "</tr>\n";
    }
    print OUTPUT "</table>\n";
}

sub print_resultpage()
{
    my $platform_count = scalar(@platforms_to_do);

    print OUTPUT '<h2><a name="testresults">Test Results</a></h2>'."\n";
    print OUTPUT '<p>In the table below, each column is numbered, and corresponds to a platform. ';
    print OUTPUT 'Each column number is a link to the platform description table.</p> ', "\n";
    if ($PLATFORMS_BESIDE_RESULTS) {
    	print OUTPUT <<"EOF";
<table border="0" cellspacing="5" cellpadding="0">
<tr align="center">
<td>
EOF
    }

    print_result_table();

    if ($PLATFORMS_BESIDE_RESULTS) {
    	print OUTPUT "<td>\n<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">\n";
    	if ($platform_count > 0) {
    	    my $repeat_count = (1 + 1.1/16.5)*scalar(keys %test_directories)/($platform_count+0.25);
	    while ($repeat_count >= 1) {
	    	$repeat_count--;
	    	print OUTPUT "<tr><td>\n";
                print_platforms();
                print OUTPUT "</tr>\n";
	    }
	}
	print OUTPUT "</table>\n</tr>\n</table>\n";
    }
}

sub sort_pf
{
    # MSVS first
    if($a =~ m/^MS/) { 
        if($b =~ m/^MS/) {
            return $a cmp $b;
        }
        else 
        {
            return -1;
        }
    }
    if($b =~ m/^MS/) { return 1; }

    # g++/gcc second
    if($a =~ m/^g[c+][c+]/) { 
        if($b =~ m/^g[c+][c+]/) {
            return $a cmp $b;
        }
        else 
        {
            return -1;
        }
    }
    if($b =~ m/^g[c+][c+]/) { return 1; }

    # Intel third
    if($a =~ m/^[iI]/) { 
        if($b =~ m/^[iI]/) {
            return $a cmp $b;
        }
        else 
        {
            return -1;
        }
    }
    if($b =~ m/^[iI]/) { return 1; }

    # SunPro last
    if($a =~ m/^[Ss][uU[Nn]/) { 
        if($b =~ m/^[Ss][uU[Nn]/) {
            return $a cmp $b;
        }
        else 
        {
            return 1;
        }
    }
    if($b =~ m/^[Ss][uU[Nn]/) { return -1; }

    return $a cmp $b;
}

sub parse_platform($)
{
    my ($pf) = @_;
    $pf =~ s/_LEDA$//;
    my @list = split /_/, $pf;
    return @list;
}

sub parse_platform_2($)
{
    my ($pf) = @_;
    my @list = parse_platform($pf);
#    if (@list > 3) {
#        splice(@list,0,@list-3);
#    }
    while (@list < 3) {
    	push(@list,'?');
    }
    return @list;
}

sub short_pfname($)
{
    my @pflist = parse_platform_2($_[0]);
    my $shortpf;
    if(@pflist < 4) {
	$shortpf = join('_', $pflist[1], $pflist[2]);
    }
    elsif($pflist[2] !~ /Linux/i) {
	$shortpf = join('_', $pflist[3], $pflist[2]);
	if(@pflist >= 5) {
	    $shortpf = join('_', $shortpf, $pflist[4]);
	}
    }
    else {
	$shortpf = $pflist[3];
	if(@pflist >= 5) {
	    $shortpf = join('_', $shortpf, $pflist[4]);
	}
    }
    return $shortpf;
}

sub choose_platforms()
{
    my (%platform_index, $pf);
# List all platforms for which there are results
    @available_platforms = list_platforms();
    my $index = 0;
# Put all known platforms in a hash table.
    for ($index=0; $index < @known_platforms; $index += 1) {
	$pf = $known_platforms[$index];
	$platform_index{$pf} = 1;
    }
# Check if there are platforms listed that are not known. Warn about this
# and add those platforms at the end of the list of known platforms.
    foreach (@available_platforms) {
	$pf = $_;
	my $shortpf = short_pfname($pf);
	$pf =~ s/^[^_]*_//;
	$pf =~ s/_LEDA$//;
	if (!exists $platform_index{$shortpf}) {
	    # print STDERR "Warning: Platform $_ is unknown!\n";
	    $platform_index{$shortpf} = 1;
	    push(@known_platforms,$shortpf); # ???
    	    $platform_short_names{$shortpf} = $shortpf;
	}
    }

# Make a list of all the platforms that are to be treated, in the order they
# appear in the list of known_platforms.
    @platforms_to_do = ();
    @known_platforms = sort sort_pf @known_platforms;
    for ($index=0; $index < @known_platforms; $index += 1) {
	$pf = $known_platforms[$index];
	my $ind2 = 0;
	foreach (@available_platforms) {
	    my $apf = short_pfname($_);
	    if ($apf eq $pf) {
	    	push(@platforms_to_do, $_);
	    }
	}
    }
}

sub print_platform_descriptions()
{
    my ($i,$pf_no,$pf) = (0,1);
    print OUTPUT <<'EOF';
<h2><a name="platforms">Platform Description and Summary</a></h2>
<table border="1" cellspacing="2" cellpadding="5" class="summary">
<tr align="center">
<th colspan="2">OS and compiler</th>
<th>Tester</th>
<th class="ok">y</th>
<th class="warning">w</th>
<th class="error">n</th>
<th class="requirements">r</th>
<th>CMake</th>
<th>BOOST</th>
<th>MPFR</th>
<th>GMP</th>
<th>QT5</th>
<th>LEDA</th>
<th>CXXFLAGS</th>
<th>LDFLAGS</th>
</tr>
EOF
    my ($platform_num)=(0);
    foreach $pf (@platforms_to_do) {
	my $pf_num_plus_one = $platform_num + 1;
	print OUTPUT "<tr>\n<td><a name=\"platform$pf_num_plus_one\">$pf_no</a>\n";
	$pf_no++;
	# my $pf_short = join('_',parse_platform_2($pf));
	(my $pf_short) = ($pf =~ m/_(.*)/);
	print OUTPUT "<td><a href=\"$release_name/Installation/TestReport_$pf.gz\">$pf_short</a>";

        ($platform_is_64bits{$pf}) = ! ($pf =~ m/32/);

        if (open (PLATFORM_INFO, "results_${pf}.info")) {
	    $_ = <PLATFORM_INFO>; # CGAL_VERSION
	    $_ = <PLATFORM_INFO>; # TESTER
	    $_ = <PLATFORM_INFO>; # TESTER_NAME
	    chomp;
	    my $tester_name = $_;
	    $_ = <PLATFORM_INFO>; # TESTER_ADDRESS
	    chomp;
	    my $tester_address = $_;

	    my $county = $testresults[$platform_num]->{"y"};
	    my $countw = $testresults[$platform_num]->{"w"};
	    my $countn = $testresults[$platform_num]->{"n"};
	    my $countr = $testresults[$platform_num]->{"r"};

	    my $index = 8;
	    my @tmp;
	    while ($index) {
	        $index--;
		$_ = <PLATFORM_INFO>;
		chomp;
		$tmp[$index] = $_;
	    }
	    ($platform_is_optimized{$pf}) = ($tmp[1] =~ m|([-/]x?O[1-9])|);
	    $_ = <PLATFORM_INFO>;
	    chomp;
	    print OUTPUT "</td>\n";
	    print OUTPUT "<td><a href=\"mailto:$tester_address\">$tester_name</a></td>\n";
	    print OUTPUT "<td>$county</td>\n"; 
	    print OUTPUT "<td>$countw</td>\n"; 
 	    print OUTPUT "<td>$countn</td>\n"; 
 	    print OUTPUT "<td>$countr</td>\n"; 
	    $index = 8;
	    while ($index) {
	        $index--;
		$_ = $tmp[$index];
                if($index > 2) {
                    print OUTPUT "<td align=\"center\">$_</td>\n";
                } else {
                    print OUTPUT "<td>$_</td>\n";
                }                    
	    }
	} else {
	    my $index = 12;
	    while ($index) {
		print OUTPUT "<td>?</td>\n";
	    }
	}
	++$platform_num;
    }
    print OUTPUT "</table>\n<p>\n";
}

sub print_platforms_numbers()
{
    my ($platform_num,$platform)=(0,"");
    foreach $platform (@platforms_to_do) {
	++$platform_num;
	my $pf_short = short_pfname($platform);
	my $class = "";
	my $tag = "";
	if($platform_is_optimized{$platform} || $platform_is_64bits{$platform})
	{
	    $class = " class=\"";
	    $tag = " ( ";
            if($platform_is_64bits{$platform}) { 
                $class = "$class os64bits"; 
                $tag = $tag . "64 bits ";
            }
            if($platform_is_optimized{$platform}) { 
                $class = "$class highlight"; 
                $tag = $tag ." optimized: $platform_is_optimized{$platform}";
            }
            $class = $class . "\"";
            $tag = $tag . " )";
	}
	print OUTPUT "<td$class><a href=\"#platform$platform_num\" title=\"$pf_short$tag\"><b>$platform_num</b></a>\n";
    }
}

sub print_platforms()
{
    my ($pf_no,$pf) = (1,"");
    print OUTPUT '<table border="1" cellspacing="2" cellpadding="5" >',"\n";
    foreach $pf (@platforms_to_do) {
	print OUTPUT "<tr>\n<td>$pf_no\n";
	$pf_no++;
	my $pf_short = short_pfname($pf);
	print OUTPUT "<td>$platform_short_names{$pf_short}";
	print OUTPUT "\n</td></tr>\n";
    }
    print OUTPUT "</table>\n";
}

sub result_filename($)
{
    return "results".substr($_[0],4).".shtml";
#	$name =~ s/-Ic?-/-/;
}


sub print_little_header(){

    my $release_version = substr($release_name, 5);
    print OUTPUT<<"EOF";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>${release_name} Test Results</title>
  <link rel="shortcut icon" href="cgal.ico">
  <link rel="stylesheet" type="text/css" href="testresult.css">
<!-- This file is generated by a program. Do not edit manually!! -->
</head>
<body>
<h1>Test Results of ${release_name}
<a id="permalink" href="results-${release_version}.shtml">permalink</a>
<a id="jump_to_results" href="#testresults">jump to results</a></h1>
<!--#include virtual="versions.inc"-->
<p>The results of the tests are presented in a table
('y' = success, 'w' = warning, 'n' = failure, 'r' = a requirement is not found),
and the error + compiler output from each test can be retrieved by clicking
on it.</p>
<p><b>N.B. The detection of warnings is not exact.
Look at the output to be sure!</b></p>
<ol>
<li><a href="${releases_url}">
Downloading internal releases</a></li>
<li><a href="${doxygen_manual_test_url}${release_name}/" style="color: red">
The doxygen documentation testpage</a>
(and the <a href="${doxygen_manual_test_url}">overview page</a>)</li>
EOF
    if ( -r "announce.html" ) {
	print OUTPUT<<"EOF";
<li><a href="$release_name/announce.html">Announcement of this release</a></li>
EOF
    }

    print OUTPUT "</ol>\n";
}


sub main()
{
    if (scalar(@ARGV)  != 1 ) {
	print STDERR "usage: $0 directory\n";
	exit 1;
    }

    $release_name =shift(@ARGV);

    $release_name =~ s<(\s+)$><>;
    $release_name =~ s<(/)$><>;
    chdir $testresult_dir or die;
    if ( ! -d $release_name ) {
	print STDERR "$release_name is not a valid directory\n";
	exit 1;
    }

#    init_known_platforms();
    chdir $testresult_dir or die;
    chdir $release_name or die;
    choose_platforms();
    chdir "..";

    umask 0022;
    unlink $TEMPPAGE;
    unlink $TEMPPAGE2;
    open(OUTPUT,">$TEMPPAGE") or die;
    open(OUTPUTV,">$TEMPPAGE2") or die;
    chdir $testresult_dir or die;
    chdir $release_name or die;
    collect_results();
    print_little_header();
    print_platform_descriptions();
    print_resultpage();

    print OUTPUT << 'EOF';
 <p style="width: 100%">This page has been created by the test results
     collection scripts (in <a
     href="https://gforge.inria.fr/plugins/scmsvn/viewcvs.php/trunk/Maintenance/test_handling?root=cgal"><tt>trunk/Maintenance/test_handling</tt></a>).
     <a href="test_results.log">See the log here</a>.</p>

 <p>
    <a href="http://validator.w3.org/check?uri=https://cgal.geometryfactory.com<!--#echo var="DOCUMENT_URI" -->"><img
        src="valid-html401-blue"
        alt="Valid HTML 4.01 Strict" height="31" width="88"></a>
 </p>
EOF
    print OUTPUT "</body>\n</html>\n";

    close OUTPUT;
    chdir "..";

    my $WWWPAGE = result_filename($release_name);
    rename $TEMPPAGE, $WWWPAGE;
    chmod 0644, $WWWPAGE;
    unlink "index.shtml";
    symlink $WWWPAGE, "index.shtml";

    # Deal with the versions.inc file.
    write_selects();
    my $VERSIONS_WEBPAGE="versions.inc";
    rename $TEMPPAGE2, $VERSIONS_WEBPAGE;
    chmod 0644, $VERSIONS_WEBPAGE;
}

sub init_known_platforms()
{
    my ($short_name, $full_name);
    open(PLATFORMS,'known_platforms') or die;
    @known_platforms = ();
    while(<PLATFORMS>) {
        ($short_name, $full_name) =split;
	$full_name = short_pfname($full_name);
	push(@known_platforms,$full_name);
    	$platform_short_names{$full_name} = $full_name;
    }
    close(PLATFORMS);
}

main();
back to top