public async Task IdleLimiterIsCleanedUp()
        {
            CustomizableLimiter innerLimiter = null;
            var factoryCallCount             = 0;

            using var limiter = Utils.CreatePartitionedLimiterWithoutTimer <string, int>(resource =>
            {
                return(RateLimitPartition.Get(1, _ =>
                {
                    factoryCallCount++;
                    innerLimiter = new CustomizableLimiter();
                    return innerLimiter;
                }));
            });

            var lease = limiter.Acquire("");

            Assert.True(lease.IsAcquired);

            Assert.Equal(1, factoryCallCount);

            var tcs = new TaskCompletionSource <object?>(TaskCreationOptions.RunContinuationsAsynchronously);

            innerLimiter.DisposeAsyncCoreImpl = () =>
            {
                tcs.SetResult(null);
                return(default);
        public async Task Create_DisposeAsyncWithThrowingDisposes_DisposesAllLimiters()
        {
            var limiter1 = new CustomizableLimiter();

            limiter1.DisposeAsyncCoreImpl = () => throw new Exception();
            var limiter2 = new CustomizableLimiter();

            limiter2.DisposeAsyncCoreImpl = () => throw new Exception();
            using var limiter             = PartitionedRateLimiter.Create <string, int>(resource =>
            {
                if (resource == "1")
                {
                    return(RateLimitPartition.Get(1, _ => limiter1));
                }
                return(RateLimitPartition.Get(2, _ => limiter2));
            });

            limiter.Acquire("1");
            limiter.Acquire("2");

            var ex = await Assert.ThrowsAsync <AggregateException>(() => limiter.DisposeAsync().AsTask());

            Assert.Equal(2, ex.InnerExceptions.Count);
        }
示例#3
0
        public void Create_DisposeWithThrowingDisposes_DisposesAllLimiters()
        {
            var limiter1 = new CustomizableLimiter();

            limiter1.DisposeImpl = _ => throw new Exception();
            var limiter2 = new CustomizableLimiter();

            limiter2.DisposeImpl = _ => throw new Exception();
            using var limiter    = PartitionedRateLimiter.Create <string, int>(resource =>
            {
                if (resource == "1")
                {
                    return(RateLimitPartition.Create(1, _ => limiter1));
                }
                return(RateLimitPartition.Create(2, _ => limiter2));
            });

            limiter.Acquire("1");
            limiter.Acquire("2");

            var ex = Assert.Throws <AggregateException>(() => limiter.Dispose());

            Assert.Equal(2, ex.InnerExceptions.Count);
        }