public async Task ExponentialBackoffAsyncWithoutResultTest() { const int RetryCount = 5; TimeSpan maxBackoff = TimeSpan.FromSeconds(5); Counter <InvalidOperationException> counter = new(RetryCount); int retryFuncCount = 0; int retryHandlerCount = 0; await Retry.ExponentialBackoffAsync( async() => { retryFuncCount++; counter.Increase(); await Task.Yield(); }, 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))); }