#!/usr/bin/env perl
#########################
use strict;
use Test::More;
use Data::Dumper;
use File::Temp;
use IO::Socket::UNIX qw( SOCK_STREAM SOMAXCONN );
use_ok('Monitoring::Livestatus::MULTI');
BEGIN {
if( $^O eq 'MSWin32' ) {
plan skip_all => 'no sockets on windows';
}
else {
plan tests => 57;
}
}
#########################
# create 2 test sockets
# get a temp file from File::Temp and replace it with our socket
my $fh = File::Temp->new(UNLINK => 0);
my $socket_path1 = $fh->filename;
unlink($socket_path1);
my $listener1 = IO::Socket::UNIX->new(
Type => SOCK_STREAM,
Listen => SOMAXCONN,
Local => $socket_path1,
) or die("failed to open $socket_path1 as test socket: $!");
$fh = File::Temp->new(UNLINK => 0);
my $socket_path2 = $fh->filename;
unlink($socket_path2);
my $listener2 = IO::Socket::UNIX->new(
Type => SOCK_STREAM,
Listen => SOMAXCONN,
Local => $socket_path2,
) or die("failed to open $socket_path2 as test socket: $!");
#########################
# test the _merge_answer
my $mergetests = [
{ # simple test for sliced selectall_arrayref
in => { '820e03551b95b42ec037c87aed9b8f4a' => [ { 'description' => 'test_flap_07', 'host_name' => 'test_host_000', 'state' => '0' }, { 'description' => 'test_flap_11', 'host_name' => 'test_host_000', 'state' => '0' } ],
'35bbb11a888f66131d429efd058fb141' => [ { 'description' => 'test_ok_00', 'host_name' => 'test_host_000', 'state' => '0' }, { 'description' => 'test_ok_01', 'host_name' => 'test_host_000', 'state' => '0' } ],
'70ea8fa14abb984761bdd45ef27685b0' => [ { 'description' => 'test_critical_00', 'host_name' => 'test_host_000', 'state' => '2' }, { 'description' => 'test_critical_19', 'host_name' => 'test_host_000', 'state' => '2' } ]
},
exp => [
{ 'description' => 'test_flap_07', 'host_name' => 'test_host_000', 'state' => '0' },
{ 'description' => 'test_flap_11', 'host_name' => 'test_host_000', 'state' => '0' },
{ 'description' => 'test_ok_00', 'host_name' => 'test_host_000', 'state' => '0' },
{ 'description' => 'test_ok_01', 'host_name' => 'test_host_000', 'state' => '0' },
{ 'description' => 'test_critical_00', 'host_name' => 'test_host_000', 'state' => '2' },
{ 'description' => 'test_critical_19', 'host_name' => 'test_host_000', 'state' => '2' },
]
},
];
#########################
# test object creation
my $ml = Monitoring::Livestatus::MULTI->new( [ $socket_path1, $socket_path2 ] );
isa_ok($ml, 'Monitoring::Livestatus', 'single args sockets');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::UNIX', 'single args sockets peer');
}
$ml = Monitoring::Livestatus::MULTI->new( [$socket_path1] );
isa_ok($ml, 'Monitoring::Livestatus', 'single array args socket');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::UNIX', 'single array args socket peer');
is($peer->peer_addr, $socket_path1, 'single arrays args socket peer addr');
is($peer->peer_name, $socket_path1, 'single arrays args socket peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( 'localhost:5001' );
isa_ok($ml, 'Monitoring::Livestatus', 'single args server');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::INET', 'single args server peer');
like($peer->peer_addr, qr/^localhost/, 'single args servers peer addr');
like($peer->peer_name, qr/^localhost/, 'single args servers peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( ['localhost:5001'] );
isa_ok($ml, 'Monitoring::Livestatus', 'single array args server');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::INET', 'single arrays args server peer');
like($peer->peer_addr, qr/^localhost/, 'single arrays args servers peer addr');
like($peer->peer_name, qr/^localhost/, 'single arrays args servers peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( [ 'localhost:5001', 'localhost:5002' ] );
isa_ok($ml, 'Monitoring::Livestatus', 'single args servers');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::INET', 'single args servers peer');
like($peer->peer_addr, qr/^localhost/, 'single args servers peer addr');
like($peer->peer_name, qr/^localhost/, 'single args servers peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( peer => [ 'localhost:5001', 'localhost:5002' ] );
isa_ok($ml, 'Monitoring::Livestatus', 'hash args servers');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::INET', 'hash args servers peer');
like($peer->peer_addr, qr/^localhost/, 'hash args servers peer addr');
like($peer->peer_name, qr/^localhost/, 'hash args servers peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( peer => [ $socket_path1, $socket_path2 ] );
isa_ok($ml, 'Monitoring::Livestatus', 'hash args sockets');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::UNIX', 'hash args sockets peer');
}
$ml = Monitoring::Livestatus::MULTI->new( peer => { $socket_path1 => 'Location 1', $socket_path2 => 'Location2' } );
isa_ok($ml, 'Monitoring::Livestatus', 'hash args hashed sockets');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::UNIX', 'hash args hashed sockets peer');
like($peer->peer_name, qr/^Location/, 'hash args hashed sockets peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( peer => { 'localhost:5001' => 'Location 1', 'localhost:5002' => 'Location2' } );
isa_ok($ml, 'Monitoring::Livestatus', 'hash args hashed servers');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::INET', 'hash args hashed servers peer');
like($peer->peer_addr, qr/^localhost/, 'hash args hashed servers peer addr');
like($peer->peer_name, qr/^Location/, 'hash args hashed servers peer name');
}
$ml = Monitoring::Livestatus::MULTI->new( $socket_path1 );
isa_ok($ml, 'Monitoring::Livestatus', 'single args socket');
for my $peer (@{$ml->{'peers'}}) {
isa_ok($peer, 'Monitoring::Livestatus::UNIX', 'single args socket peer');
}
#########################
# test internal subs
$ml = Monitoring::Livestatus::MULTI->new('peer' => ['192.168.123.2:9996', '192.168.123.2:9997', '192.168.123.2:9998' ] );
my $x = 0;
for my $test (@{$mergetests}) {
my $got = $ml->_merge_answer($test->{'in'});
is_deeply($got, $test->{'exp'}, '_merge_answer test '.$x)
or diag("got: ".Dumper($got)."\nbut expected ".Dumper($test->{'exp'}));
$x++;
}
#########################
# test the _sum_answer
my $sumtests = [
{ # hashes
in => { '192.168.123.2:9996' => { 'ok' => '12', 'warning' => '8' },
'192.168.123.2:9997' => { 'ok' => '17', 'warning' => '7' },
'192.168.123.2:9998' => { 'ok' => '13', 'warning' => '2' }
},
exp => { 'ok' => '42', 'warning' => '17' }
},
{ # hashes, undefs
in => { '192.168.123.2:9996' => { 'ok' => '12', 'warning' => '8' },
'192.168.123.2:9997' => undef,
'192.168.123.2:9998' => { 'ok' => '13', 'warning' => '2' }
},
exp => { 'ok' => '25', 'warning' => '10' }
},
{ # hashes, undefs
in => { '192.168.123.2:9996' => { 'ok' => '12', 'warning' => '8' },
'192.168.123.2:9997' => {},
'192.168.123.2:9998' => { 'ok' => '13', 'warning' => '2' }
},
exp => { 'ok' => '25', 'warning' => '10' }
},
{ # arrays
in => { '192.168.123.2:9996' => [ '3302', '235' ],
'192.168.123.2:9997' => [ '3324', '236' ],
'192.168.123.2:9998' => [ '3274', '236' ]
},
exp => [ 9900, 707 ]
},
{ # undefs / scalars
in => { 'e69322abf0352888e598da3e2514df4a' => undef,
'f42530d7e8c2b52732ba427b1e5e0a8e' => '1'
},
exp => 1,
},
{ # arrays, undefs
in => { '192.168.123.2:9996' => [ '2', '5' ],
'192.168.123.2:9997' => [ ],
'192.168.123.2:9998' => [ '4', '6' ]
},
exp => [ 6, 11 ]
},
{ # arrays, undefs
in => { '192.168.123.2:9996' => [ '2', '5' ],
'192.168.123.2:9997' => undef,
'192.168.123.2:9998' => [ '4', '6' ]
},
exp => [ 6, 11 ]
},
];
$x = 1;
for my $test (@{$sumtests}) {
my $got = $ml->_sum_answer($test->{'in'});
is_deeply($got, $test->{'exp'}, '_sum_answer test '.$x)
or diag("got: ".Dumper($got)."\nbut expected ".Dumper($test->{'exp'}));
$x++;
}
#########################
# clone test
my $clone = $ml->_clone($mergetests);
is_deeply($clone, $mergetests, 'merge test clone');
$clone = $ml->_clone($sumtests);
is_deeply($clone, $sumtests, 'sum test clone');