mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-02 02:34:19 +00:00
333 lines
6.6 KiB
Perl
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;
|