Skip to content

Commit 99e5415

Browse files
committed
Add tests
1 parent 485690f commit 99e5415

4 files changed

Lines changed: 175 additions & 5 deletions

File tree

src/plugins/ConsolePollyTest/ConsolePollyTest.csproj

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.6" />
12-
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.6" />
13-
<PackageReference Include="Polly.Core" Version="8.6.1" />
14-
<PackageReference Include="Polly.Extensions" Version="8.6.1" />
11+
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.7" />
12+
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.7" />
13+
<PackageReference Include="Polly" Version="8.6.2" />
14+
<PackageReference Include="Polly.Extensions" Version="8.6.2" />
15+
<PackageReference Include="Polly.RateLimiting" Version="8.6.2" />
1516
</ItemGroup>
1617

1718
</Project>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using Polly;
2+
using Polly.Fallback;
3+
4+
namespace ConsolePollyTest;
5+
6+
public static class PollyFallbackTest
7+
{
8+
9+
#region Constants & Statics
10+
11+
public static async Task Fallback_TestAsync()
12+
{
13+
var options = TestBase.GetTelemetry();
14+
var builder = new ResiliencePipelineBuilder<MyClass>().ConfigureTelemetry(options)
15+
.AddFallback(
16+
new FallbackStrategyOptions<MyClass>
17+
{
18+
ShouldHandle = static (args) =>
19+
{
20+
// Handle all exceptions
21+
return ValueTask.FromResult(true);
22+
},
23+
FallbackAction = static (args) =>
24+
{
25+
// Return a new instance of MyClass as fallback
26+
return Outcome.FromResultAsValueTask(new MyClass("fallback"));
27+
},
28+
OnFallback = static (args) =>
29+
{
30+
Console.WriteLine($"Fallback executed for: {args.Outcome.Result?.PropertyName}");
31+
return ValueTask.CompletedTask;
32+
}
33+
});
34+
35+
var pipeline = builder.Build();
36+
37+
using var client = TestBase.GetClient();
38+
39+
var result = await pipeline.ExecuteAsync(
40+
async (token) =>
41+
{
42+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
43+
44+
return new MyClass("return");
45+
},
46+
cancellationToken: default);
47+
48+
Console.WriteLine(result.PropertyName);
49+
}
50+
51+
#endregion
52+
53+
public class MyClass
54+
{
55+
public MyClass(string propertyName)
56+
{
57+
PropertyName = propertyName;
58+
}
59+
60+
#region Properties
61+
62+
public string PropertyName { get; private set; }
63+
64+
#endregion
65+
}
66+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using Polly;
2+
using Polly.Timeout;
3+
4+
namespace ConsolePollyTest;
5+
6+
public static class PollyTimeoutTest
7+
{
8+
9+
#region Constants & Statics
10+
11+
public static async Task Timeout_OuterCancel_TestAsync()
12+
{
13+
var options = TestBase.GetTelemetry();
14+
var builder = new ResiliencePipelineBuilder().ConfigureTelemetry(options)
15+
.AddTimeout(
16+
new TimeoutStrategyOptions
17+
{
18+
Timeout = TimeSpan.FromSeconds(1),
19+
OnTimeout = (args) =>
20+
{
21+
Console.WriteLine(args.Context);
22+
23+
return ValueTask.CompletedTask;
24+
}
25+
});
26+
27+
var pipeline = builder.Build();
28+
29+
using var client = TestBase.GetClient();
30+
31+
using var cts = new CancellationTokenSource();
32+
var outerToken = cts.Token;
33+
34+
try
35+
{
36+
var result = await pipeline.ExecuteAsync(
37+
async (token) =>
38+
{
39+
//使用 outerToken 而不是 token,不会抛出 TimeoutRejectedException 异常
40+
await Task.Delay(2_000, outerToken);
41+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), outerToken);
42+
43+
return r;
44+
},
45+
cancellationToken: outerToken);
46+
47+
Console.WriteLine(result);
48+
}
49+
catch (TimeoutRejectedException ex)
50+
{
51+
Console.WriteLine(ex);
52+
}
53+
}
54+
55+
public static async Task Timeout_TestAsync()
56+
{
57+
var options = TestBase.GetTelemetry();
58+
var builder = new ResiliencePipelineBuilder().ConfigureTelemetry(options)
59+
.AddTimeout(
60+
new TimeoutStrategyOptions
61+
{
62+
Timeout = TimeSpan.FromSeconds(1),
63+
OnTimeout = (args) =>
64+
{
65+
Console.WriteLine(args.Context);
66+
67+
return ValueTask.CompletedTask;
68+
}
69+
});
70+
71+
var pipeline = builder.Build();
72+
73+
using var client = TestBase.GetClient();
74+
75+
try
76+
{
77+
var result = await pipeline.ExecuteAsync(
78+
async (token) =>
79+
{
80+
await Task.Delay(2_000, token);
81+
82+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
83+
84+
return r;
85+
},
86+
cancellationToken: default);
87+
88+
Console.WriteLine(result);
89+
}
90+
catch (TimeoutRejectedException ex)
91+
{
92+
Console.WriteLine(ex);
93+
}
94+
}
95+
96+
#endregion
97+
98+
}

src/plugins/ConsolePollyTest/Program.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ private static async Task Main(string[] args)
1111
//await PollyRetryTest.Retry_ExecThree_TestAsync();
1212
//await PollyRetryTest.Retry_UseOnePipeline_TestAsync();
1313

14-
await PollyCircuitTest.Circuit_3Per2sec_TestAsync();
14+
//await PollyCircuitTest.Circuit_3Per2sec_TestAsync();
15+
16+
//await PollyFallbackTest.Fallback_TestAsync();
17+
18+
//await PollyTimeoutTest.Timeout_TestAsync();
19+
await PollyTimeoutTest.Timeout_OuterCancel_TestAsync();
1520

1621
_ = Console.ReadKey();
1722
}

0 commit comments

Comments
 (0)