Files
percona-toolkit/t/lib/MySQLStatusWaiter.t
2017-03-09 14:49:58 -03:00

333 lines
6.6 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 POSIX qw( ceil floor );
use English qw(-no_match_vars);
use Test::More tests => 10;
use MySQLStatusWaiter;
use PerconaTest;
my $oktorun = 1;
my @checked = ();
my $slept = 0;
my @vals = ();
sub oktorun {
return $oktorun;
}
sub get_status {
my ($var) = @_;
push @checked, $var;
my $vals = shift @vals;
if ( $vals ) {
return $vals->{$var} || 0;
}
$oktorun = 0;
return;
}
sub sleep {
$slept++;
return;
}
# #############################################################################
# _parse_spec()
# #############################################################################
throws_ok(
sub { new MySQLStatusWaiter(
max_spec => [qw(100)],
get_status => \&get_status,
sleep => \&sleep,
oktorun => \&oktorun,
) },
qr/100 is not a variable name/,
"Catch non-variable name"
);
throws_ok(
sub { new MySQLStatusWaiter(
max_spec => [qw(foo=bar)],
get_status => \&get_status,
sleep => \&sleep,
oktorun => \&oktorun,
) },
qr/value for foo must be a number/,
"Catch non-number value"
);
throws_ok(
sub { new MySQLStatusWaiter(
max_spec => [qw(foo)],
get_status => \&get_status,
sleep => \&sleep,
oktorun => \&oktorun,
) },
qr/foo does not exist/,
"Catch non-existent variable"
);
# ############################################################################
# Initial vals + 20%
# ############################################################################
@vals = (
# initial check for existence
{ Threads_connected => 9, },
{ Threads_running => 4, },
# first check, no wait
{ Threads_connected => 1, },
{ Threads_running => 1, },
# second check, wait
{ Threads_connected => 11, }, # too high
{ Threads_running => 5, }, # too high
# third check, wait
{ Threads_connected => 11, }, # too high
{ Threads_running => 4, },
# fourth check, wait
{ Threads_connected => 10, },
{ Threads_running => 5, }, # too high
# fifth check, no wait
{ Threads_connected => 10, },
{ Threads_running => 4, },
);
$oktorun = 1;
my $sw = new MySQLStatusWaiter(
oktorun => \&oktorun,
get_status => \&get_status,
sleep => \&sleep,
max_spec => [qw(Threads_connected Threads_running)],
);
SKIP: {
diag "Skipping test Threshold = ceil(InitialValue * 1.2)";
skip 'FIXME', 0;
is_deeply(
$sw->max_values(),
{
Threads_connected => ceil(9 + (9 * 0.20)),
Threads_running => ceil(4 + (4 * 0.20)),
},
"Threshold = ceil(InitialValue * 1.2)"
);
}
# first check
@checked = ();
$slept = 0;
$sw->wait();
SKIP: {
diag 'Skipping test Rechecked all variables';
skip 'FIXME', 0;
is_deeply(
\@checked,
[qw(Threads_connected Threads_running)],
"Checked both vars"
);
is(
$slept,
0,
"Vals not too high, did not sleep"
);
# second through fifth checks
@checked = ();
$slept = 0;
$sw->wait();
is_deeply(
\@checked,
[qw(
Threads_connected Threads_running
Threads_connected Threads_running
Threads_connected Threads_running
Threads_connected Threads_running
)],
"Rechecked all variables"
);
}
SKIP: {
diag "Skipping test Slept until values low enough";
skip 'FIXME', 0;
is(
$slept,
3,
"Slept until values low enough"
);
}
# ############################################################################
# Use static vals.
# ############################################################################
@vals = (
# initial check for existence
{ Threads_connected => 1, },
{ Threads_running => 1, },
# first check, no wait
{ Threads_connected => 1, },
{ Threads_running => 1, },
);
$sw = new MySQLStatusWaiter(
oktorun => \&oktorun,
get_status => \&get_status,
sleep => \&sleep,
max_spec => [qw(Threads_connected=5 Threads_running=5)],
);
is_deeply(
$sw->max_values(),
{
Threads_connected => 5,
Threads_running => 5,
},
"Static max values"
);
# first check
@checked = ();
$slept = 0;
$sw->wait();
SKIP: {
diag "Skipping test Checked both vars";
skip 'FIXME', 0;
is_deeply(
\@checked,
[qw(Threads_connected Threads_running)],
"Checked both vars"
);
}
is(
$slept,
0,
"Vals not too high, did not sleep"
);
# ############################################################################
# No spec, no wait.
# ############################################################################
@vals = (
# first check, no wait
{ Threads_connected => 1, },
{ Threads_running => 1, },
);
$sw = new MySQLStatusWaiter(
oktorun => \&oktorun,
get_status => \&get_status,
sleep => \&sleep,
max_spec => [],
);
is(
$sw->max_values(),
undef,
"No spec, no max values"
);
# first check
@checked = ();
$slept = 0;
$sw->wait();
is_deeply(
\@checked,
[],
"No spec, no vars checked"
);
is(
$slept,
0,
"No spec, no sleep"
);
# ############################################################################
# Critical thresholds (with static vals).
# ############################################################################
@vals = (
# initial check for existence
{ Threads_running => 1, },
{ Threads_running => 9, },
# first check, no wait
{ Threads_running => 1, },
{ Threads_running => 9, },
);
$sw = new MySQLStatusWaiter(
oktorun => \&oktorun,
get_status => \&get_status,
sleep => \&sleep,
max_spec => [qw(Threads_running=4)],
critical_spec => [qw(Threads_running=8)],
);
@checked = ();
$slept = 0;
$sw->wait();
is(
$slept,
0,
"Vals not critical, did not sleep"
);
SKIP: {
diag "Skipping test Die on critical threshold";
skip 'FIXME', 0;
throws_ok(
sub { $sw->wait(); },
qr/Threads_running=9 exceeds its critical threshold 8/,
"Die on critical threshold"
);
}
# #############################################################################
# Done.
# #############################################################################
my $output = '';
{
local *STDERR;
open STDERR, '>', \$output;
$sw->_d('Complete test coverage');
}
like(
$output,
qr/Complete test coverage/,
'_d() works'
);
exit;