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

88 lines
2.7 KiB
C#

using Omika.Core.Configuration;
using Omika.Core.Observability;
namespace Omika.Tests.Observability;
/// <summary>
/// Contrat du chemin chaud <c>Track()</c> : il doit rester synchrone, rapide et
/// sans exception dans tous les états du pipeline (désactivé, file vide, presque
/// pleine, pleine, tempête). Aucun IO réseau/fichier/base n'est réalisé : le
/// chemin est purement en mémoire.
/// </summary>
public class TelemetryHotPathTests
{
[Fact]
public void Track_Disabled_ReturnsImmediately()
{
var options = new ObservabilityOptions { Enabled = false };
var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options);
sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted));
Assert.Equal(1L, counters.DroppedDisabled);
}
[Fact]
public void Track_EmptyQueue_Accepts()
{
var (sink, queue, counters) = ObservabilityTestHarness.CreatePipeline();
sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted));
Assert.Equal(1L, counters.Accepted);
Assert.Equal(1, queue.Count);
}
[Fact]
public void Track_NearFullQueue_Accepts()
{
var options = new ObservabilityOptions
{
P0QueueCapacity = 1,
P1QueueCapacity = 1,
P2QueueCapacity = 1,
P3QueueCapacity = 1,
P4QueueCapacity = 1
};
var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options);
sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted));
Assert.Equal(1L, counters.Accepted);
}
[Fact]
public void Track_FullQueue_DropsWithoutThrow()
{
var options = new ObservabilityOptions
{
P0QueueCapacity = 1,
P1QueueCapacity = 1,
P2QueueCapacity = 1,
P3QueueCapacity = 1,
P4QueueCapacity = 1
};
var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options);
sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted));
sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted));
Assert.Equal(1L, counters.Accepted);
Assert.Equal(1L, counters.DroppedQueueFull);
}
[Fact]
public void Track_LogStorm_DoesNotThrow()
{
var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline();
for (int i = 0; i < 100_000; i++)
{
sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted));
}
// Aucune exception ; le flux est borné et comptabilisé.
Assert.Equal(100_000L, counters.Accepted + counters.DroppedTotal);
}
}