From 0bafdd5bbf7e2432d47976e4ce1d9c242b439ab9 Mon Sep 17 00:00:00 2001 From: martincostello Date: Tue, 14 Apr 2026 21:27:07 +0100 Subject: [PATCH 1/2] Assert nullable has result Cherry-pick fix from #2931 for new compiler warning when accessing `Nullable.Value`. --- .../Controller/CircuitStateControllerTests.cs | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs b/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs index d453f95c4f4..94972377b77 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs @@ -53,7 +53,10 @@ public async Task IsolateAsync_Ok() called.ShouldBeTrue(); var outcome = await controller.OnActionPreExecuteAsync(context); - var exception = outcome.Value.Exception.ShouldBeOfType(); + + Assert.True(outcome.HasValue); + + var exception = outcome.GetValueOrDefault().Exception.ShouldBeOfType(); exception.RetryAfter.ShouldBeNull(); exception.TelemetrySource.ShouldNotBeNull(); @@ -125,7 +128,12 @@ public async Task OnActionPreExecute_CircuitOpenedByValue() using var controller = CreateController(); await OpenCircuit(controller, Outcome.FromResult(99)); - var exception = (BrokenCircuitException)(await controller.OnActionPreExecuteAsync(context)).Value.Exception!; + + var outcome = await controller.OnActionPreExecuteAsync(context); + + Assert.True(outcome.HasValue); + + var exception = outcome.GetValueOrDefault().Exception.ShouldBeOfType(); exception.RetryAfter.ShouldNotBeNull(); exception.TelemetrySource.ShouldNotBeNull(); @@ -149,7 +157,9 @@ await OpenCircuit( { try { - (await controller.OnActionPreExecuteAsync(context)).Value.ThrowIfException(); + var outcome = await controller.OnActionPreExecuteAsync(context); + Assert.True(outcome.HasValue); + (await controller.OnActionPreExecuteAsync(context)).GetValueOrDefault().ThrowIfException(); } catch (BrokenCircuitException e) { @@ -217,7 +227,12 @@ public async Task OnActionPreExecute_CircuitOpenedByException() using var controller = CreateController(); await OpenCircuit(controller, Outcome.FromException(new InvalidOperationException())); - var exception = (BrokenCircuitException)(await controller.OnActionPreExecuteAsync(context)).Value.Exception!; + + var outcome = await controller.OnActionPreExecuteAsync(context); + + Assert.True(outcome.HasValue); + + var exception = outcome.GetValueOrDefault().Exception.ShouldBeOfType(); exception.InnerException.ShouldBeOfType(); exception.RetryAfter.ShouldNotBeNull(); exception.TelemetrySource.ShouldNotBeNull(); @@ -276,10 +291,13 @@ public async Task OnActionPreExecute_HalfOpen() // act await controller.OnActionPreExecuteAsync(context); - var error = (await controller.OnActionPreExecuteAsync(context)).Value.Exception; + + var outcome = await controller.OnActionPreExecuteAsync(context); // assert - var exception = error.ShouldBeOfType(); + Assert.True(outcome.HasValue); + + var exception = outcome.GetValueOrDefault().Exception.ShouldBeOfType(); exception.RetryAfter.ShouldNotBeNull(); exception.TelemetrySource.ShouldNotBeNull(); controller.CircuitState.ShouldBe(CircuitState.HalfOpen); @@ -489,7 +507,10 @@ public async Task OnActionFailureAsync_VoidResult_EnsureBreakingExceptionNotSet( // assert controller.LastException.ShouldBeNull(); var outcome = await controller.OnActionPreExecuteAsync(context); - var exception = outcome.Value.Exception.ShouldBeOfType(); + + Assert.True(outcome.HasValue); + + var exception = outcome.GetValueOrDefault().Exception.ShouldBeOfType(); exception.RetryAfter.ShouldNotBeNull(); exception.TelemetrySource.ShouldNotBeNull(); } @@ -530,7 +551,10 @@ public async Task Flow_Closed_HalfOpen_Open_HalfOpen_Closed() TimeSpan advanceTimeRejected = TimeSpan.FromMilliseconds(1); AdvanceTime(advanceTimeRejected); var outcome = await controller.OnActionPreExecuteAsync(context); - var exception = outcome.Value.Exception.ShouldBeOfType(); + + Assert.True(outcome.HasValue); + + var exception = outcome.GetValueOrDefault().Exception.ShouldBeOfType(); exception.RetryAfter.ShouldBe(_options.BreakDuration - advanceTimeRejected); exception.TelemetrySource.ShouldNotBeNull(); From 0c0591c1018e0120055efb77f4473f849af06717 Mon Sep 17 00:00:00 2001 From: martincostello Date: Tue, 14 Apr 2026 21:40:37 +0100 Subject: [PATCH 2/2] Fix refactor Fix double-execution by mistake. --- .../CircuitBreaker/Controller/CircuitStateControllerTests.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs b/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs index 94972377b77..9cae4025dc6 100644 --- a/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs +++ b/test/Polly.Core.Tests/CircuitBreaker/Controller/CircuitStateControllerTests.cs @@ -158,8 +158,10 @@ await OpenCircuit( try { var outcome = await controller.OnActionPreExecuteAsync(context); + Assert.True(outcome.HasValue); - (await controller.OnActionPreExecuteAsync(context)).GetValueOrDefault().ThrowIfException(); + + outcome.GetValueOrDefault().ThrowIfException(); } catch (BrokenCircuitException e) {