Open MPI logo

MTT Devel Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all MTT Devel mailing list

Subject: Re: [MTT devel] [MTT svn] svn:mtt-svn r1602 - in trunk/lib/MTT: . Reporter
From: Jeff Squyres (jsquyres) (jsquyres_at_[hidden])
Date: 2013-03-19 08:29:19


Awesome. +1!

On Mar 18, 2013, at 11:27 PM, <svn-commit-mailer_at_[hidden]> wrote:

> Author: miked (Mike Dubman)
> Date: 2013-03-19 02:27:03 EDT (Tue, 19 Mar 2013)
> New Revision: 1602
> URL: https://svn.open-mpi.org/trac/mtt/changeset/1602
>
> Log:
> fixes #1971
> Add new reporter HTMLReport.pm;
> Took TextReporter.pm and deleted from it all parts that are related to working with text file, only things that related to html remains.
>
> Added:
> trunk/lib/MTT/Reporter/HTMLReport.pm
> Text files modified:
> trunk/lib/MTT/Module.pm | 1
> trunk/lib/MTT/Reporter/HTMLReport.pm | 895 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 896 insertions(+), 0 deletions(-)
>
> Modified: trunk/lib/MTT/Module.pm
> ==============================================================================
> --- trunk/lib/MTT/Module.pm Tue Mar 12 18:45:53 2013 (r1601)
> +++ trunk/lib/MTT/Module.pm 2013-03-19 02:27:03 EDT (Tue, 19 Mar 2013) (r1602)
> @@ -31,6 +31,7 @@
>
> my $str = "require $module";
> Debug("Evaluating: $str\n");
> + print "qqqqq $module\n";
> my $check = eval $str;
> if ($@) {
> if (!$check) {
>
> Added: trunk/lib/MTT/Reporter/HTMLReport.pm
> ==============================================================================
> --- /dev/null 00:00:00 1970 (empty, because file is newly added)
> +++ trunk/lib/MTT/Reporter/HTMLReport.pm 2013-03-19 02:27:03 EDT (Tue, 19 Mar 2013) (r1602)
> @@ -0,0 +1,895 @@
> +#!/usr/bin/env perl
> +#
> +# Copyright (c) 2005-2006 The Trustees of Indiana University.
> +# All rights reserved.
> +# Copyright (c) 2006-2008 Cisco Systems, Inc. All rights reserved.
> +# Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
> +# $COPYRIGHT$
> +#
> +# Additional copyrights may follow
> +#
> +# $HEADER$
> +#
> +
> +package MTT::Reporter::HTMLReport;
> +
> +use strict;
> +use POSIX qw(strftime);
> +use MTT::Messages;
> +use MTT::Values;
> +use MTT::Files;
> +use MTT::Version;
> +use MTT::Mail;
> +use MTT::DoCommand;
> +use Data::Dumper;
> +use File::Basename;
> +use File::Temp;
> +use Text::Wrap;
> +use File::Copy;
> +use IO::File;
> +use MTT::INI;
> +
> +# directory and file to write to
> +my $dirname;
> +my $filename;
> +
> +# files we've written to already in this run
> +my $written_files;
> +
> +# global array of all the MTT results
> +my @results;
> +
> +# user specified headers and footers
> +my $summary_header;
> +my $summary_footer;
> +my $detail_header;
> +my $detail_footer;
> +
> +# wordwrap pref for reports
> +my $textwrap;
> +
> +# global ini variables
> +my ($ini, $section);
> +
> +
> +# send summary by email if requested
> +my $to;
> +
> +# Do we have Text::TabularDisplay?
> +my $have_tabulardisplay;
> +eval "\$have_tabulardisplay = require Text::TabularDisplay";
> +
> +#--------------------------------------------------------------------------
> +
> +sub Init
> +{
> + ($ini, $section) = @_;
> +
> + # Sanity check
> + if (!$have_tabulardisplay)
> + {
> + Error("Summary table requested via the TextFile reporter, but the perl module Text::TabularDisplay cannot be found/loaded. Please install Text::TabularDisplay and try again.\n");
> + }
> +
> + # Grab TextFile INI params
> +
> + $summary_header = Value($ini, $section, "textfile_summary_header") . "\n";
> + $summary_footer = Value($ini, $section, "textfile_summary_footer") . "\n";
> + $detail_header = Value($ini, $section, "textfile_detail_header ") . "\n";
> + $detail_footer = Value($ini, $section, "textfile_detail_footer ") . "\n";
> + $textwrap = Value($ini, $section, "textfile_textwrap");
> + $filename = Value($ini, $section, "textfile_filename");
> + $dirname = Value($ini, $section, "textfile_dirname");
> +
> + # Make it an absolute filename, because there's oodles of
> + # chdir()'s within the testing. Whack the file if it's already
> + # there.
> +
> + if ($filename ne "-")
> + {
> + if ($filename !~ /\//)
> + {
> + $dirname = MTT::DoCommand::cwd();
> + $filename = "$filename";
> + } else {
> + $dirname = dirname($filename) if (! defined($dirname));
> + $filename = basename($filename);
> + }
> +
> + # Make sure we have a directory to write to
> + MTT::Files::safe_mkdir($dirname);
> + MTT::Files::safe_mkdir("$dirname/html");
> +
> + Debug("File reporter initialized ($dirname/$filename)\n");
> + } else
> + {
> + Debug("File reporter initialized (<stdout>)\n");
> + }
> +
> +
> + # Initialize nail notification for summary
> +
> + $to = Value($ini, $section, "email_to");
> + if ($to)
> + {
> + # Setup the mailer
> + my $agent = Value($ini, $section, "email_agent");
> + if (!MTT::Mail::Init($agent))
> + {
> + Debug("Failed to setup TextFileEmail reporter\n");
> + return 0;
> + }
> +
> + Debug("TextFileEmail reporter initialized ($to)\n");
> + }
> + return 1;
> +}
> +#--------------------------------------------------------------------------
> +
> +sub Finalize
> +{
> + my $flush_mode = undef;
> + if ($MTT::Globals::Values->{save_intermediate_report})
> + {
> + $flush_mode = "finalize";
> + }
> + # Print a roll-up report
> + _summary_report(\@results, $flush_mode)
> + if (@results);
> + undef $dirname;
> + undef $filename;
> + undef $written_files;
> +}
> +
> +#--------------------------------------------------------------------------
> +
> +sub Flush
> +{
> + my ($info, $entries) = @_;
> + my @results_to_flush = @results;
> + push(@results_to_flush, $entries) if $entries;
> + _summary_report(\@results_to_flush, "yes")
> + if (@results_to_flush);
> +
> + _detail_report($info, $entries, "yes");
> +}
> +
> +#--------------------------------------------------------------------------
> +
> +sub Submit
> +{
> + my ($info, $entries) = @_;
> + Debug("File reporter\n");
> +
> + # Push entries into the global results array
> + push(@results, $entries);
> +
> + if ($MTT::Globals::Values->{save_intermediate_report})
> + {
> + return;
> + }
> + # TextFile output has its own columns-width
> + my $save_columns = $Text::Wrap::columns;
> + $Text::Wrap::columns = $textwrap
> + if ($textwrap);
> +
> + # Do a detail report
> + _detail_report($info, $entries);
> +
> + $Text::Wrap::columns = $save_columns
> + if ($textwrap);
> +}
> +
> +
> +#--------------------------------------------------------------------------
> +
> +sub _summary_report
> +{
> + my $results_arr = shift;
> + my $flush_mode = shift;
> +
> + if (!$flush_mode || $flush_mode eq "finalize")
> + {
> + print("\nMTT Results Summary" . $MTT::Globals::Values->{description} . ", started at: " . $MTT::Globals::Values->{start_time} . " report generated at: " . localtime() . "\n");
> + print $summary_header;
> + }
> + my $table = Text::TabularDisplay->new(("Phase","Section","MPI Version", "Duration","Pass","Fail","Time out","Skip","Detailed report"));
> + my ($total_fail, $total_succ, $total_duration, $html_table_content) = (0,0,0,"");
> + foreach my $results (@$results_arr)
> + {
> + foreach my $phase (keys %$results)
> + {
> + my $phase_obj = $results->{$phase};
> +
> + foreach my $section (keys %{$phase_obj})
> + {
> + my $section_obj = $results->{$phase}{$section};
> + my ($per_mpiver) = ();
> +
> + foreach my $results_hash (@$section_obj)
> + {
> +
> + my $mpi_version = $results_hash->{mpi_version};
> + if ($results_hash->{test_result} eq MTT::Values::PASS)
> + {
> + $per_mpiver->{$mpi_version}{pass}++;
> + $total_succ++;
> + }
> + elsif ($results_hash->{test_result} eq MTT::Values::FAIL)
> + {
> + $per_mpiver->{$mpi_version}{fail}++;
> + $total_fail++;
> + } elsif ($results_hash->{test_result} eq MTT::Values::TIMED_OUT)
> + {
> + $per_mpiver->{$mpi_version}{timed}++;
> + $total_fail++;
> + } elsif ($results_hash->{test_result} eq MTT::Values::SKIPPED)
> + {
> + $per_mpiver->{$mpi_version}{skipped}++;
> + }
> + if ( defined($results_hash->{duration}) )
> + {
> + my $one_test_duration = $results_hash->{duration};
> + $one_test_duration =~ s/(\d+).+/$1/g;
> + $per_mpiver->{$mpi_version}{duration} += $one_test_duration;
> + $total_duration += $one_test_duration;
> + }
> + $per_mpiver->{$mpi_version}{report} = $results_hash;
> + }
> +
> + foreach my $mpi_version (keys %{$per_mpiver})
> + {
> + my $mpi_stat = $per_mpiver->{$mpi_version};
> + my $report = $mpi_stat->{report};
> + my $rep_file = basename(_get_filename($report, $section));
> + $rep_file =~ s/\.txt/\.html/g;
> +
> + my $duration_human = _convert_duration($mpi_stat->{duration});
> + $table->add($phase, $section, $mpi_version, $duration_human, $mpi_stat->{pass}, $mpi_stat->{fail},
> + $mpi_stat->{timed}, $mpi_stat->{skipped}, $rep_file);
> + $html_table_content .= add_tr($phase, $section, $mpi_version, $duration_human, $mpi_stat->{pass}, $mpi_stat->{fail},
> + $mpi_stat->{timed}, $mpi_stat->{skipped}, $rep_file);
> + }
> + }
> + }
> + }
> + my $total_tests = $total_fail + $total_succ;
> + my $total_duration_human = _convert_duration($total_duration);
> + my $perf_stat = "
> +
> + Total Tests: $total_tests
> + Total Failures: $total_fail
> + Total Passed: $total_succ
> + Total Duration: $total_duration secs. ($total_duration_human)
> +
> + ";
> +
> + my $body;
> + if ($MTT::Globals::Internals->{is_stopped_on_break_threshold})
> + {
> + $body = join("\n", ($summary_header, $table->render, $perf_stat, $MTT::Globals::Internals->{stopped_on_break_threshold_message}, $summary_footer));
> + }
> + else
> + {
> + $body = join("\n", ($summary_header, $table->render, $perf_stat, $summary_footer));
> + }
> + if (!$flush_mode || $flush_mode eq "finalize")
> + {
> + print $body;
> + }
> +
> + #_output_results($file, $body, $flush_mode);
> +
> + # Wrte html report to a file
> + my $html_body = get_html_summary_report_template();
> + $html_body =~ s/%TESTS_RESULTS%/$html_table_content/g;
> + my $html_totals = "<td>$total_tests</td><td>$total_fail</td><td>$total_succ</td><td>$total_duration_human</td>\n";
> + $html_body =~ s/%TOTALS%/$html_totals/g;
> + my $html_filename = "All_phase-summary.html";
> + my $html_file = "$dirname/" . MTT::Files::make_safe_filename("$html_filename");
> + _output_results($html_file, $html_body,$flush_mode);
> +
> + if (!$flush_mode || $flush_mode eq "finalize")
> + {
> + if ( $to )
> + {
> + # Evaluate the email subject header and from
> + my ($subject, $body_footer);
> + my $subject_tmpl = Value($ini, $section, "email_subject");
> + my $body_footer_tmpl = Value($ini, $section, "email_footer");
> + if ($MTT::Globals::Values->{extra_subject})
> + {
> + $subject_tmpl = $subject_tmpl."$MTT::Globals::Values->{extra_subject}";
> + }
> +
> + if ($MTT::Globals::Values->{extra_footer})
> + {
> + $body_footer_tmpl = $body_footer_tmpl."\n\n$MTT::Globals::Values->{extra_footer}";
> + }
> + my $from = Value($ini, $section, "email_from");
> + my $detailed_report = Logical($ini, $section, "email_detailed_report");
> +
> + my $overall_mtt_status = "success";
> + if ( $total_fail > 0 )
> + {
> + $overall_mtt_status = "failed";
> + }
> + my $str = "\$body_footer = \"$body_footer_tmpl\"";
> + eval $str;
> +
> + my $str = "\$subject = \"$subject_tmpl\"";
> + eval $str;
> + Verbose(">> Subject: $subject\n");
> +
> + # Now send it
> + if ( $detailed_report )
> + {
> + my @reports = _get_report_filenames($results_arr);
> + Verbose(">> Sending detailed reports: @reports\n");
> + MTT::Mail::Send($subject, $to, $from, $body . $body_footer, @reports);
> + } else
> + {
> + MTT::Mail::Send($subject, $to, $from, $body . $body_footer);
> + }
> +
> + Verbose(">> Reported to e-mail: $to\n");
> + }
> + }
> + return 1;
> +}
> +
> +sub is_result_failed
> +{
> + my ($key) = @_;
> + my $failed = 0;
> + if (($key ne "Success") and ($key ne "Passed") and ($key ne "Skipped"))
> + {
> + $failed = 1;
> + }
> + $failed;
> +}
> +
> +sub _bystatus
> +{
> + my $key1 = $$a{result_message};
> + my $key2 = $$b{result_message};
> + is_result_failed($key2) <=> is_result_failed($key1);
> +}
> +
> +# Show individual test outputs
> +sub _detail_report
> +{
> + my ($info, $entries, $flush_mode) = @_;
> + my $file;
> +
> + my $table = Text::TabularDisplay->new(("Field", "Value"));
> +
> + my $separator = { " " => " " };
> + my %existing_report_file = ();
> +
> + foreach my $phase (keys(%$entries))
> + {
> + my $phase_obj = $entries->{$phase};
> +
> + foreach my $section (keys(%$phase_obj))
> + {
> + my $section_obj = $phase_obj->{$section};
> + my $multi_line;
> + my $html_table = "";
> +
> + # Put fields that are identical all the way through in
> + # the title
> + my $title = _get_replicated_fields($section_obj);
> +
> + # Make timestamps human-readable
> + $title = _convert_timestamps($title);
> +
> + _add_to_tables($table, \$html_table, $title, undef);
> + _add_to_table($table, $separator, undef);
> +
> + foreach my $report (sort _bystatus @$section_obj)
> + {
> + $file = _get_filename($report, $section);
> + $report = _convert_timestamps($report);
> + $report = _convert_array_refs($report);
> + _add_to_tables($table, \$html_table, $report, $title);
> + _add_to_table($table, $separator, undef);
> + }
> +
> + # Write the report to a file (or stdout)
> + my $html_file = $file;
> + $html_file =~ s/\.txt/\.html/g;
> +
> + my $html_body = "";
> + if (not defined $existing_report_file{$html_file})
> + {
> + $existing_report_file{$html_file} = 1;
> + my $html_start = get_html_phase_report_template_start();
> + Verbose(">> html: adding css $html_file\n");
> + $html_body = $html_start;
> + } else
> + {
> + Verbose(">> html: not adding report css, already exists: $html_file\n");
> + }
> + $html_body .= $html_table;
> +
> +
> + _output_results($html_file, $html_body, $flush_mode);
> +
> + #_output_results($file, join("\n", ($detail_header, $table->render, $detail_footer)), $flush_mode);
> +
> + }
> + foreach my $rep_file (keys %existing_report_file)
> + {
> + my $close_report_html = get_html_phase_report_template_stop();
> + _output_results($rep_file, $close_report_html);
> + }
> + }
> +}
> +
> +# Return a list of field-value pairs to put in the title
> +# (to avoid print them over and over for each result)
> +sub _get_replicated_fields {
> + my ($section_obj) = @_;
> +
> + my $title;
> +
> + # Iterate through the array of hashes (each one is an
> + # individual test result)
> + foreach my $results_hash (@$section_obj)
> + {
> + foreach my $key (keys %$results_hash)
> + {
> + $title->{$key}->{$results_hash->{$key}} = 1;
> + }
> + }
> +
> + my @to_be_removed;
> +
> + # Stick runs of identical keys into the title
> + foreach my $key (keys %$title) {
> + my @keys = keys %{$title->{$key}};
> +
> + if (scalar @keys > 1) {
> + push(@to_be_removed, $key);
> + } else {
> + $title->{$key} = shift @keys;
> + }
> + }
> +
> + # Delete the remaining keys to be printed in _detail_report
> + foreach my $key (@to_be_removed) {
> + delete $title->{$key};
> + }
> +
> + return $title;
> +}
> +
> +# Add rows to the TabularDisplay object
> +# (exclude_hash items will not be added)
> +sub _add_to_tables
> +{
> + my($table, $htable_ref, $include_hash, $exclude_hash) = @_;
> +
> + # Skip over database fields that will have
> + # *no* meaning to the MTT operator
> + my @frivolous = (
> + "mpi_install_id",
> + "test_build_id",
> + "test_result",
> + "saved_to",
> + );
> + my $frivolous = join("|", @frivolous);
> +
> + # it can absent, if test did not start from some reason (wrong path to already installed mpi)
> + my $strClass = "Passed";
> + if ( !$include_hash->{"result_message"} and !$include_hash->{"test_result"}) {
> + $strClass = "Error";
> + } elsif ( ($include_hash->{"result_message"} ne "Success") and
> + ($include_hash->{"result_message"} ne "Passed") and
> + ($include_hash->{"result_message"} ne "Skipped")) {
> + $strClass = "Error";
> + }
> +
> + my $has_result = 0;
> + foreach my $key (sort keys %$include_hash) {
> + # Skip over frivolous data
> + next if ($key =~ /$frivolous/);
> +
> + if (! defined($exclude_hash->{$key}))
> + {
> + #$table->add($key, wrap('', '', $include_hash->{$key}));
> + $table->add($key, $include_hash->{$key});
> + if (defined $htable_ref)
> + {
> + if (!$has_result )
> + {
> + $$htable_ref .= get_html_phase_report_table_start_template();
> + $has_result++;
> + }
> +
> + my $val = $include_hash->{$key};
> +
> + # can be too big, browser hangs, save it as a href
> + if ($key eq "result_stdout") {
> + if (!$MTT::Globals::Values->{save_intermediate_report})
> + {
> + $include_hash->{saved_to}=undef;
> + }
> + if (!$include_hash->{saved_to})
> + {
> + my $tmp = new File::Temp(UNLINK => 0, SUFFIX => '.txt', TEMPLATE=>'test_stdout_XXXXXX', DIR=>"$dirname/html");
> + my $fname = $tmp->filename;
> + close $tmp;
> + _output_results($fname, $val);
> + $include_hash->{saved_to} = $fname;
> + }
> + my $fname_base = basename($include_hash->{saved_to});
> + $$htable_ref .= "<tr valign='top' class='$strClass'><td>$key</td><td><a href='html/$fname_base'>$fname_base</a></td></tr>\n";
> + } elsif ( $key eq "result_message")
> + {
> + $val =~ s/\n/<br>/g;
> + $val =~ s/[ ]/&nbsp;/g;
> + $$htable_ref .= "<tr valign='top' class='$strClass'><td>$key</td><td>$val</td></tr>\n";
> + } else
> + {
> + $val =~ s/\n/<br>/g;
> + $val =~ s/[ ]/&nbsp;/g;
> + $$htable_ref .= "<tr valign='top' class='Passed'><td>$key</td><td>$val</td></tr>\n";
> + }
> + }
> + }
> + }
> + if ($has_result && defined $htable_ref)
> + {
> + $$htable_ref .= get_html_phase_report_table_stop_template();
> + }
> +}
> +
> +sub _add_to_table
> +{
> + my($table, $include_hash, $exclude_hash) = @_;
> + return _add_to_tables($table, undef, $include_hash, $exclude_hash);
> +}
> +
> +# Output results to a file or
> +sub _output_results
> +{
> + my ($file, $str, $clear) = @_;
> +
> + Debug("Writing to text file: $file\n");
> +
> + # If we have not yet written to the file in this run,
> + # then whack the file.
> +
> + if ($clear){
> + unlink($file);
> + } elsif (!exists($written_files->{$file})) {
> + unlink($file);
> + }
> +
> + # Write to stdout or append to the file
> +
> + if ($file eq "-")
> + {
> + print $str;
> + Verbose(">> Reported to stdout\n")
> + if (!exists($written_files->{$file}));
> + } else
> + {
> + if ($clear)
> + {
> + MTT::Files::SafeWrite(1, $file, $str, ">");
> + } else
> + {
> + MTT::Files::SafeWrite(1, $file, $str, ">>");
> + }
> + Verbose(">> Reported to text file $file\n")
> + if (!exists($written_files->{$file}));
> + }
> + $written_files->{$file} = 1;
> +}
> +
> +sub _get_report_filenames
> +{
> + my $results_arr = shift;
> + my @files = ();
> +
> + foreach my $results (@$results_arr)
> + {
> +
> + foreach my $phase (keys %$results)
> + {
> + my $phase_obj = $results->{$phase};
> +
> + foreach my $section (keys %{$phase_obj})
> + {
> + my $section_obj = $phase_obj->{$section};
> +
> + foreach my $report (@$section_obj)
> + {
> + my $rep_file = _get_filename($report, $section);
> + unshift(@files, $rep_file);
> + }
> + }
> + }
> + }
> +
> + return @files;
> +}
> +
> +sub _get_filename {
> + my ($report, $section) = @_;
> +
> + # Substitute in the filename
> + my $date = strftime("%m%d%Y", localtime());
> + my $time = strftime("%H%M%S", localtime());
> + my $mpi_name = $report->{mpi_name};
> + my $mpi_install_section_name = $report->{mpi_install_section_name};
> + my $mpi_version = $report->{mpi_version};
> + my $phase = $report->{phase};
> + my $suffix = "";
> + my $ret;
> +
> +
> + if ($mpi_install_section_name) {
> + $suffix = "-$mpi_install_section_name"
> + }
> +
> + # Hardcoded filename
> + my $basename = MTT::Files::make_safe_filename("$phase-$section-$mpi_name-$mpi_version" . $suffix . ".txt");
> +
> + # Use an absolute path
> + $ret = "$dirname/$basename";
> +
> +# Debug("_get_filename returning $ret\n");
> + return $ret;
> +}
> +
> +# Stringify any array references
> +sub _convert_array_refs
> +{
> + my $report = shift;
> +
> + foreach my $key (keys(%$report)) {
> +
> + if (ref($report->{$key}) =~ /array/i) {
> + $report->{$key} = join("\n\n---\n\n", @{$report->{$key}});
> + }
> + }
> +
> + return $report;
> +}
> +
> +# Make timestamps human-readable
> +sub _convert_timestamps
> +{
> + my $report = shift;
> +
> + foreach my $key (keys(%$report))
> + {
> + if ($key =~ /timestamp/ && $report->{$key} =~ /\d+/ && !($key =~ /human/))
> + {
> + $report->{$key . "_human"} = gmtime($report->{$key});
> + }
> + }
> +
> + return $report;
> +}
> +
> +# convert duration in secs to human-readable dd HH:MM:SS
> +sub _convert_duration
> +{
> + use integer;
> + my ($rtime)= @_;
> +
> + my $min = $rtime / 60;
> + my $sec = $rtime % 60;
> + my $hour = $min / 60;
> + my $min = $min % 60;
> + my $day = $hour / 24;
> + my $hour = $hour % 24;
> + my @times;
> +
> + if ($day) {
> + @times = ($day, $hour, $min, $sec);
> + } elsif ($hour) {
> + @times = ($hour, $min, $sec);
> + } else {
> + @times = ($min, $sec);
> + }
> +
> + my $res = join(':', @times);
> + $res =~ s/\b(\d)\b/0$1/g;
> + return $res;
> +}
> +
> +sub add_tr
> +{
> + my ($phase, $section, $mpi_version, $duration_human, $pass, $fail, $timed, $skipped, $rep_file_url) = @_;
> + my $trClass = "Passed";
> + if ($fail or $timed) {
> + $trClass = "Error";
> + }
> +
> + my $tr = "<tr valign='top' class='$trClass'>\n";
> + $tr .= "<td><a href='$rep_file_url'>$phase</a></td><td>$section</td><td>$mpi_version</td><td>$duration_human</td><td>$pass</td><td>$fail</td><td>$timed</td><td>$skipped</td>\n</tr>\n";
> +
> + return $tr;
> +}
> +
> +sub get_css_template
> +{
> + my $tmpl = '
> + <html xmlns:lxslt="http://xml.apache.org/xslt" xmlns:stringutils="xalan://org.apache.tools.ant.util.StringUtils">
> + <META http-equiv="Content-Type" content="text/html; charset=US-ASCII">
> + <head>
> + <style type="text/css" media=screen>
> + body {
> + font:normal 68% verdana,arial,helvetica;
> + color:#000000;
> + }
> + table tr td, table tr th {
> + font-size: 68%;
> + }
> + table.details tr th{
> + font-weight: bold;
> + text-align:left;
> + background:#a6caf0;
> + }
> + table.details tr td{
> + background:#eeeee0;
> + }
> + p {
> + line-height:1.5em;
> + margin-top:0.5em; margin-bottom:1.0em;
> + }
> + h1 {
> + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
> + }
> + h2 {
> + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
> + }
> + h3 {
> + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
> + }
> + h4 {
> + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
> + }
> + h5 {
> + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
> + }
> + h6 {
> + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
> + }
> + .Error {
> + font-weight:bold; color:red;
> + }
> + .Failure {
> + font-weight:bold; color:purple;
> + }
> + .Properties {
> + text-align:right;
> + }
> + </style>
> + </head>
> + ';
> + return $tmpl;
> +}
> +
> +sub get_html_summary_report_template
> +{
> + my $css = get_css_template();
> + my $values_replace = {};
> + $values_replace->{'REPORT_DATE'} = `date +%F` ." ". `date +%k:%M:%S`;
> + $values_replace->{'OFED_VERSION'} = `ofed_info -s`;
> + $values_replace->{'CLUSTER_NAME'} = MTT::Values::Functions::cluster_name();
> +
> + my $helpper_hash = {};
> +
> + my $ini = $MTT::Globals::Internals->{ini};
> + my @sects = $ini->Sections();
> + my $product_version;
> + my $skip_section;
> + if ($MTT::Globals::Values->{shuffle_tests}->{sections})
> + {
> + MTT::Util::shuffle(\@sects);
> + }
> + foreach my $section (@sects)
> + {
> + print("text reporter: section $section\n");
> + if ($section =~ /^\s*mpi install:/)
> + {
> + my $sim_sec_name = GetSimpleSection($section);
> + $product_version = MTT::Values::Value($ini, "mpi install: $sim_sec_name",'product_version');
> + $skip_section = MTT::Values::Value($ini, "mpi install: $sim_sec_name",'skip_section');
> + if(!defined($helpper_hash->{$product_version}) && $skip_section == 0)
> + {
> + $values_replace->{'PRODUCT'} .= $product_version . " ";
> + $helpper_hash->{$product_version} = 1;
> + }
> + }
> + }
> +
> + my $tmpl = '
> + <title>MTT Results: Summary</title>
> + <h1>MTT Results</h1>
> + <hr size="1">
> + </tbody></table>
> + <h2>Additional info</h2>
> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
> + <tbody><tr valign="top">
> + <th>report date</th><th>product</th><th>ofed version</th><th nowrap="">cluster name</th>
> + </tr>
> + <tr valign="top" class="Pass">
> + <td>%REPORT_DATE%</td><td>%PRODUCT%</td><td>%OFED_VERSION%</td><td>%CLUSTER_NAME%</td>
> + </tr>
> + </tbody></table>
> + <h2>Summary</h2>
> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
> + <tr valign="top">
> + <th>Phase</th><th>Section</th><th>MPI Version</th><th>Duration</th><th>Pass</th><th>Fail</th><th>Time Out</th><th>Skip</th>
> + </tr>
> + %TESTS_RESULTS%
> + </table>
> + <h2>Totals</h2>
> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
> + <tr valign="top">
> + <th>Tests</th><th>Failed</th><th>Passed</th><th nowrap>Duration</th>
> + </tr>
> + <tr valign="top" class="Pass">
> + %TOTALS%
> + </tr>
> + </table>
> +
> + </body>
> + </html>
> + ';
> + my $tmp2;
> + foreach my $key (keys %{$values_replace})
> + {
> + $tmp2 = $values_replace->{$key};
> + $tmpl =~ s/%$key%/$tmp2/;
> + }
> + return $css . $tmpl;
> +}
> +
> +
> +sub get_html_phase_report_table_start_template
> +{
> + my $tmpl = '
> + <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
> + <tr valign="top">
> + <th width="20%">Field</th><th>Value</th>
> + </tr>
> + ';
> + return $tmpl;
> +}
> +sub get_html_phase_report_table_stop_template
> +{
> + my $tmpl = '
> + </table>
> + ';
> + return $tmpl;
> +}
> +sub get_html_phase_report_template_start
> +{
> + my $css = get_css_template();
> + my $tmpl = '
> + <title>Phase report</title>
> + <h1>MTT Report for single phase execution</h1>
> + <hr size="1">
> + <h2>Report</h2>
> + ';
> + return $css . $tmpl;
> +}
> +
> +sub get_html_phase_report_template_stop
> +{
> + my $tmpl = '
> + </body>
> + </html>
> + ';
> + return $tmpl;
> +}
> +1;
> _______________________________________________
> mtt-svn mailing list
> mtt-svn_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/mtt-svn

-- 
Jeff Squyres
jsquyres_at_[hidden]
For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/