Skip to content

Commit 6d758f5

Browse files
authored
Fix CA1062 warnings (#2234)
Fix CA1062 warnings for `CircuitBreakerPolicy`.
1 parent 975a640 commit 6d758f5

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

src/Polly/CircuitBreaker/CircuitBreakerPolicy.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
/// <summary>
44
/// A circuit-breaker policy that can be applied to delegates.
55
/// </summary>
6-
#pragma warning disable CA1062 // Validate arguments of public methods
76
public class CircuitBreakerPolicy : Policy, ICircuitBreakerPolicy
87
{
98
internal readonly ICircuitController<EmptyStruct> BreakerController;
@@ -98,12 +97,19 @@ public void Reset() =>
9897

9998
/// <inheritdoc/>
10099
[DebuggerStepThrough]
101-
protected override TResult Implementation(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken) =>
102-
CircuitBreakerEngine.Implementation(
100+
protected override TResult Implementation(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken)
101+
{
102+
if (action is null)
103+
{
104+
throw new ArgumentNullException(nameof(action));
105+
}
106+
107+
return CircuitBreakerEngine.Implementation(
103108
action,
104109
context,
105110
ExceptionPredicates,
106111
ResultPredicates,
107112
BreakerController,
108113
cancellationToken);
114+
}
109115
}

test/Polly.Specs/CircuitBreaker/CircuitBreakerTResultSpecs.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,43 @@ public class CircuitBreakerTResultSpecs : IDisposable
77
{
88
#region Configuration tests
99

10+
[Fact]
11+
public void Should_throw_when_action_is_null()
12+
{
13+
var flags = BindingFlags.NonPublic | BindingFlags.Instance;
14+
Func<Context, CancellationToken, EmptyStruct> action = null!;
15+
PolicyBuilder<EmptyStruct> policyBuilder = new PolicyBuilder<EmptyStruct>(exception => exception);
16+
17+
var exceptionsAllowedBeforeBreaking = 1;
18+
var durationOfBreak = TimeSpan.Zero;
19+
Action<DelegateResult<EmptyStruct>, CircuitState, TimeSpan, Context> onBreak = null!;
20+
Action<Context> onReset = null!;
21+
Action onHalfOpen = null!;
22+
ICircuitController<EmptyStruct> breakerController = new ConsecutiveCountCircuitController<EmptyStruct>(
23+
exceptionsAllowedBeforeBreaking,
24+
durationOfBreak,
25+
onBreak,
26+
onReset,
27+
onHalfOpen);
28+
29+
var instance = Activator.CreateInstance(
30+
typeof(CircuitBreakerPolicy<EmptyStruct>),
31+
flags,
32+
null,
33+
[policyBuilder, breakerController],
34+
null)!;
35+
var instanceType = instance.GetType();
36+
var methods = instanceType.GetMethods(flags);
37+
var methodInfo = methods.First(method => method is { Name: "Implementation", ReturnType.Name: "EmptyStruct" });
38+
39+
var func = () => methodInfo.Invoke(instance, [action, new Context(), CancellationToken.None]);
40+
41+
var exceptionAssertions = func.Should().Throw<TargetInvocationException>();
42+
exceptionAssertions.And.Message.Should().Be("Exception has been thrown by the target of an invocation.");
43+
exceptionAssertions.And.InnerException.Should().BeOfType<ArgumentNullException>()
44+
.Which.ParamName.Should().Be("action");
45+
}
46+
1047
[Fact]
1148
public void Should_be_able_to_handle_a_duration_of_timespan_maxvalue()
1249
{

0 commit comments

Comments
 (0)