|
Packit |
972a07 |
#!perl -w
|
|
Packit |
972a07 |
# --------------------------------------------------------------------
|
|
Packit |
972a07 |
# The aim of this test is to start a syslog server (TCP or UDP) using
|
|
Packit |
972a07 |
# the one available in POE, make Sys::Syslog connect to it by manually
|
|
Packit |
972a07 |
# select the corresponding mechanism, send some messages and, inside
|
|
Packit |
972a07 |
# the POE syslog server, check that these message are correctly crafted.
|
|
Packit |
972a07 |
# --------------------------------------------------------------------
|
|
Packit |
972a07 |
use strict;
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
my $port;
|
|
Packit |
972a07 |
BEGIN {
|
|
Packit |
972a07 |
# override getservbyname()
|
|
Packit |
972a07 |
*CORE::GLOBAL::getservbyname = sub ($$) {
|
|
Packit |
972a07 |
my @v = CORE::getservbyname($_[0], $_[1]);
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
if (@v) {
|
|
Packit |
972a07 |
$v[2] = $port;
|
|
Packit |
972a07 |
} else {
|
|
Packit |
972a07 |
@v = ($_[0], "", $port, $_[1]);
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
return wantarray ? @v : $port
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
use File::Spec;
|
|
Packit |
972a07 |
use Test::More;
|
|
Packit |
972a07 |
use Socket;
|
|
Packit |
972a07 |
use Sys::Syslog qw(:standard :extended :macros);
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
# check than POE is available
|
|
Packit |
972a07 |
plan skip_all => "POE is not available" unless eval "use POE; 1";
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
# check than POE::Component::Server::Syslog is available and recent enough
|
|
Packit |
972a07 |
plan skip_all => "POE::Component::Server::Syslog is not available"
|
|
Packit |
972a07 |
unless eval "use POE::Component::Server::Syslog; 1";
|
|
Packit |
972a07 |
plan skip_all => "POE::Component::Server::Syslog is too old"
|
|
Packit |
972a07 |
if POE::Component::Server::Syslog->VERSION < 1.14;
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
plan tests => 1;
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
$port = 5140;
|
|
Packit |
972a07 |
my $proto = "tcp";
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
my $ident = "pocosyslog";
|
|
Packit |
972a07 |
my $text = "Close the world, txEn eht nepO.";
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
$SIG{ALRM} = sub {
|
|
Packit |
972a07 |
ok( 0, "test took too much time to execute" );
|
|
Packit |
972a07 |
exit
|
|
Packit |
972a07 |
};
|
|
Packit |
972a07 |
alarm 30;
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
my $pid = fork();
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
if ($pid) {
|
|
Packit |
972a07 |
# parent: setup a syslog server
|
|
Packit |
972a07 |
POE::Component::Server::Syslog->spawn(
|
|
Packit |
972a07 |
Alias => 'syslog',
|
|
Packit |
972a07 |
Type => $proto,
|
|
Packit |
972a07 |
BindAddress => '127.0.0.1',
|
|
Packit |
972a07 |
BindPort => $port,
|
|
Packit |
972a07 |
InputState => \&client_input,
|
|
Packit |
972a07 |
ErrorState => \&client_error,
|
|
Packit |
972a07 |
);
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
$SIG{CHLD} = sub { wait() };
|
|
Packit |
972a07 |
POE::Kernel->sig_child($pid);
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
POE::Kernel->run;
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
else {
|
|
Packit |
972a07 |
# child: send a message to the syslog server setup in the parent
|
|
Packit |
972a07 |
sleep 2;
|
|
Packit |
972a07 |
openlog($ident, "ndelay,pid", "local0");
|
|
Packit |
972a07 |
setlogsock($proto);
|
|
Packit |
972a07 |
syslog(info => $text);
|
|
Packit |
972a07 |
closelog();
|
|
Packit |
972a07 |
exit
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
sub client_input {
|
|
Packit |
972a07 |
my $message = $_[&ARG0];
|
|
Packit |
972a07 |
delete $message->{'time'}; # too hazardous to test
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
is_deeply(
|
|
Packit |
972a07 |
$message,
|
|
Packit |
972a07 |
{
|
|
Packit |
972a07 |
host => scalar gethostbyaddr(inet_aton('127.0.0.1'), AF_INET),
|
|
Packit |
972a07 |
pri => &LOG_LOCAL0 + &LOG_INFO,
|
|
Packit |
972a07 |
facility => &LOG_LOCAL0 >> 3,
|
|
Packit |
972a07 |
severity => &LOG_INFO,
|
|
Packit |
972a07 |
msg => "$ident\[$pid]: $text\n\0",
|
|
Packit |
972a07 |
},
|
|
Packit |
972a07 |
"checking syslog message"
|
|
Packit |
972a07 |
);
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
POE::Kernel->post(syslog => "shutdown");
|
|
Packit |
972a07 |
POE::Kernel->stop;
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
sub client_error {
|
|
Packit |
972a07 |
my $message = $_[&ARG0];
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
require Data::Dumper;
|
|
Packit |
972a07 |
$Data::Dumper::Indent = 0; $Data::Dumper::Indent = 0;
|
|
Packit |
972a07 |
$Data::Dumper::Sortkeys = 1; $Data::Dumper::Sortkeys = 1;
|
|
Packit |
972a07 |
fail "checking syslog message";
|
|
Packit |
972a07 |
diag "[client_error] message = ", Data::Dumper::Dumper($message);
|
|
Packit |
972a07 |
|
|
Packit |
972a07 |
POE::Kernel->post(syslog => "shutdown");
|
|
Packit |
972a07 |
POE::Kernel->stop;
|
|
Packit |
972a07 |
}
|
|
Packit |
972a07 |
|