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); }
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); }