using Omika.Core.Configuration; using Omika.Core.Observability; namespace Omika.Tests.Observability; /// /// Contrat du chemin chaud Track() : 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. /// 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); } }