#!/usr/bin/perl -T
use
SATest; sa_t_init(
"timeout"
);
sub
mysleep($) {
my
(
$dt
) =
@_
;
if
(
$RUNNING_ON_WINDOWS
) {
sleep
(
$dt
);
}
else
{
select
(
undef
,
undef
,
undef
, 0.1)
for
1..
int
(10
*$dt
);
}
}
my
(
$r
,
$t
,
$t1
,
$t2
);
$t
= Mail::SpamAssassin::Timeout->new;
$r
=
$t
->run(
sub
{ mysleep 1; 42 });
ok(!
$t
->timed_out);
ok(
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new({ });
$r
=
$t
->run(
sub
{ mysleep 1; 42 });
ok(!
$t
->timed_out &&
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new;
$r
=
$t
->run_and_catch(
sub
{ mysleep 1;
die
"run_and_catch test1\n"
});
ok(!
$t
->timed_out &&
$r
=~ /^run_and_catch test1/);
my
$caught
= 0;
$t
= Mail::SpamAssassin::Timeout->new;
eval
{
$r
=
$t
->run(
sub
{ mysleep 1;
die
"run_and_catch test2\n"
}); 1;
} or
do
{
$caught
= 1
if
$@ =~ /run_and_catch test2/;
};
ok(!
$t
->timed_out &&
$caught
);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 2 });
$r
=
$t
->run(
sub
{ mysleep 4; 42 });
ok(
$t
->timed_out);
ok(!
defined
$r
);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 3 });
$r
=
$t
->run(
sub
{ mysleep 1; 42 });
ok(!
$t
->timed_out);
ok(
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new({
deadline
=>
time
+2 });
$r
=
$t
->run(
sub
{ mysleep 4; 42 });
ok(
$t
->timed_out && !
defined
$r
);
$t
= Mail::SpamAssassin::Timeout->new({
deadline
=>
time
+3 });
$r
=
$t
->run(
sub
{ mysleep 1; 42 });
ok(!
$t
->timed_out &&
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 2,
deadline
=>
time
+6 });
$r
=
$t
->run(
sub
{ mysleep 4; 42 });
ok(
$t
->timed_out && !
defined
$r
);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 3,
deadline
=>
time
+6 });
$r
=
$t
->run(
sub
{ mysleep 1; 42 });
ok(!
$t
->timed_out &&
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 9,
deadline
=>
time
+2 });
$r
=
$t
->run(
sub
{ mysleep 4; 42 });
ok(
$t
->timed_out && !
defined
$r
);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 9,
deadline
=>
time
+3 });
$r
=
$t
->run(
sub
{ mysleep 1; 42 });
ok(!
$t
->timed_out &&
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 3 });
$r
=
$t
->run(
sub
{
alarm
0; mysleep 1;
$t
->
reset
; mysleep 5; 42 });
ok(
$t
->timed_out && !
defined
$r
);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 5 });
$r
=
$t
->run(
sub
{
alarm
0; mysleep 1;
$t
->
reset
; mysleep 1; 42 });
ok(!
$t
->timed_out &&
$r
== 42);
$t
= Mail::SpamAssassin::Timeout->new({
secs
=> 2 });
$r
=
$t
->run(
sub
{
alarm
0; mysleep 4;
$t
->
reset
; 42 });
ok(
$t
->timed_out && !
defined
$r
);
$t1
= Mail::SpamAssassin::Timeout->new({
secs
=> 1 });
$t2
= Mail::SpamAssassin::Timeout->new({
secs
=> 2 });
$r
=
$t1
->run(
sub
{
$t2
->run(
sub
{ mysleep 4; 43 }); 42 });
ok(
$t1
->timed_out);
ok(!
$t2
->timed_out);
ok(!
defined
$r
);
$t1
= Mail::SpamAssassin::Timeout->new({
secs
=> 2 });
$t2
= Mail::SpamAssassin::Timeout->new({
secs
=> 1 });
$r
=
$t1
->run(
sub
{
$t2
->run(
sub
{ mysleep 4; 43 }); 42 });
ok(!
$t1
->timed_out);
ok(
$t2
->timed_out);
ok(
$r
== 42);
$t1
= Mail::SpamAssassin::Timeout->new({
secs
=> 2 });
$t2
= Mail::SpamAssassin::Timeout->new({
secs
=> 1 });
$r
=
$t1
->run(
sub
{
$t2
->run(
sub
{ mysleep 3; 43 }); mysleep 3; 42 });
ok(
$t1
->timed_out);
ok(
$t2
->timed_out);
ok(!
defined
$r
);
$t1
= Mail::SpamAssassin::Timeout->new({
secs
=> 1 });
$t2
= Mail::SpamAssassin::Timeout->new({
secs
=> 1 });
$r
=
$t1
->run(
sub
{
$t2
->run(
sub
{ mysleep 3; 43 }); mysleep 3; 42 });
ok(
$t1
->timed_out);
ok(
$t2
->timed_out);
ok(!
defined
$r
);
my
$when
=
int
(
time
+ 1.5);
$t1
= Mail::SpamAssassin::Timeout->new({
deadline
=>
$when
});
$t2
= Mail::SpamAssassin::Timeout->new({
deadline
=>
$when
});
$r
=
$t1
->run(
sub
{
$t2
->run(
sub
{ mysleep 4; 43 }); 42 });
ok(!
$t1
->timed_out);
ok(
$t2
->timed_out);
ok(
$r
== 42);
1;