use std::time::Duration;
pub fn retry_delay(retry_count: u32, base: Duration) -> Duration {
let multiplier = 2_u32.saturating_pow(retry_count);
base.saturating_mul(multiplier)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_retry_delay_basic() {
let base = Duration::from_millis(100);
assert_eq!(retry_delay(0, base), Duration::from_millis(100));
assert_eq!(retry_delay(1, base), Duration::from_millis(200));
assert_eq!(retry_delay(2, base), Duration::from_millis(400));
assert_eq!(retry_delay(3, base), Duration::from_millis(800));
}
#[test]
fn test_retry_delay_different_base() {
let base = Duration::from_secs(1);
assert_eq!(retry_delay(0, base), Duration::from_secs(1));
assert_eq!(retry_delay(1, base), Duration::from_secs(2));
assert_eq!(retry_delay(2, base), Duration::from_secs(4));
}
#[test]
fn test_retry_delay_zero_base() {
let base = Duration::from_millis(0);
assert_eq!(retry_delay(0, base), Duration::from_millis(0));
assert_eq!(retry_delay(1, base), Duration::from_millis(0));
assert_eq!(retry_delay(10, base), Duration::from_millis(0));
}
#[test]
fn test_retry_delay_large_values() {
let base = Duration::from_millis(1);
let delay = retry_delay(20, base);
assert_eq!(delay, Duration::from_millis(1_048_576));
}
#[test]
fn test_retry_delay_overflow_protection() {
let base = Duration::from_secs(u64::MAX / 2);
let delay = retry_delay(2, base);
assert!(delay > Duration::from_secs(0));
}
#[test]
fn test_retry_delay_exponential_growth() {
let base = Duration::from_millis(10);
let delays: Vec<Duration> = (0..5).map(|i| retry_delay(i, base)).collect();
for i in 1..delays.len() {
assert_eq!(delays[i], delays[i - 1] * 2);
}
}
#[test]
fn test_retry_delay_microseconds() {
let base = Duration::from_micros(500);
assert_eq!(retry_delay(0, base), Duration::from_micros(500));
assert_eq!(retry_delay(1, base), Duration::from_micros(1000));
assert_eq!(retry_delay(2, base), Duration::from_micros(2000));
}
#[test]
fn test_retry_delay_nanoseconds() {
let base = Duration::from_nanos(1000);
assert_eq!(retry_delay(0, base), Duration::from_nanos(1000));
assert_eq!(retry_delay(1, base), Duration::from_nanos(2000));
assert_eq!(retry_delay(2, base), Duration::from_nanos(4000));
}
}