in sdk/typespec/typespec_client_core/src/http/policies/retry/exponential.rs [57:94]
fn exponentially_increases_correctly() {
let options = ExponentialRetryOptions::default();
let policy = ExponentialRetryPolicy::new(
options.initial_delay,
options.max_retries,
options.max_total_elapsed,
options.max_delay,
);
let mut elapsed_time = Duration::from_secs(0);
let mut retry_count = 0;
let mut durations = vec![];
while !policy.is_expired(elapsed_time, retry_count) {
retry_count += 1; // increase at beginning since we only check expiration if we need to retry
let duration = policy.sleep_duration(retry_count);
durations.push(duration);
elapsed_time += duration; // simulate sleep
}
let actual = durations
.into_iter()
.map(|d| d.as_secs())
.collect::<Vec<_>>();
let expected = &[0, 0, 1, 3, 6, 12, 25, 30];
assert_eq!(
actual.len(),
expected.len(),
"Different number of durations than expected"
);
for (&a, &e) in actual.iter().zip(expected.iter()) {
// Check within one second to account for the jitter
assert!(
a == e || a + 1 == e || a == e + 1,
"actual != expected\nActual: {actual:?}\nExpected: {expected:?}"
);
}
}