Files
2026-10-23 18:46:50 +02:00

132 lines
4.1 KiB
C#

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);
}
}