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 )