Exemple #1
0
    public void ExponentialBackoffWithoutResultTest()
    {
        const int RetryCount = 5;
        TimeSpan  maxBackoff = TimeSpan.FromSeconds(5);
        Counter <InvalidOperationException> counter = new(RetryCount);
        int retryFuncCount    = 0;
        int retryHandlerCount = 0;

        Retry.ExponentialBackoff(
            () =>
        {
            retryFuncCount++;
            counter.Increase();
        },
            RetryCount,
            exception => exception is InvalidOperationException,
            (sender, e) =>
        {
            Assert.IsInstanceOfType(e.LastException, typeof(InvalidOperationException));
            Assert.IsTrue(e.Delay >= RetryStrategy.DefaultMinBackoff && e.Delay <= RetryStrategy.DefaultMaxBackoff);
            Assert.AreEqual(counter.Time.Count, e.CurrentRetryCount);
            retryHandlerCount++;
        },
            maxBackoff: maxBackoff,
            firstFastRetry: false);
        Assert.AreEqual(RetryCount, retryFuncCount);
        Assert.AreEqual(RetryCount - 1, retryHandlerCount);
        Assert.AreEqual(RetryCount, counter.Time.Count);
        TimeSpan[] intervals = counter.Time.Take(counter.Time.Count - 1).Zip(counter.Time.Skip(1), (a, b) => b - a).ToArray();
        Assert.AreEqual(RetryCount - 1, intervals.Length);
        intervals.ForEach((interval, index) => Assert.IsTrue(interval >= RetryStrategy.DefaultMinBackoff && interval <= maxBackoff + TimeSpan.FromTicks(TimeSpanHelper.Delta)));
    }