public async Task Create_MultipleReplenishingLimitersReplenishAutomatically() { using var limiter = PartitionedRateLimiter.Create <string, int>(resource => { if (resource == "1") { return(RateLimitPartition.CreateTokenBucketLimiter(1, _ => new TokenBucketRateLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1, TimeSpan.FromMilliseconds(100), 1, false))); } return(RateLimitPartition.CreateTokenBucketLimiter(2, _ => new TokenBucketRateLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1, TimeSpan.FromMilliseconds(100), 1, false))); }); var lease = limiter.Acquire("1"); Assert.True(lease.IsAcquired); lease = await limiter.WaitAsync("1"); Assert.True(lease.IsAcquired); // Creates the second Replenishing limiter // Indirectly tests that the cached list of limiters used by the timer is probably updated by making sure a limiter already made use of it before we create a second replenishing one lease = limiter.Acquire("2"); Assert.True(lease.IsAcquired); lease = await limiter.WaitAsync("1"); Assert.True(lease.IsAcquired); lease = await limiter.WaitAsync("2"); Assert.True(lease.IsAcquired); }
public void Create_TokenBucket() { var options = new TokenBucketRateLimiterOptions(1, QueueProcessingOrder.OldestFirst, 10, TimeSpan.FromMinutes(1), 1, true); var partition = RateLimitPartition.CreateTokenBucketLimiter(1, key => options); var limiter = partition.Factory(1); var tokenBucketLimiter = Assert.IsType <TokenBucketRateLimiter>(limiter); Assert.Equal(options.TokenLimit, tokenBucketLimiter.GetAvailablePermits()); Assert.Equal(options.ReplenishmentPeriod, tokenBucketLimiter.ReplenishmentPeriod); Assert.False(tokenBucketLimiter.IsAutoReplenishing); }
public void Create_TokenBucket() { var options = new TokenBucketRateLimiterOptions(1, QueueProcessingOrder.OldestFirst, 10, TimeSpan.FromMinutes(1), 1, true); var partition = RateLimitPartition.CreateTokenBucketLimiter(1, key => options); var factoryProperty = typeof(RateLimitPartition <int>).GetField("Factory", Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Instance) !; var factory = (Func <int, RateLimiter>)factoryProperty.GetValue(partition); var limiter = factory(1); var tokenBucketLimiter = Assert.IsType <TokenBucketRateLimiter>(limiter); Assert.Equal(options.TokenLimit, tokenBucketLimiter.GetAvailablePermits()); // TODO: Check other properties when ReplenshingRateLimiter is merged // TODO: Check that autoReplenishment: true got changed to false }
public async Task Create_WithTokenBucketReplenishesAutomatically() { using var limiter = PartitionedRateLimiter.Create <string, int>(resource => { return(RateLimitPartition.CreateTokenBucketLimiter(1, _ => new TokenBucketRateLimiterOptions(1, QueueProcessingOrder.NewestFirst, 1, TimeSpan.FromMilliseconds(100), 1, false))); }); var lease = limiter.Acquire(""); Assert.True(lease.IsAcquired); lease = await limiter.WaitAsync(""); Assert.True(lease.IsAcquired); }