107 lines
4.1 KiB
Perl
107 lines
4.1 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
#########################
|
|
|
|
use strict;
|
|
use Carp;
|
|
use Test::More;
|
|
use Data::Dumper;
|
|
|
|
if ( ! defined $ENV{TEST_SOCKET} or !defined $ENV{TEST_SERVER} or !defined $ENV{TEST_BACKEND} ) {
|
|
my $msg = 'Author test. Set $ENV{TEST_SOCKET} and $ENV{TEST_SERVER} and $ENV{TEST_BACKEND} to run';
|
|
plan( skip_all => $msg );
|
|
} else {
|
|
# we dont know yet how many tests we got
|
|
plan( tests => 55237 );
|
|
}
|
|
|
|
# set an alarm
|
|
my $lastquery;
|
|
$SIG{ALRM} = sub {
|
|
my @caller = caller;
|
|
$lastquery =~ s/\n+/\n/g;
|
|
print STDERR 'last query: '.$lastquery."\n" if defined $lastquery;
|
|
confess "timeout reached:".Dumper(\@caller)."\n"
|
|
};
|
|
|
|
use_ok('Monitoring::Livestatus');
|
|
|
|
#########################
|
|
my $objects_to_test = {
|
|
# UNIX
|
|
'01 unix_single_arg' => Monitoring::Livestatus::UNIX->new( $ENV{TEST_SOCKET} ),
|
|
|
|
# TCP
|
|
'02 inet_single_arg' => Monitoring::Livestatus::INET->new( $ENV{TEST_SERVER} ),
|
|
|
|
# MULTI
|
|
'03 multi_keepalive' => Monitoring::Livestatus->new( [ $ENV{TEST_SERVER}, $ENV{TEST_SOCKET} ] ),
|
|
};
|
|
|
|
for my $key (sort keys %{$objects_to_test}) {
|
|
my $ml = $objects_to_test->{$key};
|
|
isa_ok($ml, 'Monitoring::Livestatus') or BAIL_OUT("no need to continue without a proper Monitoring::Livestatus object: ".$key);
|
|
|
|
# dont die on errors
|
|
$ml->errors_are_fatal(0);
|
|
$ml->warnings(0);
|
|
|
|
#########################
|
|
# get tables
|
|
my $data = $ml->selectall_hashref("GET columns\nColumns: table", 'table');
|
|
my @tables = sort keys %{$data};
|
|
|
|
#########################
|
|
# check keys
|
|
for my $type (@tables) {
|
|
alarm(120);
|
|
my $filter = "";
|
|
$filter = "Filter: time > ".(time() - 86400)."\n" if $type eq 'log';
|
|
$filter .= "Filter: time < ".(time())."\n" if $type eq 'log';
|
|
my $statement = "GET $type\n".$filter."Limit: 1";
|
|
$lastquery = $statement;
|
|
my $keys = $ml->selectrow_hashref($statement );
|
|
undef $lastquery;
|
|
is(ref $keys, 'HASH', $type.' keys are a hash');# or BAIL_OUT('keys are not in hash format, got '.Dumper($keys));
|
|
|
|
# status has no filter implemented
|
|
next if $type eq 'status';
|
|
|
|
for my $key (keys %{$keys}) {
|
|
my $value = $keys->{$key};
|
|
if(index($value, ',') > 0) { my @vals = split /,/, $value; $value = $vals[0]; }
|
|
my $typefilter = "Filter: $key >= $value\n";
|
|
if($value eq '') {
|
|
$typefilter = "Filter: $key =\n";
|
|
}
|
|
my $statement = "GET $type\n".$filter.$typefilter."Limit: 1";
|
|
$lastquery = $statement;
|
|
my $hash_ref = $ml->selectrow_hashref($statement );
|
|
undef $lastquery;
|
|
is($Monitoring::Livestatus::ErrorCode, 0, "GET ".$type." Filter: ".$key." >= ".$value) or BAIL_OUT("query failed: ".$statement);
|
|
#isnt($hash_ref, undef, "GET ".$type." Filter: ".$key." >= ".$value);# or BAIL_OUT("got undef for ".$statement);
|
|
|
|
# send test stats query
|
|
my $stats_query = [ $key.' = '.$value, 'std '.$key, 'min '.$key, 'max '.$key, 'avg '.$key, 'sum '.$key ];
|
|
for my $stats_part (@{$stats_query}) {
|
|
my $statement = "GET $type\n".$filter.$typefilter."\nStats: $stats_part";
|
|
$lastquery = $statement;
|
|
my $hash_ref = $ml->selectrow_hashref($statement );
|
|
undef $lastquery;
|
|
is($Monitoring::Livestatus::ErrorCode, 0, "GET ".$type." Filter: ".$key." >= ".$value." Stats: $stats_part") or BAIL_OUT("query failed:\n".$statement);
|
|
|
|
$statement = "GET $type\n".$filter.$typefilter."\nStats: $stats_part\nStatsGroupBy: $key";
|
|
$lastquery = $statement;
|
|
$hash_ref = $ml->selectrow_hashref($statement );
|
|
undef $lastquery;
|
|
is($Monitoring::Livestatus::ErrorCode, 0, "GET ".$type." Filter: ".$key." >= ".$value." Stats: $stats_part StatsGroupBy: $key") or BAIL_OUT("query failed:\n".$statement);
|
|
}
|
|
|
|
# wait till backend is started up again
|
|
if(!defined $hash_ref and $Monitoring::Livestatus::ErrorCode > 200) {
|
|
sleep(2);
|
|
}
|
|
}
|
|
}
|
|
}
|