fn exponentially_increases_correctly()

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:?}"
            );
        }
    }