using Omika.Core.Configuration; using Omika.Core.Observability; namespace Omika.Tests.Observability; public class SafeTelemetrySinkTests { [Fact] public void ValidEvent_IsAccepted() { var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(); sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted)); Assert.Equal(1L, counters.Accepted); Assert.Equal(0L, counters.DroppedTotal); } [Fact] public void NullEvent_IsDropped_WithoutThrow() { var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(); sink.Track(null!); Assert.Equal(1L, counters.DroppedNull); } [Fact] public void Disabled_IsDropped() { var options = new ObservabilityOptions { Enabled = false }; var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options); sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted)); Assert.Equal(1L, counters.DroppedDisabled); Assert.Equal(0L, counters.Accepted); } [Fact] public void ModeOff_IsDropped() { var options = new ObservabilityOptions { Mode = TelemetryMode.Off }; var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options); sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted)); Assert.Equal(1L, counters.DroppedDisabled); } [Fact] public void LevelFiltered_IsDropped() { var options = new ObservabilityOptions { Mode = TelemetryMode.ErrorsOnly }; var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options); sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted, level: TelemetryLevel.Info)); Assert.Equal(1L, counters.DroppedLevel); } [Fact] public void InvalidCode_IsDropped() { var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(); sink.Track(new TelemetryEvent { EventCode = default }); Assert.Equal(1L, counters.DroppedInvalid); } [Fact] public void MetadataTooLarge_IsDropped() { var options = new ObservabilityOptions { MaxMetadataProperties = 2 }; var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options); var metadata = TelemetryMetadata.Create(("a", 1), ("b", 2), ("c", 3)); sink.Track(ObservabilityTestHarness.NewEvent( TelemetryEventCodes.MobileAppStarted, metadata: metadata)); Assert.Equal(1L, counters.DroppedInvalid); } [Fact] public void StringTooLong_IsDropped() { var options = new ObservabilityOptions { MaxStringLength = 4 }; var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(options); var metadata = TelemetryMetadata.Create(("k", new string('x', 10))); sink.Track(ObservabilityTestHarness.NewEvent( TelemetryEventCodes.MobileAppStarted, metadata: metadata)); Assert.Equal(1L, counters.DroppedInvalid); } [Fact] public void QueueFull_IsDropped_WithQueueFullCounter() { 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 Accounting_Invariant_EveryEventIsCountedOnce() { var (sink, _, counters) = ObservabilityTestHarness.CreatePipeline(); for (int i = 0; i < 100; i++) { sink.Track(ObservabilityTestHarness.NewEvent(TelemetryEventCodes.MobileAppStarted)); } Assert.Equal(100L, counters.Accepted + counters.DroppedTotal); } }