88 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|