public async Task RateLimitBurstTwice() { const int count = 25; var duration = TimeSpan.FromSeconds(3); const int burstCount = 10; var burstDuration = TimeSpan.FromSeconds(1); var rateLimiter = new ApiRateLimiter(); rateLimiter.Configure(duration, count); rateLimiter.Configure(burstDuration, burstCount); var stopwatch = Stopwatch.StartNew(); for (var i = 0; i < burstCount * 2 + 1; i++) { await rateLimiter.DelayAsync(); } stopwatch.Stop(); Assert.True(stopwatch.ElapsedMilliseconds >= (burstDuration.TotalMilliseconds - 45) * 2 + 15); Assert.False(stopwatch.ElapsedMilliseconds > (burstDuration.TotalMilliseconds + 45) * 2 + 15); }
public void ConfigureThrows() { var rateLimiter = new ApiRateLimiter(); Assert.Throws <ArgumentException>("count", () => rateLimiter.Configure(TimeSpan.FromSeconds(1), -1)); }