public void NoJitter() { var options = RetriableTransactionOptions.CreateWithNoJitter(); var delay = TimeSpan.FromTicks(TimeSpan.TicksPerMillisecond); var delayTicks = (int)delay.Ticks; var expectedJitteredTicks = delayTicks; // This shouldn't jitter at all, 50_000 seems a good enough sample // to test that. var delays = Enumerable.Range(0, 50_000) .Select(_ => options.Jitter(delay)) .ToList(); var min = delays.Min(); var max = delays.Max(); Assert.Equal(expectedJitteredTicks, min.Ticks); Assert.Equal(expectedJitteredTicks, max.Ticks); }
public void DefaultJitter() { var options = RetriableTransactionOptions.CreateDefault(); var delay = TimeSpan.FromTicks(TimeSpan.TicksPerMillisecond); var delayTicks = (int)delay.Ticks; // The jitter on RetriableTransactionOptions should jitter between // delay and delay * 2. var expectedMinDelayTicks = delayTicks; var expectedMaxDelayTicks = delayTicks * 2; var expectedMedianDelayTicks = (expectedMinDelayTicks + expectedMaxDelayTicks) / 2; var delays = Enumerable.Range(0, 10_000) .Select(_ => options.Jitter(delay)) .ToList(); var underMedianCount = delays.LongCount(ts => ts.Ticks <= expectedMedianDelayTicks); Assert.InRange(underMedianCount, 4_000, 6_000); }