Algorithm-EventsPerSecond
view release on metacpan or search on metacpan
t/sukkal-lifecycle.t view on Meta::CPAN
#!perl
# Daemon lifecycle: constructor validation, socket path handling,
# socket permissions, the client cap, concurrent multiplexing of
# multiple clients, and idle-key eviction.
use 5.006;
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'unix domain sockets and fork required'
if $^O eq 'MSWin32';
}
use lib 't/lib';
use File::Temp qw(tempdir);
use Time::HiRes qw(sleep);
use Algorithm::EventsPerSecond::Sukkal;
use Sukkal_TestUtil qw(spawn_daemon connect_daemon read_line req req_multi stop_daemon);
alarm 120; # watchdog: a hung daemon must fail the test, not the harness
sub new_dies {
my ( $desc, $err_re, %args ) = @_;
ok( !eval { Algorithm::EventsPerSecond::Sukkal->new(%args); 1 }, $desc );
like( $@, $err_re, "...$desc message" );
return;
}
#
# constructor validation; new() never touches the filesystem, so a
# placeholder path is fine
#
my $ph = '/nonexistent/placeholder.sock';
new_dies( 'missing socket dies', qr/socket path required/ );
new_dies( 'empty socket dies', qr/socket path required/, socket => '' );
new_dies( 'window of 0 dies', qr/window must be a positive integer/, socket => $ph, window => 0 );
new_dies( 'non-numeric window dies', qr/window must be a positive integer/, socket => $ph, window => 'abc' );
new_dies(
'sweep_interval of 0 dies', qr/sweep_interval must be a positive integer/,
socket => $ph,
sweep_interval => 0
);
new_dies(
'listen_backlog of 0 dies', qr/listen_backlog must be a positive integer/,
socket => $ph,
listen_backlog => 0
);
new_dies( 'negative max_keys dies', qr/max_keys must be a non-negative integer/, socket => $ph, max_keys => -1 );
new_dies(
'negative max_clients dies',
qr/max_clients must be a non-negative integer/,
socket => $ph,
max_clients => -1
);
new_dies(
'idle_timeout below the window dies',
qr/idle_timeout must be an integer >= window/,
socket => $ph,
window => 10,
idle_timeout => 9
);
new_dies( 'bad socket_mode dies', qr/socket_mode must be an octal string/, socket => $ph, socket_mode => 'rwx' );
new_dies(
'socket_mode with digits over 7 dies',
qr/socket_mode must be an octal string/,
socket => $ph,
socket_mode => '0980'
);
ok( eval { Algorithm::EventsPerSecond::Sukkal->new( socket => $ph, window => 10, idle_timeout => 10 ); 1 },
'idle_timeout equal to the window is accepted' );
ok( eval { Algorithm::EventsPerSecond::Sukkal->new( socket => $ph, socket_mode => '770' ); 1 },
( run in 2.121 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )