From 1eb8311e1081fa91e28b1b097917c87eb6e91759 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:18:41 +0000 Subject: [PATCH 1/2] Initial plan From f55a0a2410fe26124925dda1a706d7a348e43fc6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:23:46 +0000 Subject: [PATCH 2/2] Wrap all ServiceProvider instances in await using to properly dispose resources Co-authored-by: torosent <17064840+torosent@users.noreply.github.com> --- ...rableTaskSchedulerWorkerExtensionsTests.cs | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerExtensionsTests.cs b/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerExtensionsTests.cs index 1db552db2..6e08347ee 100644 --- a/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerExtensionsTests.cs +++ b/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerExtensionsTests.cs @@ -19,7 +19,7 @@ public class DurableTaskSchedulerWorkerExtensionsTests const string ValidTaskHub = "testhub"; [Fact] - public void UseDurableTaskScheduler_WithEndpointAndCredential_ShouldConfigureCorrectly() + public async Task UseDurableTaskScheduler_WithEndpointAndCredential_ShouldConfigureCorrectly() { // Arrange ServiceCollection services = new ServiceCollection(); @@ -31,7 +31,7 @@ public void UseDurableTaskScheduler_WithEndpointAndCredential_ShouldConfigureCor mockBuilder.Object.UseDurableTaskScheduler(ValidEndpoint, ValidTaskHub, credential); // Assert - ServiceProvider provider = services.BuildServiceProvider(); + await using ServiceProvider provider = services.BuildServiceProvider(); IOptions? options = provider.GetService>(); options.Should().NotBeNull(); @@ -45,7 +45,7 @@ public void UseDurableTaskScheduler_WithEndpointAndCredential_ShouldConfigureCor } [Fact] - public void UseDurableTaskScheduler_WithConnectionString_ShouldConfigureCorrectly() + public async Task UseDurableTaskScheduler_WithConnectionString_ShouldConfigureCorrectly() { // Arrange ServiceCollection services = new ServiceCollection(); @@ -57,7 +57,7 @@ public void UseDurableTaskScheduler_WithConnectionString_ShouldConfigureCorrectl mockBuilder.Object.UseDurableTaskScheduler(connectionString); // Assert - ServiceProvider provider = services.BuildServiceProvider(); + await using ServiceProvider provider = services.BuildServiceProvider(); IOptions? options = provider.GetService>(); options.Should().NotBeNull(); @@ -71,7 +71,7 @@ public void UseDurableTaskScheduler_WithConnectionString_ShouldConfigureCorrectl } [Fact] - public void UseDurableTaskScheduler_WithLocalhostConnectionString_ShouldConfigureCorrectly() + public async Task UseDurableTaskScheduler_WithLocalhostConnectionString_ShouldConfigureCorrectly() { // Arrange ServiceCollection services = new(); @@ -83,7 +83,7 @@ public void UseDurableTaskScheduler_WithLocalhostConnectionString_ShouldConfigur mockBuilder.Object.UseDurableTaskScheduler(connectionString); // Assert - ServiceProvider provider = services.BuildServiceProvider(); + await using ServiceProvider provider = services.BuildServiceProvider(); IOptions? options = provider.GetService>(); options.Should().NotBeNull(); @@ -99,7 +99,7 @@ public void UseDurableTaskScheduler_WithLocalhostConnectionString_ShouldConfigur [Theory] [InlineData(null, "testhub")] [InlineData("myaccount.westus3.durabletask.io", null)] - public void UseDurableTaskScheduler_WithNullParameters_ShouldThrowOptionsValidationException(string? endpoint, string? taskHub) + public async Task UseDurableTaskScheduler_WithNullParameters_ShouldThrowOptionsValidationException(string? endpoint, string? taskHub) { // Arrange ServiceCollection services = new ServiceCollection(); @@ -109,7 +109,7 @@ public void UseDurableTaskScheduler_WithNullParameters_ShouldThrowOptionsValidat // Act mockBuilder.Object.UseDurableTaskScheduler(endpoint!, taskHub!, credential); - ServiceProvider provider = services.BuildServiceProvider(); + await using ServiceProvider provider = services.BuildServiceProvider(); // Assert var action = () => provider.GetRequiredService>().Value; @@ -120,7 +120,7 @@ public void UseDurableTaskScheduler_WithNullParameters_ShouldThrowOptionsValidat } [Fact] - public void UseDurableTaskScheduler_WithNullCredential_ShouldSucceed() + public async Task UseDurableTaskScheduler_WithNullCredential_ShouldSucceed() { // Arrange ServiceCollection services = new ServiceCollection(); @@ -133,7 +133,7 @@ public void UseDurableTaskScheduler_WithNullCredential_ShouldSucceed() action.Should().NotThrow(); // Validate the configured options - ServiceProvider provider = services.BuildServiceProvider(); + await using ServiceProvider provider = services.BuildServiceProvider(); var workerOptions = provider.GetRequiredService>().Value; workerOptions.EndpointAddress.Should().Be(ValidEndpoint); workerOptions.TaskHubName.Should().Be(ValidTaskHub); @@ -175,7 +175,7 @@ public void UseDurableTaskScheduler_WithNullOrEmptyConnectionString_ShouldThrowA } [Fact] - public void UseDurableTaskScheduler_WithNamedOptions_ShouldConfigureCorrectly() + public async Task UseDurableTaskScheduler_WithNamedOptions_ShouldConfigureCorrectly() { // Arrange ServiceCollection services = new ServiceCollection(); @@ -188,7 +188,7 @@ public void UseDurableTaskScheduler_WithNamedOptions_ShouldConfigureCorrectly() mockBuilder.Object.UseDurableTaskScheduler(ValidEndpoint, ValidTaskHub, credential); // Assert - ServiceProvider provider = services.BuildServiceProvider(); + await using ServiceProvider provider = services.BuildServiceProvider(); IOptionsMonitor? optionsMonitor = provider.GetService>(); optionsMonitor.Should().NotBeNull(); DurableTaskSchedulerWorkerOptions options = optionsMonitor!.Get("CustomName"); @@ -264,16 +264,16 @@ public async Task UseDurableTaskScheduler_ServiceProviderDispose_DisposesChannel // Act mockBuilder.Object.UseDurableTaskScheduler(ValidEndpoint, ValidTaskHub, credential); - ServiceProvider provider = services.BuildServiceProvider(); - - // Resolve options to trigger channel creation - IOptionsMonitor optionsMonitor = provider.GetRequiredService>(); - GrpcDurableTaskWorkerOptions options = optionsMonitor.Get(Options.DefaultName); - options.Channel.Should().NotBeNull(); - GrpcChannel channel = options.Channel!; - - // Dispose the service provider - this should dispose the ConfigureGrpcChannel which disposes channels - await provider.DisposeAsync(); + + GrpcChannel channel; + await using (ServiceProvider provider = services.BuildServiceProvider()) + { + // Resolve options to trigger channel creation + IOptionsMonitor optionsMonitor = provider.GetRequiredService>(); + GrpcDurableTaskWorkerOptions options = optionsMonitor.Get(Options.DefaultName); + options.Channel.Should().NotBeNull(); + channel = options.Channel!; + } // Assert - verify the channel was disposed by checking it throws ObjectDisposedException Action action = () => channel.CreateCallInvoker(); @@ -303,13 +303,13 @@ public async Task UseDurableTaskScheduler_ConfigureAfterDispose_ThrowsObjectDisp // Act mockBuilder.Object.UseDurableTaskScheduler(ValidEndpoint, ValidTaskHub, credential); - ServiceProvider provider = services.BuildServiceProvider(); - - // Resolve options monitor before disposal - IOptionsMonitor optionsMonitor = provider.GetRequiredService>(); - - // Dispose the service provider - await provider.DisposeAsync(); + + IOptionsMonitor optionsMonitor; + await using (ServiceProvider provider = services.BuildServiceProvider()) + { + // Resolve options monitor before disposal + optionsMonitor = provider.GetRequiredService>(); + } // Assert - attempting to get options after disposal should throw Action action = () => optionsMonitor.Get(Options.DefaultName);