use super::*;
#[test]
fn delay_for_doubles_until_max_cap() {
let p = RetryPolicy {
max_retries: 10,
initial_backoff_ms: 100,
max_backoff_ms: 800,
jitter_ratio: 0.0, buffered_max_bytes: 0, };
let d0 = delay_for(p, 0);
let d1 = delay_for(p, 1);
let d2 = delay_for(p, 2);
let d3 = delay_for(p, 3); let d4 = delay_for(p, 4); assert_eq!(d0.as_millis(), 100);
assert_eq!(d1.as_millis(), 200);
assert_eq!(d2.as_millis(), 400);
assert_eq!(d3.as_millis(), 800);
assert_eq!(d4.as_millis(), 800);
}
#[test]
fn delay_for_clamps_jitter_above_one() {
let p = RetryPolicy {
max_retries: 1,
initial_backoff_ms: 100,
max_backoff_ms: 1000,
jitter_ratio: 5.0,
buffered_max_bytes: 0,
};
for _ in 0..32 {
let d = delay_for(p, 0);
let ms = d.as_millis();
assert!((50..150).contains(&ms), "jitter sample out of range: {ms}");
}
}
#[test]
fn delay_for_handles_huge_attempt_without_panic() {
let p = RetryPolicy {
max_retries: u32::MAX,
initial_backoff_ms: 1,
max_backoff_ms: 60_000,
jitter_ratio: 0.0,
buffered_max_bytes: 0,
};
let d = delay_for(p, 10_000);
assert_eq!(d.as_millis(), 60_000);
}
#[test]
fn delay_for_jitter_stays_within_equal_jitter_band() {
let cases: &[(f64, u128, u128)] = &[
(0.1, 950, 1050), (0.25, 875, 1125), (0.5, 750, 1250), (1.0, 500, 1500), ];
for &(jitter_ratio, lower, upper) in cases {
let p = RetryPolicy {
max_retries: 1,
initial_backoff_ms: 1000,
max_backoff_ms: 10_000,
jitter_ratio,
buffered_max_bytes: 4 << 20,
};
for _ in 0..256 {
let ms = delay_for(p, 0).as_millis();
assert!(
(lower..upper).contains(&ms),
"ratio={jitter_ratio}: sample {ms} not in [{lower}, {upper})"
);
}
}
}
#[test]
fn delay_for_zero_jitter_is_deterministic() {
let p = RetryPolicy {
max_retries: 5,
initial_backoff_ms: 100,
max_backoff_ms: 10_000,
jitter_ratio: 0.0,
buffered_max_bytes: 4 << 20,
};
let baseline = delay_for(p, 2);
assert_eq!(baseline.as_millis(), 400);
for _ in 0..16 {
assert_eq!(delay_for(p, 2), baseline);
}
}
#[test]
fn delay_for_zero_initial_backoff_is_zero_regardless_of_jitter() {
let p = RetryPolicy {
max_retries: 3,
initial_backoff_ms: 0,
max_backoff_ms: 10_000,
jitter_ratio: 0.5,
buffered_max_bytes: 4 << 20,
};
for attempt in 0..8 {
assert_eq!(delay_for(p, attempt), Duration::ZERO);
}
}