public void TryReplenishWithAutoReplenish_ReturnsFalse() { var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(2, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(1), 1, autoReplenishment: true)); Assert.Equal(2, limiter.GetAvailablePermits()); Assert.False(limiter.TryReplenish()); Assert.Equal(2, limiter.GetAvailablePermits()); }
public async Task CanAcquireMultipleRequestsAsync() { // This test verifies the following behavior // 1. when we have available permits after replenish to serve the queued requests // 2. when the oldest item from queue is remove to accommodate new requests (QueueProcessingOrder: NewestFirst) var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(4, QueueProcessingOrder.NewestFirst, 4, TimeSpan.Zero, 3, autoReplenishment: false)); using var lease = await limiter.WaitAndAcquireAsync(2); Assert.True(lease.IsAcquired); var wait = limiter.WaitAndAcquireAsync(3); Assert.False(wait.IsCompleted); Assert.True(limiter.TryReplenish()); Assert.False(wait.IsCompleted); var wait2 = limiter.WaitAndAcquireAsync(2); Assert.True(wait2.IsCompleted); Assert.True(limiter.TryReplenish()); var wait3 = limiter.WaitAndAcquireAsync(2); Assert.False(wait3.IsCompleted); Assert.True(limiter.TryReplenish()); Assert.True((await wait3).IsAcquired); Assert.False((await wait).IsAcquired); Assert.Equal(0, limiter.GetAvailablePermits()); }
public override async Task CanAcquireResourcesWithWaitAndAcquireAsyncWithQueuedItemsIfNewestFirst() { var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(2, QueueProcessingOrder.NewestFirst, 2, TimeSpan.Zero, 3, autoReplenishment: false)); var lease = limiter.Acquire(1); Assert.True(lease.IsAcquired); var wait = limiter.WaitAndAcquireAsync(2); Assert.False(wait.IsCompleted); Assert.Equal(1, limiter.GetAvailablePermits()); lease = await limiter.WaitAndAcquireAsync(1); Assert.True(lease.IsAcquired); Assert.False(wait.IsCompleted); limiter.TryReplenish(); Assert.True(limiter.TryReplenish()); Assert.False(wait.IsCompleted); Assert.True(limiter.TryReplenish()); lease = await wait; Assert.True(lease.IsAcquired); }
public override async Task CancelUpdatesQueueLimit() { var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(2, QueueProcessingOrder.NewestFirst, 1, TimeSpan.Zero, 2, autoReplenishment: false)); var lease = limiter.Acquire(2); Assert.True(lease.IsAcquired); var cts = new CancellationTokenSource(); var wait = limiter.WaitAndAcquireAsync(1, cts.Token); cts.Cancel(); var ex = await Assert.ThrowsAsync <TaskCanceledException>(() => wait.AsTask()); Assert.Equal(cts.Token, ex.CancellationToken); wait = limiter.WaitAndAcquireAsync(1); Assert.False(wait.IsCompleted); limiter.TryReplenish(); limiter.TryReplenish(); lease = await wait; Assert.True(lease.IsAcquired); Assert.Equal(1, limiter.GetAvailablePermits()); }
public override async Task CanAcquireResourceAsync_QueuesAndGrabsNewest() { var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(2, QueueProcessingOrder.NewestFirst, 3, TimeSpan.FromMinutes(0), 2, autoReplenishment: false)); var lease = await limiter.WaitAndAcquireAsync(2); Assert.True(lease.IsAcquired); var wait1 = limiter.WaitAndAcquireAsync(2); var wait2 = limiter.WaitAndAcquireAsync(); Assert.False(wait1.IsCompleted); Assert.False(wait2.IsCompleted); lease.Dispose(); Assert.True(limiter.TryReplenish()); Assert.False(wait2.IsCompleted); Assert.True(limiter.TryReplenish()); // second queued item completes first with NewestFirst lease = await wait2; Assert.True(lease.IsAcquired); Assert.False(wait1.IsCompleted); lease.Dispose(); Assert.Equal(1, limiter.GetAvailablePermits()); Assert.True(limiter.TryReplenish()); Assert.True(limiter.TryReplenish()); lease = await wait1; Assert.True(lease.IsAcquired); }
public async Task AutoReplenish_ReplenishesCounters() { var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(2, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromMilliseconds(1000), 2, autoReplenishment: true)); Assert.Equal(2, limiter.GetAvailablePermits()); limiter.Acquire(2); var lease = await limiter.WaitAndAcquireAsync(1); Assert.True(lease.IsAcquired); }
public override async Task CanCancelWaitAndAcquireAsyncBeforeQueuing() { var limiter = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions(2, QueueProcessingOrder.OldestFirst, 1, TimeSpan.Zero, 2, autoReplenishment: false)); var lease = limiter.Acquire(2); Assert.True(lease.IsAcquired); var cts = new CancellationTokenSource(); cts.Cancel(); var ex = await Assert.ThrowsAsync <TaskCanceledException>(() => limiter.WaitAndAcquireAsync(1, cts.Token).AsTask()); Assert.Equal(cts.Token, ex.CancellationToken); lease.Dispose(); Assert.True(limiter.TryReplenish()); Assert.Equal(0, limiter.GetAvailablePermits()); }