From 2255cd3c14cb8993e5dd426a224da30b61b47e22 Mon Sep 17 00:00:00 2001 From: iancooper Date: Sat, 26 Sep 2026 23:05:08 +0100 Subject: [PATCH] Port App-vNext/Polly@482bdf82: return null from FaultGenerator when no fault is generated The implicit conversion from FaultGenerator to the FaultGenerator delegate dereferenced the generated outcome unconditionally, so a generator with no exceptions registered, or with every weight at zero, threw InvalidOperationException instead of returning null (no fault). Upstream: App-vNext/Polly#3220. Refs #28. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../Simmy/Fault/FaultGenerator.cs | 2 +- .../Simmy/Fault/FaultGeneratorTests.cs | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Paramore.Fences.Core/Simmy/Fault/FaultGenerator.cs b/src/Paramore.Fences.Core/Simmy/Fault/FaultGenerator.cs index c7686900..5901f8f1 100644 --- a/src/Paramore.Fences.Core/Simmy/Fault/FaultGenerator.cs +++ b/src/Paramore.Fences.Core/Simmy/Fault/FaultGenerator.cs @@ -78,6 +78,6 @@ public FaultGenerator AddException(int weight = DefaultWeight) var generatorDelegate = generator._helper.CreateGenerator(); - return args => new ValueTask(generatorDelegate(args.Context)!.Value.Exception); + return args => new ValueTask(generatorDelegate(args.Context)?.Exception); } } diff --git a/test/Paramore.Fences.Core.Tests/Simmy/Fault/FaultGeneratorTests.cs b/test/Paramore.Fences.Core.Tests/Simmy/Fault/FaultGeneratorTests.cs index ba98c44b..c9e8b852 100644 --- a/test/Paramore.Fences.Core.Tests/Simmy/Fault/FaultGeneratorTests.cs +++ b/test/Paramore.Fences.Core.Tests/Simmy/Fault/FaultGeneratorTests.cs @@ -39,6 +39,33 @@ public void AddException_FactoryWithResilienceContext_Ok() Generate(generator).ShouldBeOfType(); } + [Fact] + public void ImplicitConversion_NoExceptionRegistered_ReturnsNull() + { + // Arrange + var generator = new FaultGenerator(); + + // Act + var fault = Generate(generator); + + // Assert + fault.ShouldBeNull(); + } + + [Fact] + public void ImplicitConversion_AllWeightsZero_ReturnsNull() + { + // Arrange + var generator = new FaultGenerator(); + generator.AddException(weight: 0); + + // Act + var fault = Generate(generator); + + // Assert + fault.ShouldBeNull(); + } + private static Exception? Generate(FaultGenerator generator) { Func> func = generator;