Algorithm-Backoff
view release on metacpan or search on metacpan
t/01-base.t view on Meta::CPAN
isnt($ar->failure(2), -1);
isnt($ar->failure(3), -1);
$ar = Algorithm::Backoff::Constant->new(
delay => 2,
max_attempts => 1,
);
is($ar->failure(1), -1);
$ar = Algorithm::Backoff::Constant->new(
delay => 2,
max_attempts => 2,
);
isnt($ar->failure(1), -1);
is ($ar->failure(1), -1);
$ar->success(1);
isnt($ar->failure(1), -1);
is ($ar->failure(1), -1);
};
# XXX also test max_actual_duration for each strategy
subtest "attr: max_actual_duration" => sub {
my $ar;
$ar = Algorithm::Backoff::Constant->new(
delay => 2,
max_actual_duration => 4,
max_attempts => 3,
_start_timestamp => 0,
);
isnt($ar->failure(0), -1);
isnt($ar->failure(2), -1);
is ($ar->failure(4), -1);
};
# XXX also test consider_actual_delay for each strategy
subtest "attr: consider_actual_delay" => sub {
my $ar;
$ar = Algorithm::Backoff::Constant->new(
consider_actual_delay => 1,
delay => 2,
max_attempts => 0,
);
is($ar->failure(1), 2);
# we didn't wait, so the delay is now 2+2 = 4
is($ar->failure(1), 4);
# we now waited for 5 seconds, so delay is now 2-1 = 1
is($ar->failure(6), 1);
# we now waited for 2 seconds, so delay is now 2-1 = 1
is($ar->failure(8), 1);
# we now waited for 3 seconds, so delay is now 2-2 = 0
is($ar->failure(11), 0);
};
# This tests that consider_actual_delay uses the post-processed _prev_delay
# value correctly.
subtest "attr: consider_actual_delay + post-processing" => sub {
my $ar;
$ar = Algorithm::Backoff::Constant->new(
consider_actual_delay => 1,
delay => 3, # "pre-processor" delay
max_delay => 2, # real delay
max_attempts => 0,
);
# first failure after 1 second
is($ar->failure(1), 2);
# 2s delay + instant failure, so the delay is now 3 -> max 2
is($ar->failure(1+2+0), 2);
# 2s delay + 2s failure, so the delay is now 3-2 = 1
is($ar->failure(3+2+2), 1);
# 1s delay + 5s failure, so delay is now 3-5 = -2 -> min 0
is($ar->failure(7+1+5), 0);
# 0s delay + instant failure, so delay is now 3 -> max 2
is($ar->failure(13+0+0), 2);
};
# XXX also test jitter_factor for each strategy
subtest "attr: jitter_factor" => sub {
my $ar = Algorithm::Backoff::Constant->new(
delay => 2,
delay_on_success => 3,
jitter_factor => 0.1,
);
rand_between_ok(sub { $ar->failure(1) }, 2*(1-0.1), 2*(1+0.1));
rand_between_ok(sub { $ar->success(1) }, 3*(1-0.1), 3*(1+0.1));
# jittered delay still doesn't violate min_delay and max_delay
$ar = Algorithm::Backoff::Constant->new(
delay => 2,
delay_on_success => 2,
min_delay => 1.8,
max_delay => 2.2,
jitter_factor => 0.5,
);
rand_between_ok(sub { $ar->failure(1) }, 1.8, 2.2);
$ar = Algorithm::Backoff::Constant->new(
delay => 2,
delay_on_success => 3,
min_delay => 2.8,
max_delay => 3.2,
jitter_factor => 0.5,
);
rand_between_ok(sub { $ar->success(1) }, 2.8, 3.2);
};
subtest "timestamp must not decrease" => sub {
my $ar = Algorithm::Backoff::Constant->new(
delay => 2,
);
$ar->success(2);
dies_ok { $ar->success(1) };
};
( run in 0.477 second using v1.01-cache-2.11-cpan-f0fbb3f571b )