132 lines
4.1 KiB
C#
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);
|
|
}
|
|
}
|