diff --git a/src/Polly/Wrap/IAsyncPolicyPolicyWrapExtensions.cs b/src/Polly/Wrap/IAsyncPolicyPolicyWrapExtensions.cs index 74a113e9cde..8700a14b6aa 100644 --- a/src/Polly/Wrap/IAsyncPolicyPolicyWrapExtensions.cs +++ b/src/Polly/Wrap/IAsyncPolicyPolicyWrapExtensions.cs @@ -3,7 +3,6 @@ /// /// Defines extensions for configuring instances on an or . /// -#pragma warning disable CA1062 // Validate arguments of public methods public static class IAsyncPolicyPolicyWrapExtensions { /// @@ -159,13 +158,20 @@ public partial class Policy /// The policies to place in the wrap, outermost (at left) to innermost (at right). /// The PolicyWrap. /// The enumerable of policies to form the wrap must contain at least two policies. - public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) => - policies.Length switch + public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) + { + if (policies is null) + { + throw new ArgumentNullException(nameof(policies)); + } + + return policies.Length switch { < MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), MinimumPoliciesRequiredForWrap => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]), _ => WrapAsync(policies[0], WrapAsync(policies.Skip(1).ToArray())), }; + } /// /// Creates a of the given policies governing delegates returning values of type . @@ -174,11 +180,18 @@ public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) => /// The return type of delegates which may be executed through the policy. /// The PolicyWrap. /// The enumerable of policies to form the wrap must contain at least two policies. - public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) => - policies.Length switch + public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies) + { + if (policies is null) + { + throw new ArgumentNullException(nameof(policies)); + } + + return policies.Length switch { < MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)), MinimumPoliciesRequiredForWrap => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]), _ => WrapAsync(policies[0], WrapAsync(policies.Skip(1).ToArray())), }; + } } diff --git a/test/Polly.Specs/Caching/CacheAsyncSpecs.cs b/test/Polly.Specs/Caching/CacheAsyncSpecs.cs index 3e9163bfeb7..27cf84dc8e5 100644 --- a/test/Polly.Specs/Caching/CacheAsyncSpecs.cs +++ b/test/Polly.Specs/Caching/CacheAsyncSpecs.cs @@ -302,6 +302,18 @@ public void Should_throw_when_on_cache_put_is_null() action.Should().Throw().And.ParamName.Should().Be(OnCachePutExpected); } + [Fact] + public void Should_throw_when_policies_is_null() + { + IAsyncPolicy[] policies = null!; + IAsyncPolicy[] policiesGeneric = null!; + + Action action = () => Policy.WrapAsync(policies); + action.Should().Throw().And.ParamName.Should().Be("policies"); + + action = () => Policy.WrapAsync(policiesGeneric); + action.Should().Throw().And.ParamName.Should().Be("policies"); + } #endregion #region Caching behaviours