You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.3 KiB
160 lines
4.3 KiB
# -*- cperl -*-
|
|
# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License, version 2.0,
|
|
# as published by the Free Software Foundation.
|
|
#
|
|
# This program is also distributed with certain software (including
|
|
# but not limited to OpenSSL) that is licensed under separate terms,
|
|
# as designated in a particular file or component or in included license
|
|
# documentation. The authors of MySQL hereby grant you an additional
|
|
# permission to link the program and your derivative works with the
|
|
# separately licensed software that they have included with MySQL.
|
|
#
|
|
# 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, version 2.0, 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
|
|
|
|
package mtr_results;
|
|
|
|
use strict;
|
|
|
|
use IO::Handle qw[ flush ];
|
|
|
|
use base qw(Exporter);
|
|
our @EXPORT = qw(resfile_init resfile_global resfile_new_test resfile_test_info
|
|
resfile_output resfile_output_file resfile_print
|
|
resfile_print_test resfile_to_test resfile_from_test );
|
|
|
|
my $do_resfile;
|
|
my %curr_result; # Result for current test
|
|
my $curr_output; # Output for current test
|
|
|
|
END {
|
|
close RESF if $do_resfile;
|
|
}
|
|
|
|
sub resfile_init($) {
|
|
my $fname = shift;
|
|
open(RESF, " > $fname") or die("Could not open result file $fname");
|
|
%curr_result = ();
|
|
$curr_output = "";
|
|
$do_resfile = 1;
|
|
}
|
|
|
|
# Strings need to be quoted if they start with white space or ", or if
|
|
# they contain newlines. Pass a reference to the string. If the string
|
|
# is quoted, " must be escaped, thus \ also must be escaped.
|
|
sub quote_value($) {
|
|
my $stref = shift;
|
|
|
|
for ($$stref) {
|
|
return unless /^[\s"]/ or /\n/;
|
|
s/\\/\\\\/g;
|
|
s/"/\\"/g;
|
|
$_ = '"' . $_ . '"';
|
|
}
|
|
}
|
|
|
|
# Output global variable setting to result file.
|
|
sub resfile_global($$) {
|
|
return unless $do_resfile;
|
|
my ($tag, $val) = @_;
|
|
$val = join(' ', @$val) if ref($val) eq 'ARRAY';
|
|
quote_value(\$val);
|
|
print RESF "$tag : $val\n";
|
|
}
|
|
|
|
# Prepare to add results for new test
|
|
sub resfile_new_test() {
|
|
%curr_result = ();
|
|
$curr_output = "";
|
|
}
|
|
|
|
# Add or change one variable setting for current test
|
|
sub resfile_test_info($$) {
|
|
my ($tag, $val) = @_;
|
|
return unless $do_resfile;
|
|
quote_value(\$val);
|
|
$curr_result{$tag} = $val;
|
|
}
|
|
|
|
# Add to output value for current test. Will be quoted if necessary,
|
|
# truncated if length over 5000.
|
|
sub resfile_output($) {
|
|
return unless $do_resfile;
|
|
|
|
for (shift) {
|
|
my $len = length;
|
|
if ($len > 5000) {
|
|
my $trlen = $len - 5000;
|
|
$_ = substr($_, 0, 5000) . "\n[TRUNCATED $trlen chars removed]\n";
|
|
}
|
|
s/\\/\\\\/g;
|
|
s/"/\\"/g;
|
|
$curr_output .= $_;
|
|
}
|
|
}
|
|
|
|
# Add to output, read from named file
|
|
sub resfile_output_file($) {
|
|
resfile_output(::mtr_grab_file(shift)) if $do_resfile;
|
|
}
|
|
|
|
# Print text, and also append to current output if we're collecting
|
|
# results.
|
|
sub resfile_print($) {
|
|
my $txt = shift;
|
|
print($txt);
|
|
resfile_output($txt) if $do_resfile;
|
|
}
|
|
|
|
# Print results for current test, then reset (So calling a second time
|
|
# without having generated new results will have no effect).
|
|
sub resfile_print_test() {
|
|
return unless %curr_result;
|
|
|
|
print RESF "{\n";
|
|
while (my ($t, $v) = each %curr_result) {
|
|
print RESF "$t : $v\n";
|
|
}
|
|
|
|
if ($curr_output) {
|
|
chomp($curr_output);
|
|
print RESF " output : " . $curr_output . "\"\n";
|
|
}
|
|
|
|
print RESF "}\n";
|
|
IO::Handle::flush(\*RESF);
|
|
resfile_new_test();
|
|
}
|
|
|
|
# Add current test results to test object (to send from worker)
|
|
sub resfile_to_test($) {
|
|
return unless $do_resfile;
|
|
|
|
my $tinfo = shift;
|
|
my @res_array = %curr_result;
|
|
$tinfo->{'resfile'} = \@res_array;
|
|
$tinfo->{'output'} = $curr_output if $curr_output;
|
|
}
|
|
|
|
# Get test results (from worker) from test object
|
|
sub resfile_from_test($) {
|
|
return unless $do_resfile;
|
|
|
|
my $tinfo = shift;
|
|
my $res_array = $tinfo->{'resfile'};
|
|
return unless $res_array;
|
|
|
|
%curr_result = @$res_array;
|
|
$curr_output = $tinfo->{'output'} if defined $tinfo->{'output'};
|
|
}
|
|
|
|
1;
|
|
|