From e52e13d0b1b70d394b278e0ed5e851cfb1046e4e Mon Sep 17 00:00:00 2001 From: ZLoo Date: Sun, 21 Jul 2024 21:20:06 +0300 Subject: [PATCH] Fix warning CA1062#AsyncNoOpPolicy --- src/Polly/NoOp/AsyncNoOpPolicy.cs | 23 +++++++++++++++---- test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs | 19 +++++++++++++++ .../Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs | 18 +++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/Polly/NoOp/AsyncNoOpPolicy.cs b/src/Polly/NoOp/AsyncNoOpPolicy.cs index 0eb7eef5e3c..277dad9640e 100644 --- a/src/Polly/NoOp/AsyncNoOpPolicy.cs +++ b/src/Polly/NoOp/AsyncNoOpPolicy.cs @@ -4,7 +4,6 @@ namespace Polly.NoOp; /// /// A noop policy that can be applied to asynchronous delegates. /// -#pragma warning disable CA1062 // Validate arguments of public methods public class AsyncNoOpPolicy : AsyncPolicy, INoOpPolicy { internal AsyncNoOpPolicy() @@ -14,8 +13,15 @@ internal AsyncNoOpPolicy() /// [DebuggerStepThrough] protected override Task ImplementationAsync(Func> action, Context context, CancellationToken cancellationToken, - bool continueOnCapturedContext) => - NoOpEngine.ImplementationAsync(action, context, cancellationToken); + bool continueOnCapturedContext) + { + if (action is null) + { + throw new ArgumentNullException(nameof(action)); + } + + return NoOpEngine.ImplementationAsync(action, context, cancellationToken); + } } /// @@ -31,6 +37,13 @@ internal AsyncNoOpPolicy() /// [DebuggerStepThrough] protected override Task ImplementationAsync(Func> action, Context context, CancellationToken cancellationToken, - bool continueOnCapturedContext) => - NoOpEngine.ImplementationAsync(action, context, cancellationToken); + bool continueOnCapturedContext) + { + if (action is null) + { + throw new ArgumentNullException(nameof(action)); + } + + return NoOpEngine.ImplementationAsync(action, context, cancellationToken); + } } diff --git a/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs b/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs index c94cf069ea0..b89b21bb1fe 100644 --- a/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs +++ b/test/Polly.Specs/NoOp/NoOpAsyncSpecs.cs @@ -2,6 +2,25 @@ public class NoOpAsyncSpecs { + [Fact] + public void Should_throw_when_action_is_null() + { + var flags = BindingFlags.NonPublic | BindingFlags.Instance; + Func> action = null!; + + var instance = Activator.CreateInstance(typeof(AsyncNoOpPolicy), true)!; + var instanceType = instance.GetType(); + var methods = instanceType.GetMethods(flags); + var methodInfo = methods.First(method => method is { Name: "ImplementationAsync", ReturnType.Name: "Task`1" }); + var generic = methodInfo.MakeGenericMethod(typeof(EmptyStruct)); + + var func = () => generic.Invoke(instance, [action, new Context(), CancellationToken.None, false]); + + var exceptionAssertions = func.Should().Throw(); + exceptionAssertions.And.Message.Should().Be("Exception has been thrown by the target of an invocation."); + exceptionAssertions.WithInnerException("action"); + } + [Fact] public async Task Should_execute_user_delegate() { diff --git a/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs b/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs index b8f9b3b18bc..03e24cf3c16 100644 --- a/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs +++ b/test/Polly.Specs/NoOp/NoOpTResultAsyncSpecs.cs @@ -2,6 +2,24 @@ public class NoOpTResultAsyncSpecs { + [Fact] + public void Should_throw_when_action_is_null() + { + var flags = BindingFlags.NonPublic | BindingFlags.Instance; + Func> action = null!; + + var instance = Activator.CreateInstance(typeof(AsyncNoOpPolicy), true)!; + var instanceType = instance.GetType(); + var methods = instanceType.GetMethods(flags); + var methodInfo = methods.First(method => method is { Name: "ImplementationAsync", ReturnType.Name: "Task`1" }); + + var func = () => methodInfo.Invoke(instance, [action, new Context(), CancellationToken.None, false]); + + var exceptionAssertions = func.Should().Throw(); + exceptionAssertions.And.Message.Should().Be("Exception has been thrown by the target of an invocation."); + exceptionAssertions.WithInnerException("action"); + } + [Fact] public async Task Should_execute_user_delegate() {