mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-17 17:27:57 +00:00
Rewrite pt-diskstats.t but all tests need to be fixed. Update modules in pt-diskstats, use PTDEBUG, check regex opts. Remove output_fh from Diskstats. Fix DiskstatsMenu header so update-modules can see it.
This commit is contained in:
744
bin/pt-diskstats
744
bin/pt-diskstats
File diff suppressed because it is too large
Load Diff
@@ -77,7 +77,6 @@ sub new {
|
||||
# Defaults
|
||||
filename => '/proc/diskstats',
|
||||
block_size => 512,
|
||||
output_fh => \*STDOUT,
|
||||
zero_rows => $o->get('zero-rows'),
|
||||
sample_time => $o->get('sample-time') || 0,
|
||||
column_regex => qr/$columns/,
|
||||
@@ -181,25 +180,6 @@ sub set_interactive {
|
||||
}
|
||||
}
|
||||
|
||||
# Checks whenever said filehandle is open. If it's not, defaults to STDOUT.
|
||||
sub output_fh {
|
||||
my ( $self ) = @_;
|
||||
if ( !$self->{output_fh} || !$self->{output_fh}->opened ) {
|
||||
$self->{output_fh} = \*STDOUT;
|
||||
}
|
||||
return $self->{output_fh};
|
||||
}
|
||||
|
||||
# It sets or returns the currently set filehandle, kind of like a poor man's
|
||||
# select().
|
||||
sub set_output_fh {
|
||||
my ( $self, $new_fh ) = @_;
|
||||
# ->opened comes from IO::Handle.
|
||||
if ( $new_fh && ref($new_fh) && $new_fh->opened ) {
|
||||
$self->{output_fh} = $new_fh;
|
||||
}
|
||||
}
|
||||
|
||||
sub column_regex {
|
||||
my ( $self ) = @_;
|
||||
return $self->{column_regex};
|
||||
@@ -812,7 +792,7 @@ sub _calc_deltas {
|
||||
sub print_header {
|
||||
my ($self, $header, @args) = @_;
|
||||
if ( $self->{_print_header} ) {
|
||||
printf { $self->output_fh() } $header . "\n", @args;
|
||||
printf $header . "\n", @args;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -830,8 +810,7 @@ sub print_rows {
|
||||
sprintf("%7.1f", $_) != 0
|
||||
} @{ $stat }{ @$cols };
|
||||
}
|
||||
printf { $self->output_fh() } $format . "\n",
|
||||
@{ $stat }{ qw( line_ts dev ), @$cols };
|
||||
printf $format . "\n", @{ $stat }{ qw( line_ts dev ), @$cols };
|
||||
}
|
||||
|
||||
sub print_deltas {
|
||||
|
@@ -15,7 +15,7 @@
|
||||
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
# Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
# ###########################################################################
|
||||
# DiskstatsMenu
|
||||
# DiskstatsMenu package
|
||||
# ###########################################################################
|
||||
{
|
||||
package DiskstatsMenu;
|
||||
|
@@ -9,7 +9,7 @@ BEGIN {
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More tests => 112;
|
||||
use Test::More tests => 108;
|
||||
|
||||
use PerconaTest;
|
||||
|
||||
@@ -33,7 +33,7 @@ $o->get_opts();
|
||||
my $obj = new Diskstats(OptionParser => $o);
|
||||
|
||||
can_ok( $obj, qw(
|
||||
output_fh column_regex device_regex filename
|
||||
column_regex device_regex filename
|
||||
block_size ordered_devs clear_state clear_ordered_devs
|
||||
stats_for prev_stats_for first_stats_for
|
||||
has_stats design_print_formats parse_diskstats_line
|
||||
@@ -49,7 +49,6 @@ for my $attr (
|
||||
[ column_regex => qr/!!!/ ],
|
||||
[ device_regex => qr/!!!/ ],
|
||||
[ block_size => 215 ],
|
||||
[ output_fh => \*STDERR ],
|
||||
[ zero_rows => 1 ],
|
||||
[ sample_time => 1 ],
|
||||
[ interactive => 1 ],
|
||||
@@ -249,23 +248,6 @@ for my $method ( qw( curr_ts prev_ts first_ts ) ) {
|
||||
ok(!$obj->$method(), "Diskstats->clear_ts does as advertized");
|
||||
}
|
||||
|
||||
# ############################################################################
|
||||
# output_fh
|
||||
# ############################################################################
|
||||
|
||||
is($obj->output_fh(), \*STDOUT, "by default, outputs to STDOUT");
|
||||
|
||||
open my $fh, "<", \my $tmp;
|
||||
$obj->set_output_fh($fh);
|
||||
is($obj->output_fh(), $fh, "Changing it works");
|
||||
|
||||
close($fh);
|
||||
is(
|
||||
$obj->output_fh(),
|
||||
\*STDOUT,
|
||||
"and if we close the set filehandle, it reverts to STDOUT"
|
||||
);
|
||||
|
||||
# ############################################################################
|
||||
# Adding, removing and listing devices.
|
||||
# ############################################################################
|
||||
|
@@ -9,48 +9,18 @@ BEGIN {
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use English qw(-no_match_vars);
|
||||
use Test::More tests => 16;
|
||||
use File::Spec;
|
||||
use File::Temp ();
|
||||
use Test::More tests => 15;
|
||||
|
||||
use PerconaTest;
|
||||
use pt_diskstats;
|
||||
|
||||
my ($fh, $tempfile) = File::Temp::tempfile(
|
||||
"diskstats.test.XXXXXXXXX",
|
||||
OPEN => 1, UNLINK => 1 );
|
||||
|
||||
my $iterations = 2;
|
||||
my $out = output( sub {
|
||||
pt_diskstats::main(
|
||||
"--group-by" => "all",
|
||||
"--columns" => "cnc|rt|mb|busy|prg",
|
||||
"--save-samples" => $tempfile,
|
||||
"--iterations" => $iterations,
|
||||
"--zero-rows",
|
||||
);
|
||||
});
|
||||
|
||||
my $o = new OptionParser(description => 'Diskstats');
|
||||
$o->get_specs("$trunk/bin/pt-diskstats");
|
||||
|
||||
my $count = 0;
|
||||
Diskstats->new(
|
||||
OptionParser => $o,
|
||||
)->parse_from( filename => $tempfile, sample_callback => sub { $count++ } );
|
||||
|
||||
is(
|
||||
$count,
|
||||
$iterations,
|
||||
"--save-samples and --iterations work"
|
||||
);
|
||||
|
||||
close $fh;
|
||||
1 while unlink $tempfile;
|
||||
require "$trunk/bin/pt-diskstats";
|
||||
|
||||
# pt-diskstats is an interactive-only tool. It waits for user input
|
||||
# (i.e. menu commands) via STDIN. So we cannot just run it with input,
|
||||
# get ouput, then test that output. We have to tie STDIN to these subs
|
||||
# so that we can fake sending pt-diskstats menu commands via STDIN.
|
||||
# All we do is send 'q', the command to quit. See the note in the bottom
|
||||
# of this file about *DATA. Please don't close it.
|
||||
{
|
||||
# Tie magic. During the tests we tie STDIN to always return a lone "q".
|
||||
# See the note in the bottom of this file about *DATA. Please don't close it.
|
||||
sub Test::TIEHANDLE {
|
||||
return bless {}, "Test";
|
||||
}
|
||||
@@ -64,32 +34,62 @@ sub Test::READLINE {
|
||||
}
|
||||
}
|
||||
|
||||
for my $ext ( qw( all disk sample ) ) {
|
||||
for my $filename ( map "diskstats-00$_.txt", 1..5 ) {
|
||||
my $expected = load_file(
|
||||
File::Spec->catfile( "t", "pt-diskstats",
|
||||
"expected", "${ext}_int_$filename"
|
||||
),
|
||||
);
|
||||
|
||||
my $got = output( sub {
|
||||
sub test_diskstats_file {
|
||||
my (%args) = @_;
|
||||
my $file = "$trunk/t/pt-diskstats/samples/$args{file}";
|
||||
die "$file does not exist" unless -f $file;
|
||||
foreach my $groupby ( qw(all disk sample) ) {
|
||||
ok(
|
||||
no_diff(
|
||||
sub {
|
||||
tie local *STDIN, "Test";
|
||||
my $file = File::Spec->catfile( $trunk, "t", "pt-diskstats",
|
||||
"samples", $filename );
|
||||
pt_diskstats::main(
|
||||
"--group-by" => $ext,
|
||||
"--columns" => "cnc|rt|mb|busy|prg",
|
||||
"--zero-rows",
|
||||
$file
|
||||
qw(--zero-rows --group-by), $groupby,
|
||||
'--columns','cnc|rt|mb|busy|prg',
|
||||
$file);
|
||||
},
|
||||
"t/pt-diskstats/expected/${groupby}_int_$args{file}",
|
||||
keep_output=>1,
|
||||
),
|
||||
"$args{file} --group-by $groupby"
|
||||
);
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
is($got, $expected, "--group-by $ext for $filename gets the same results as the shell version");
|
||||
}
|
||||
foreach my $file ( map "diskstats-00$_.txt", 1..5 ) {
|
||||
test_diskstats_file(file => $file);
|
||||
}
|
||||
|
||||
# ###########################################################################
|
||||
# --save-samples and --iterations
|
||||
# ###########################################################################
|
||||
|
||||
# TODO: fix this
|
||||
|
||||
#my $iterations = 2;
|
||||
#my $out = output( sub {
|
||||
# pt_diskstats::main(
|
||||
# "--group-by" => "all",
|
||||
# "--columns" => "cnc|rt|mb|busy|prg",
|
||||
# "--save-samples" => $tempfile,
|
||||
# "--iterations" => $iterations,
|
||||
# "--zero-rows",
|
||||
# );
|
||||
#});
|
||||
#
|
||||
#is(
|
||||
# $count,
|
||||
# $iterations,
|
||||
# "--save-samples and --iterations work"
|
||||
#);
|
||||
|
||||
|
||||
# ###########################################################################
|
||||
# Done.
|
||||
# ###########################################################################
|
||||
exit;
|
||||
|
||||
__DATA__
|
||||
Leave this here!
|
||||
We tie STDIN during the tests, and fake the fileno by giving it *DATA's result;
|
||||
These lines here make Perl leave *DATA open.
|
||||
|
||||
|
Reference in New Issue
Block a user