diff --git a/test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs b/test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs index c942a29f114..cfc57391ad9 100644 --- a/test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs +++ b/test/Polly.RateLimiting.Tests/RateLimiterResiliencePipelineBuilderExtensionsTests.cs @@ -161,6 +161,68 @@ public async Task DisposeRegistry_EnsureRateLimiterDisposed() Should.Throw(() => strategy.AsPipeline().Execute(() => { })); } + [Fact] + public void TypedBuilder_AddConcurrencyLimiter_BuildsRateLimiterStrategy() + { + var pipeline = new ResiliencePipelineBuilder() + .AddConcurrencyLimiter(permitLimit: 2, queueLimit: 1); + + pipeline.Build() + .GetPipelineDescriptor() + .FirstStrategy + .StrategyInstance + .ShouldBeOfType(); + } + + [Fact] + public void AddRateLimiter_WithNullLimiter_Throws() + { + var builder = new ResiliencePipelineBuilder(); + Should.Throw(() => builder.AddRateLimiter(limiter: null!)); + } + + [Fact] + public void AddRateLimiter_WithNullOptions_Throws() + { + var builder = new ResiliencePipelineBuilder(); + Should.Throw(() => builder.AddRateLimiter(options: null!)); + } + + [Fact] + public void AddConcurrencyLimiter_WithNullOptions_Throws() + { + var builder = new ResiliencePipelineBuilder(); + Should.Throw(() => builder.AddConcurrencyLimiter(options: null!)); + } + + [Fact] + public async Task RegistryDispose_DoesNotDisposeExternalLimiter() + { + using var externalLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions + { + PermitLimit = 1, + QueueLimit = 0 + }); + + var registry = new ResiliencePipelineRegistry(); + _ = registry.GetOrAddPipeline("ext", p => p.AddRateLimiter(externalLimiter)); + + await registry.DisposeAsync(); + + await Should.NotThrowAsync(async () => + { + var lease = await externalLimiter.AcquireAsync(1, System.Threading.CancellationToken.None); + try + { + lease.IsAcquired.ShouldBeTrue(); + } + finally + { + lease.Dispose(); + } + }); + } + private static void AssertRateLimiterStrategy(ResiliencePipelineBuilder builder, Action? assert = null, bool hasEvents = false) { ResiliencePipeline strategy = builder.Build();