public void GivenWeMakeRequestsAtASteadyRate_WhenThatRateIsJustAboveTheAllowed_ThenWeShouldApproachTheLimit() { var identity = new LeakyBucketClientIdentity { UniqueIdentifier = "test" }; var config = new LeakyBucketConfiguration { MaxRequests = 40, LeakRate = TimeSpan.FromSeconds(1), LeakAmount = 2 }; var rateLimiter = new LeakyBucketRateLimitStrategy(); rateLimiter.ReduceAllowanceBy(identity, 3); Assert.True(rateLimiter.HasRemainingAllowance(identity, config)); Assert.Equal(37, rateLimiter.GetRemainingAllowance(identity, config)); Thread.Sleep(TimeSpan.FromSeconds(1)); rateLimiter.ReduceAllowanceBy(identity, 3); Assert.True(rateLimiter.HasRemainingAllowance(identity, config)); Assert.Equal(36, rateLimiter.GetRemainingAllowance(identity, config)); Thread.Sleep(TimeSpan.FromSeconds(1)); rateLimiter.ReduceAllowanceBy(identity, 3); Assert.True(rateLimiter.HasRemainingAllowance(identity, config)); Assert.Equal(35, rateLimiter.GetRemainingAllowance(identity, config)); Thread.Sleep(TimeSpan.FromSeconds(1)); rateLimiter.ReduceAllowanceBy(identity, 3); Assert.True(rateLimiter.HasRemainingAllowance(identity, config)); Assert.Equal(34, rateLimiter.GetRemainingAllowance(identity, config)); Thread.Sleep(TimeSpan.FromSeconds(1)); }
public void GivenNoRequestsHaveBeenMade_ThenThereShouldBeTheExpectedAmountLeft() { const int expectedMaxRequests = 10; var identity = new LeakyBucketClientIdentity { UniqueIdentifier = "test" }; var config = new LeakyBucketConfiguration { MaxRequests = expectedMaxRequests, LeakRate = TimeSpan.FromMinutes(5) }; var rateLimiter = new LeakyBucketRateLimitStrategy(); Assert.Equal(expectedMaxRequests, rateLimiter.GetRemainingAllowance(identity, config)); }
public void GivenAConfiguration_AfterALongInterval_TheCorrectNumberOfRequestsShouldBeAvailable(int maxRequests, int leakAmount, int requestCount, int waitSeconds, int expected) { var mockIdentity = new LeakyBucketClientIdentity { UniqueIdentifier = "test" }; var identityProvider = new PredictableClientIdentityProvider <LeakyBucketClientIdentity>( mockIdentity); var config = new LeakyBucketConfiguration { MaxRequests = maxRequests, LeakRate = TimeSpan.FromSeconds(1), LeakAmount = leakAmount }; var rateLimiter = new LeakyBucketRateLimitStrategy(); void RunRateLimiter() { var identity = identityProvider.GetCurrentIdentity(); if (rateLimiter.HasRemainingAllowance(identity, config)) { rateLimiter.ReduceAllowanceBy(identity, config); } } for (var i = 0; i < requestCount; i++) { RunRateLimiter(); } if (waitSeconds > 0) { Thread.Sleep(TimeSpan.FromSeconds(waitSeconds)); } RunRateLimiter(); Assert.Equal(expected, rateLimiter.GetRemainingAllowance(mockIdentity, config)); }
public void GivenSomeRequestsHaveBeenMade_ThenThereShouldBeTheExpectedAmountLeft(int requests) { const int expectedMaxRequests = 10; var identityProvider = new PredictableClientIdentityProvider <LeakyBucketClientIdentity>( new LeakyBucketClientIdentity { UniqueIdentifier = "test" }); var config = new LeakyBucketConfiguration { MaxRequests = expectedMaxRequests, LeakRate = TimeSpan.FromMinutes(5), IdentityProvider = identityProvider }; var rateLimiter = new LeakyBucketRateLimitStrategy(config); rateLimiter.ReduceAllowanceBy(requests); Assert.Equal(expectedMaxRequests - requests, rateLimiter.GetRemainingAllowance()); }