mtr_report.pl

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PL 代码 · 共 431 行

PL
431
字号
# -*- cperl -*-# Copyright (C) 2004-2006 MySQL AB# # 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; version 2 of the License.# # 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 St, Fifth Floor, Boston, MA  02110-1301  USA# This is a library file used by the Perl version of mysql-test-run,# and is part of the translation of the Bourne shell script with the# same name.use strict;use warnings;sub mtr_report_test_name($);sub mtr_report_test_passed($);sub mtr_report_test_failed($);sub mtr_report_test_skipped($);sub mtr_report_test_not_skipped_though_disabled($);sub mtr_report_stats ($);sub mtr_print_line ();sub mtr_print_thick_line ();sub mtr_print_header ();sub mtr_report (@);sub mtr_warning (@);sub mtr_error (@);sub mtr_child_error (@);sub mtr_debug (@);sub mtr_verbose (@);my $tot_real_time= 0;################################################################################  ###############################################################################sub mtr_report_test_name ($) {  my $tinfo= shift;  _mtr_log("$tinfo->{name}");  printf "%-30s ", $tinfo->{'name'};}sub mtr_report_test_skipped ($) {  my $tinfo= shift;  $tinfo->{'result'}= 'MTR_RES_SKIPPED';  if ( $tinfo->{'disable'} )  {    mtr_report("[ disabled ]  $tinfo->{'comment'}");  }  elsif ( $tinfo->{'comment'} )  {    mtr_report("[ skipped ]   $tinfo->{'comment'}");  }  else  {    mtr_report("[ skipped ]");  }}sub mtr_report_tests_not_skipped_though_disabled ($) {  my $tests= shift;  if ( $::opt_enable_disabled )  {    my @disabled_tests= grep {$_->{'dont_skip_though_disabled'}} @$tests;    if ( @disabled_tests )    {      print "\nTest(s) which will be run though they are marked as disabled:\n";      foreach my $tinfo ( sort {$a->{'name'} cmp $b->{'name'}} @disabled_tests )      {        printf "  %-20s : %s\n", $tinfo->{'name'}, $tinfo->{'comment'};      }    }  }}sub mtr_report_test_passed ($) {  my $tinfo= shift;  my $timer=  "";  if ( $::opt_timer and -f "$::opt_vardir/log/timer" )  {    $timer= mtr_fromfile("$::opt_vardir/log/timer");    $tot_real_time += ($timer/1000);    $timer= sprintf "%12s", $timer;  }  $tinfo->{'result'}= 'MTR_RES_PASSED';  mtr_report("[ pass ]   $timer");}sub mtr_report_test_failed ($) {  my $tinfo= shift;  $tinfo->{'result'}= 'MTR_RES_FAILED';  if ( defined $tinfo->{'timeout'} )  {    mtr_report("[ fail ]  timeout");    return;  }  else  {    mtr_report("[ fail ]");  }  if ( $tinfo->{'comment'} )  {    # The test failure has been detected by mysql-test-run.pl    # when starting the servers or due to other error, the reason for    # failing the test is saved in "comment"    mtr_report("\nERROR: $tinfo->{'comment'}");  }  elsif ( -f $::path_timefile )  {    # Test failure was detected by test tool and it's report    # about what failed has been saved to file. Display the report.    print "\n";    print mtr_fromfile($::path_timefile); # FIXME print_file() instead    print "\n";  }  else  {    # Neither this script or the test tool has recorded info    # about why the test has failed. Should be debugged.    mtr_report("\nUnexpected termination, probably when starting mysqld");;  }}sub mtr_report_stats ($) {  my $tests= shift;  # ----------------------------------------------------------------------  # Find out how we where doing  # ----------------------------------------------------------------------  my $tot_skiped= 0;  my $tot_passed= 0;  my $tot_failed= 0;  my $tot_tests=  0;  my $tot_restarts= 0;  my $found_problems= 0; # Some warnings in the logfiles are errors...  foreach my $tinfo (@$tests)  {    if ( $tinfo->{'result'} eq 'MTR_RES_SKIPPED' )    {      $tot_skiped++;    }    elsif ( $tinfo->{'result'} eq 'MTR_RES_PASSED' )    {      $tot_tests++;      $tot_passed++;    }    elsif ( $tinfo->{'result'} eq 'MTR_RES_FAILED' )    {      $tot_tests++;      $tot_failed++;    }    if ( $tinfo->{'restarted'} )    {      $tot_restarts++;    }  }  # ----------------------------------------------------------------------  # Print out a summary report to screen  # ----------------------------------------------------------------------  if ( ! $tot_failed )  {    print "All $tot_tests tests were successful.\n";  }  else  {    my $ratio=  $tot_passed * 100 / $tot_tests;    print "Failed $tot_failed/$tot_tests tests, ";    printf("%.2f", $ratio);    print "\% were successful.\n\n";    print      "The log files in var/log may give you some hint\n",      "of what went wrong.\n",      "If you want to report this error, please read first ",      "the documentation at\n",      "http://www.mysql.com/doc/en/MySQL_test_suite.html\n";  }  if (!$::opt_extern)  {    print "The servers were restarted $tot_restarts times\n";  }  if ( $::opt_timer )  {    use English;    mtr_report("Spent", sprintf("%.3f", $tot_real_time),"of",	       time - $BASETIME, "seconds executing testcases");  }  # ----------------------------------------------------------------------  # If a debug run, there might be interesting information inside  # the "var/log/*.err" files. We save this info in "var/log/warnings"  # ----------------------------------------------------------------------  if ( ! $::glob_use_running_server )  {    # Save and report if there was any fatal warnings/errors in err logs    my $warnlog= "$::opt_vardir/log/warnings";    unless ( open(WARN, ">$warnlog") )    {      mtr_warning("can't write to the file \"$warnlog\": $!");    }    else    {      # We report different types of problems in order      foreach my $pattern ( "^Warning:", "^Error:", "^==.* at 0x",			    "InnoDB: Warning", "missing DBUG_RETURN",			    "mysqld: Warning",			    "Attempting backtrace", "Assertion .* failed" )      {        foreach my $errlog ( sort glob("$::opt_vardir/log/*.err") )        {	  my $testname= "";          unless ( open(ERR, $errlog) )          {            mtr_warning("can't read $errlog");            next;          }          while ( <ERR> )          {            # Skip some non fatal warnings from the log files            if ( /Warning:\s+Table:.* on (delete|rename)/ or                 /Warning:\s+Setting lower_case_table_names=2/ or                 /Warning:\s+One can only use the --user.*root/ or	         /InnoDB: Warning: we did not need to do crash recovery/)            {              next;                       # Skip these lines            }	    if ( /CURRENT_TEST: (.*)/ )	    {	      $testname= $1;	    }            if ( /$pattern/ )            {              $found_problems= 1;              print WARN basename($errlog) . ": $testname: $_";            }          }        }      }      if ( $::opt_check_testcases )      {        # Look for warnings produced by mysqltest in testname.warnings        foreach my $test_warning_file	  ( glob("$::glob_mysql_test_dir/r/*.warnings") )        {          $found_problems= 1;	  print WARN "Check myqltest warnings in $test_warning_file\n";        }      }      if ( $found_problems )      {	mtr_warning("Got errors/warnings while running tests, please examine",		    "\"$warnlog\" for details.");      }    }  }  print "\n";  # Print a list of testcases that failed  if ( $tot_failed != 0 )  {    my $test_mode= join(" ", @::glob_test_mode) || "default";    print "mysql-test-run in $test_mode mode: *** Failing the test(s):";    foreach my $tinfo (@$tests)    {      if ( $tinfo->{'result'} eq 'MTR_RES_FAILED' )      {        print " $tinfo->{'name'}";      }    }    print "\n";  }  # Print a list of check_testcases that failed(if any)  if ( $::opt_check_testcases )  {    my @check_testcases= ();    foreach my $tinfo (@$tests)    {      if ( defined $tinfo->{'check_testcase_failed'} )      {	push(@check_testcases, $tinfo->{'name'});      }    }    if ( @check_testcases )    {      print "Check of testcase failed for: ";      print join(" ", @check_testcases);      print "\n\n";    }  }  if ( $tot_failed != 0 || $found_problems)  {    mtr_error("there were failing test cases");  }}################################################################################  Text formatting###############################################################################sub mtr_print_line () {  print '-' x 55, "\n";}sub mtr_print_thick_line () {  print '=' x 55, "\n";}sub mtr_print_header () {  print "\n";  if ( $::opt_timer )  {    print "TEST                           RESULT         TIME (ms)\n";  }  else  {    print "TEST                           RESULT\n";  }  mtr_print_line();  print "\n";}################################################################################  Log and reporting functions###############################################################################use IO::File;my $log_file_ref= undef;sub mtr_log_init ($) {  my ($filename)= @_;  mtr_error("Log is already open") if defined $log_file_ref;  $log_file_ref= IO::File->new($filename, "a") or    mtr_warning("Could not create logfile $filename: $!");}sub _mtr_log (@) {  print $log_file_ref join(" ", @_),"\n"    if defined $log_file_ref;}sub mtr_report (@) {  # Print message to screen and log  _mtr_log(@_);  print join(" ", @_),"\n";}sub mtr_warning (@) {  # Print message to screen and log  _mtr_log("WARNING: ", @_);  print STDERR "mysql-test-run: WARNING: ",join(" ", @_),"\n";}sub mtr_error (@) {  # Print message to screen and log  _mtr_log("ERROR: ", @_);  print STDERR "mysql-test-run: *** ERROR: ",join(" ", @_),"\n";  mtr_exit(1);}sub mtr_child_error (@) {  # Print message to screen and log  _mtr_log("ERROR(child): ", @_);  print STDERR "mysql-test-run: *** ERROR(child): ",join(" ", @_),"\n";  exit(1);}sub mtr_debug (@) {  # Only print if --script-debug is used  if ( $::opt_script_debug )  {    _mtr_log("###: ", @_);    print STDERR "####: ",join(" ", @_),"\n";  }}sub mtr_verbose (@) {  # Always print to log, print to screen only when --verbose is used  _mtr_log("> ",@_);  if ( $::opt_verbose )  {    print STDERR "> ",join(" ", @_),"\n";  }}1;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?