-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
HedgingStrategyOptionsTests.cs
85 lines (73 loc) · 2.79 KB
/
HedgingStrategyOptionsTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System.ComponentModel.DataAnnotations;
using Polly.Hedging;
using Polly.Utils;
namespace Polly.Core.Tests.Hedging;
public class HedgingStrategyOptionsTests
{
[Fact]
public void Ctor_EnsureDefaults()
{
var options = new HedgingStrategyOptions<int>();
options.ShouldHandle.Should().NotBeNull();
options.ActionGenerator.Should().NotBeNull();
options.Delay.Should().Be(TimeSpan.FromSeconds(2));
options.MaxHedgedAttempts.Should().Be(1);
options.OnHedging.Should().BeNull();
options.Name.Should().Be("Hedging");
}
[InlineData(true)]
[InlineData(false)]
[Theory]
public async Task HedgingActionGenerator_EnsureDefaults(bool synchronous)
{
var options = new HedgingStrategyOptions<int>();
var context = ResilienceContextPool.Shared.Get().Initialize<int>(synchronous);
var threadId = Thread.CurrentThread.ManagedThreadId;
var action = options.ActionGenerator(new HedgingActionGeneratorArguments<int>(context, context, 1, c =>
{
if (synchronous)
{
Thread.CurrentThread.ManagedThreadId.Should().NotBe(threadId);
}
else
{
Thread.CurrentThread.ManagedThreadId.Should().Be(threadId);
}
return Outcome.FromResultAsValueTask(99);
}))!;
action.Should().NotBeNull();
(await action()).Result.Should().Be(99);
}
[Fact]
public async Task ShouldHandle_EnsureDefaults()
{
var options = new HedgingStrategyOptions<int>();
var context = ResilienceContextPool.Shared.Get();
(await options.ShouldHandle(new HedgingPredicateArguments<int>(context, Outcome.FromResult(0)))).Should().Be(false);
(await options.ShouldHandle(new HedgingPredicateArguments<int>(context, Outcome.FromException<int>(new OperationCanceledException())))).Should().Be(false);
(await options.ShouldHandle(new HedgingPredicateArguments<int>(context, Outcome.FromException<int>(new InvalidOperationException())))).Should().Be(true);
}
[Fact]
public void Validation()
{
var options = new HedgingStrategyOptions<int>
{
DelayGenerator = null!,
ShouldHandle = null!,
MaxHedgedAttempts = -1,
OnHedging = null!,
ActionGenerator = null!
};
options
.Invoking(o => ValidationHelper.ValidateObject(new(o, "Invalid.")))
.Should()
.Throw<ValidationException>()
.WithMessage("""
Invalid.
Validation Errors:
The field MaxHedgedAttempts must be between 1 and 10.
The ShouldHandle field is required.
The ActionGenerator field is required.
""");
}
}