#!/usr/bin/perl -w
use strict;
use Test::More tests => 21;
use_ok("Schedule::Cron::Nofork");
my $next_minute = "* * * * *";
my @method = qw( new run load_crontab clean_timetable add_entry check_entry );
BEGIN {
# diag "Checking whether alarm() is supported";
# Replace alarm() with our dummy version if it isn't supported natively (e.g. Win32)
eval { alarm(0); };
if ($@) {
# diag "alarm() is not supported (installing harmless dummy).";
eval q!
use subs 'alarm';
sub alarm { diag "Press CTRL-C if this test didn't stop after $_[0] seconds" if $_[0] };
!;
} else {
# diag "alarm() is supported. Timeouts will be used.";
};
};
my @dispatched = ();
my $cron = Schedule::Cron::Nofork->new( sub { push @dispatched, [@_]; die "General dispatch called" } );
isa_ok($cron,"Schedule::Cron::Nofork");
can_ok($cron,@method);
diag "Scheduling an entry for $next_minute, please stand by";
$cron->add_entry($next_minute,sub { die "Cron job called" });
eval {
$SIG{ALRM} = sub { die "Timeout reached" };
alarm(90);
$cron->run();
};
alarm(0);
like($@,"/Cron job called/","Scheduled job was called");
@dispatched = ();
$cron = Schedule::Cron::Nofork->new( sub { push @dispatched, [@_]; die "General dispatch called" } );
isa_ok($cron,"Schedule::Cron::Nofork");
diag "Scheduling an entry for $next_minute, please stand by";
$cron->add_entry($next_minute,MESSAGE => 'just testing' );
eval {
$SIG{ALRM} = sub { die "Timeout reached" };
alarm(90);
$cron->run();
};
alarm(0);
like($@,"/General dispatch called/","Scheduled job was called");
is(scalar @dispatched,1,"One job was dispatched");
is($dispatched[0]->[0],"MESSAGE","General dispatch parameters[0]");
is($dispatched[0]->[1],"just testing","General dispatch parameters[1]");
@dispatched = ();
$cron = Schedule::Cron::Nofork->new( sub { push @dispatched, [@_]; die "General dispatch called" } );
isa_ok($cron,"Schedule::Cron::Nofork");
diag "Scheduling two entries for $next_minute, please stand by";
$cron->add_entry($next_minute,MESSAGE => 'just testing (first)' );
$cron->add_entry($next_minute,MESSAGE => 'just testing (second)' );
eval {
$SIG{ALRM} = sub { die "Timeout reached" };
alarm(90);
$cron->run();
};
alarm(0);
like($@,"/General dispatch called/","Scheduled job was called");
is(scalar @dispatched,1,"Only one job was dispatched");
is($dispatched[0]->[0],"MESSAGE","General dispatch parameters[0]");
like($dispatched[0]->[1],"/^just testing/","General dispatch parameters[1]");
@dispatched = ();
$cron = Schedule::Cron::Nofork->new( sub { push @dispatched, [@_]; goto &{$_[1]} } );
isa_ok($cron,"Schedule::Cron::Nofork");
diag "Scheduling three entries for $next_minute, please stand by";
my $count = 0;
sub work {
$count++;
diag "work() was called $count time(s)";
sleep 20;
die "Work done" if $count == 3;
};
$cron->add_entry($next_minute,RUN => \&work );
$cron->add_entry($next_minute,RUN => \&work );
$cron->add_entry($next_minute,RUN => \&work );
my $now = time();
eval {
$SIG{ALRM} = sub { die "Timeout reached" };
alarm(185);
$cron->run();
};
alarm(0);
like($@,"/Work done/","Scheduled cleanup was called");
is(scalar @dispatched,3,"All three jobs were dispatched");
# Doing all work takes 60 seconds or more :
cmp_ok(time-$now,'>',59,"No parallel execution");
for (@dispatched) {
is($_->[0],"RUN","General dispatch parameters[0]");
};