예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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
        }
예제 #4
0
        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);
        }