Files
Omika/tests/Omika.Tests/Observability/Outbox/DiagnosticBackoffPolicyTests.cs
T
2026-10-23 18:46:50 +02:00

66 lines
2.2 KiB
C#

using Omika.Core.Observability.Outbox;
namespace Omika.Tests.Observability.Outbox;
/// <summary>Tests du backoff borné avec jitter (§43).</summary>
public class DiagnosticBackoffPolicyTests
{
[Fact]
public void NextDelay_IsBoundedByMax()
{
var options = new DiagnosticUploadOptions
{
BackoffInitial = TimeSpan.FromSeconds(15),
BackoffMax = TimeSpan.FromHours(1)
};
var policy = new DiagnosticBackoffPolicy(options);
// Garantie absolue : 0 < délai <= MaxDelay, pour tout attempt, y compris les
// valeurs extrêmes. Le jitter (aléatoire) ne peut JAMAIS faire dépasser MaxDelay
// car la borne finale est appliquée après le jitter.
int[] attempts = [0, 1, 5, 9, 20, 50, 100, int.MaxValue];
foreach (int attempt in attempts)
{
TimeSpan delay = policy.NextDelay(attempt);
Assert.True(delay > TimeSpan.Zero, $"attempt {attempt}: délai non strictement positif ({delay})");
Assert.True(delay <= options.BackoffMax, $"attempt {attempt}: délai {delay} dépasse le maximum {options.BackoffMax}");
}
}
[Fact]
public void NextDelay_GrowsWithAttempts()
{
var policy = new DiagnosticBackoffPolicy(new DiagnosticUploadOptions
{
BackoffInitial = TimeSpan.FromSeconds(15),
BackoffMax = TimeSpan.FromHours(1),
BackoffJitter = 0.0
});
TimeSpan first = policy.NextDelay(1);
TimeSpan second = policy.NextDelay(2);
TimeSpan third = policy.NextDelay(3);
Assert.True(second >= first);
Assert.True(third >= second);
}
[Fact]
public void NextDelay_WithJitter_StaysWithinJitterBounds()
{
var options = new DiagnosticUploadOptions
{
BackoffInitial = TimeSpan.FromSeconds(10),
BackoffMax = TimeSpan.FromMinutes(1),
BackoffJitter = 0.2
};
var policy = new DiagnosticBackoffPolicy(options);
for (int i = 0; i < 100; i++)
{
TimeSpan delay = policy.NextDelay(1);
Assert.InRange(delay.TotalMilliseconds, 8000, 12000);
}
}
}