diff --git a/src/Polly/Fallback/FallbackPolicy.cs b/src/Polly/Fallback/FallbackPolicy.cs index 67eed44f058..f45cfc9ddba 100644 --- a/src/Polly/Fallback/FallbackPolicy.cs +++ b/src/Polly/Fallback/FallbackPolicy.cs @@ -4,7 +4,6 @@ namespace Polly.Fallback; /// /// A fallback policy that can be applied to delegates. /// -#pragma warning disable CA1062 // Validate arguments of public methods public class FallbackPolicy : Policy, IFallbackPolicy { private readonly Action _onFallback; @@ -69,8 +68,14 @@ internal FallbackPolicy( /// [DebuggerStepThrough] - protected override TResult Implementation(Func action, Context context, CancellationToken cancellationToken) => - FallbackEngine.Implementation( + protected override TResult Implementation(Func action, Context context, CancellationToken cancellationToken) + { + if (action is null) + { + throw new ArgumentNullException(nameof(action)); + } + + return FallbackEngine.Implementation( action, context, ExceptionPredicates, @@ -78,4 +83,5 @@ protected override TResult Implementation(Func action = null!; + PolicyBuilder policyBuilder = new PolicyBuilder(exception => exception); + Action, Context> onFallback = (_, _) => { }; + Func, Context, CancellationToken, EmptyStruct> fallbackAction = (_, _, _) => EmptyStruct.Instance; + + var instance = Activator.CreateInstance( + typeof(FallbackPolicy), + flags, + null, + [policyBuilder, onFallback, fallbackAction], + null)!; + var instanceType = instance.GetType(); + var methods = instanceType.GetMethods(flags); + var methodInfo = methods.First(method => method is { Name: "Implementation", ReturnType.Name: "EmptyStruct" }); + + var func = () => methodInfo.Invoke(instance, [action, new Context(), CancellationToken.None]); + + var exceptionAssertions = func.Should().Throw(); + exceptionAssertions.And.Message.Should().Be("Exception has been thrown by the target of an invocation."); + exceptionAssertions.And.InnerException.Should().BeOfType() + .Which.ParamName.Should().Be("action"); + } + [Fact] public void Should_throw_when_fallback_action_is_null() {