Files
percona-toolkit/t/lib/ReportFormatter.t
2013-01-14 12:49:55 -03:00

502 lines
13 KiB
Perl

#!/usr/bin/perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More tests => 22;
use Transformers;
use ReportFormatter;
use PerconaTest;
my $rf = new ReportFormatter();
isa_ok($rf, 'ReportFormatter');
# #############################################################################
# truncate_value()
# #############################################################################
is(
$rf->truncate_value(
{truncate_mark=>'...', truncate_side=>'right'},
"hello world",
7,
),
"hell...",
"truncate_value(), right side"
);
is(
$rf->truncate_value(
{truncate_mark=>'...', truncate_side=>'left'},
"hello world",
7,
),
"...orld",
"truncate_value(), left side"
);
is(
$rf->truncate_value(
{truncate_mark=>'...', truncate_side=>'left'},
"hello world",
11,
),
"hello world",
"truncate_value(), max width == val width"
);
is(
$rf->truncate_value(
{truncate_mark=>'...', truncate_side=>'left'},
"hello world",
100,
),
"hello world",
"truncate_value(), max width > val width"
);
# #############################################################################
# truncate_callback
# #############################################################################
$rf->set_columns(
{ name => 'foo', width => 5, },
{ name => 'bar', width => 5, },
);
$rf->add_line('1234567890', '1234567890');
my $callback = sub {
my ($col, $val, $print_width) = @_;
return 'foo';
};
is(
$rf->get_report(truncate_callback=>$callback),
"# foo bar
# ===== =====
# foo foo
",
"Truncate callback"
);
# #############################################################################
# Basic report.
# #############################################################################
$rf = new ReportFormatter();
$rf->title('Checksum differences');
$rf->set_columns(
{
name => 'Query ID',
width_fixed => length '0x234DDDAC43820481-3',
},
{
name => 'db-1.foo.com',
},
{
name => '123.123.123.123',
},
);
$rf->add_line(qw(0x3A99CC42AEDCCFCD-1 ABC12345 ADD12345));
$rf->add_line(qw(0x234DDDAC43820481-3 0007C99B BB008171));
is(
$rf->get_report(),
"# Checksum differences
# Query ID db-1.foo.com 123.123.123.123
# ==================== ============ ===============
# 0x3A99CC42AEDCCFCD-1 ABC12345 ADD12345
# 0x234DDDAC43820481-3 0007C99B BB008171
",
'Basic report'
);
# #############################################################################
# Header that's too wide.
# #############################################################################
$rf = new ReportFormatter();
$rf->set_columns(
{ name => 'We are very long header columns that are going to cause', },
{ name => 'this sub to die because together we cannot fit on one line' },
);
is(
$rf->get_report(),
"# ...ader columns that are going to cause ...e together we cannot fit on one l
# ======================================= ====================================
",
"Full auto-fit columns to line"
);
$rf = new ReportFormatter();
$rf->set_columns(
{
name => 'We are very long header columns that are going to cause',
width_pct => 40,
},
{
name => 'this sub to die because together we cannot fit on one line',
width_pct => 60,
},
);
is(
$rf->get_report(),
"# ...umns that are going to cause ... because together we cannot fit on one li
# =============================== ============================================
",
"Two fixed percentage-width columsn"
);
$rf = new ReportFormatter();
$rf->set_columns(
{
name => 'header1',
width => 7,
},
{ name => 'this long line should take up the rest of the line.......!', },
);
is(
$rf->get_report(),
"# header1 this long line should take up the rest of the line.......!
# ======= ====================================================================
",
"One fixed char-width column and one auto-width column"
);
# #############################################################################
# Test that header underline respects line width.
# #############################################################################
$rf = new ReportFormatter();
$rf->set_columns(
{ name => 'col1' },
{ name => 'col2' },
);
$rf->add_line('short', 'long long long long long long long long long long long long long long long long long long');
is(
$rf->get_report(),
"# col1 col2
# ===== ======================================================================
# short long long long long long long long long long long long long long lo...
",
'Truncate header underlining to line width'
);
# #############################################################################
# Test taht header labels are always left justified.
# #############################################################################
$rf = new ReportFormatter();
$rf->set_columns(
{ name => 'Rank', right_justify => 1, },
{ name => 'Query ID', },
{ name => 'Response time', right_justify => 1, },
{ name => 'Calls', right_justify => 1, },
{ name => 'R/Call', right_justify => 1, },
{ name => 'Item', },
);
$rf->add_line(
'123456789', '0x31DA25F95494CA95', '0.1494 99.9%', '1', '0.1494', 'SHOW');
is(
$rf->get_report(),
"# Rank Query ID Response time Calls R/Call Item
# ========= ================== ============= ===== ====== ====
# 123456789 0x31DA25F95494CA95 0.1494 99.9% 1 0.1494 SHOW
",
'Header labels are always left justified'
);
# #############################################################################
# Respect line width.
# #############################################################################
$rf = new ReportFormatter();
$rf->title('Respect line width');
$rf->set_columns(
{ name => 'col1' },
{ name => 'col2' },
{ name => 'col3' },
);
$rf->add_line(
'short',
'longer',
'long long long long long long long long long long long long long long long long long long'
);
$rf->add_line(
'a',
'b',
'c',
);
is(
$rf->get_report(),
"# Respect line width
# col1 col2 col3
# ===== ====== ===============================================================
# short longer long long long long long long long long long long long long ...
# a b c
",
'Respects line length'
);
# #############################################################################
# extend_right
# #############################################################################
$rf = new ReportFormatter(extend_right=>1);
$rf->title('extend_right');
$rf->set_columns(
{ name => 'col1' },
{ name => 'col2' },
{ name => 'col3' },
);
$rf->add_line(
'short',
'longer',
'long long long long long long long long long long long long long long long long long long'
);
$rf->add_line(
'a',
'b',
'c',
);
is(
$rf->get_report(),
"# extend_right
# col1 col2 col3
# ===== ====== ===============================================================
# short longer long long long long long long long long long long long long long long long long long long
# a b c
",
"Allow right-most column to extend beyond line width"
);
# #############################################################################
# Relvative column widths.
# #############################################################################
$rf = new ReportFormatter();
$rf->title('Relative col widths');
$rf->set_columns(
{ name => 'col1', width_pct=>'20', },
{ name => 'col2', width_pct=>'40', },
{ name => 'col3', width_pct=>'40', },
);
$rf->add_line(
'shortest',
'a b c d e f g h i j k l m n o p',
'seoncd longest line',
);
$rf->add_line(
'x',
'y',
'z',
);
is(
$rf->get_report(),
"# Relative col widths
# col1 col2 col3
# =============== =============================== ============================
# shortest a b c d e f g h i j k l m n o p seoncd longest line
# x y z
",
"Relative col widths that fit"
);
$rf = new ReportFormatter();
$rf->title('Relative col widths');
$rf->set_columns(
{ name => 'col1', width_pct=>'20', },
{ name => 'col2', width_pct=>'40', },
{ name => 'col3', width_pct=>'40', },
);
$rf->add_line(
'shortest',
'a b c d e f g h i j k l m n o p',
'seoncd longest line',
);
$rf->add_line(
'x',
'y',
'z',
);
$rf->add_line(
'this line is going to have to be truncated because it is too long',
'this line is ok',
'and this line will have to be truncated, too',
);
is(
$rf->get_report(),
"# Relative col widths
# col1 col2 col3
# =============== =============================== ============================
# shortest a b c d e f g h i j k l m n o p seoncd longest line
# x y z
# this line is... this line is ok and this line will have t...
",
"Relative columns made smaller to fit"
);
$rf = new ReportFormatter();
$rf->title('Relative col widths');
$rf->set_columns(
{ name => 'col1', width =>'25', },
{ name => 'col2', width_pct=>'33', },
{ name => 'col3', width_pct=>'33', },
);
$rf->add_line(
'shortest',
'a b c d e f g h i j k l m n o p',
'seoncd longest line',
);
$rf->add_line(
'x',
'y',
'z',
);
$rf->add_line(
'1234567890123456789012345xxxxxx',
'this line is ok',
'and this line will have to be truncated, too',
);
is(
$rf->get_report(),
"# Relative col widths
# col1 col2 col3
# ========================= ========================= ========================
# shortest a b c d e f g h i j k ... seoncd longest line
# x y z
# 1234567890123456789012... this line is ok and this line will ha...
",
"Fixed and relative columns"
);
$rf = new ReportFormatter();
$rf->title('Short cols');
$rf->set_columns(
{ name => 'I am column1', },
{ name => 'I am column2', },
{ name => "I don't know who I am", },
);
$rf->add_line(
'',
'',
'',
);
is(
$rf->get_report(),
"# Short cols
# I am column1 I am column2 I don't know who I am
# ========================= ========================= ========================
#
",
"Short columsn, blank data"
);
$rf = new ReportFormatter();
$rf->title('Short cols');
$rf->set_columns(
{ name => 'I am column1', },
{ name => 'I am column2', },
{ name => "I don't know who I am", },
);
$rf->add_line(undef,undef,undef);
is(
$rf->get_report(),
"# Short cols
# I am column1 I am column2 I don't know who I am
# ========================= ========================= ========================
#
",
"Short columsn, undef data"
);
$rf = new ReportFormatter();
$rf->title('Short cols');
$rf->set_columns(
{ name => 'I am column1', },
{ name => 'I am column2', },
{ name => "I don't know who I am", },
);
$rf->add_line('','','');
$rf->add_line(qw(a b c));
is(
$rf->get_report(),
"# Short cols
# I am column1 I am column2 I don't know who I am
# ============ ============ =====================
#
# a b c
",
"Short columsn, blank and short data"
);
# #############################################################################
# Issue 1196: mk-query-digest --explain is broken
# #############################################################################
$rf = new ReportFormatter(
line_width => 82,
long_last_column => 1,
extend_right => 1,
);
my @cols = (
{ name => 'Rank', right_justify => 1, },
{ name => 'Query ID', },
{ name => 'Response time', right_justify => 1, },
{ name => 'Calls', right_justify => 1, },
{ name => 'R/Call', right_justify => 1, },
{ name => 'Apdx', right_justify => 1, width => 4, },
{ name => 'V/M', right_justify => 1, width => 5, },
{ name => 'EXPLAIN' },
{ name => 'Item', },
);
$rf->set_columns(@cols);
$rf->add_line(
'1',
'0x0F52986F18B3A4D0',
' 0.0000 100.0%', # leading whitespace
'1',
'0.0000',
'1.00',
'0.00',
"", # EXPLAIN column
'SELECT trees',
);
my $output = $rf->get_report();
ok(
no_diff(
$output,
"t/lib/samples/ReportFormatter/report001.txt",
cmd_output => 1,
),
'Whitespace stripped (issue 1196)',
);
# #############################################################################
# Done.
# #############################################################################
$output = '';
{
local *STDERR;
open STDERR, '>', \$output;
$rf->_d('Complete test coverage');
}
like(
$output,
qr/Complete test coverage/,
'_d() works'
);
exit;