Files
Omika/tests/Omika.Tests/Observability/PriorityTelemetryQueueTests.cs
T
2026-10-23 18:46:50 +02:00

138 lines
4.8 KiB
C#

using Omika.Core.Configuration;
using Omika.Core.Observability;
namespace Omika.Tests.Observability;
public class PriorityTelemetryQueueTests
{
private static (PriorityTelemetryQueue Queue, TelemetryCounters Counters) CreateQueue(
int p0 = 2, int p1 = 2, int p2 = 2, int p3 = 2, int p4 = 2)
{
var options = new ObservabilityOptions
{
P0QueueCapacity = p0,
P1QueueCapacity = p1,
P2QueueCapacity = p2,
P3QueueCapacity = p3,
P4QueueCapacity = p4
};
var counters = new TelemetryCounters();
return (new PriorityTelemetryQueue(options, counters), counters);
}
private static TelemetryEvent Event(TelemetryPriority priority) =>
new() { EventCode = TelemetryEventCodes.MobileAppStarted, Priority = priority };
[Fact]
public void Enqueue_ThenCount_Increments()
{
var (queue, _) = CreateQueue();
queue.TryEnqueue(Event(TelemetryPriority.P3));
Assert.Equal(1, queue.Count);
}
[Fact]
public void EachPriority_UsesItsOwnQueue()
{
var (queue, _) = CreateQueue();
queue.TryEnqueue(Event(TelemetryPriority.P0));
queue.TryEnqueue(Event(TelemetryPriority.P1));
queue.TryEnqueue(Event(TelemetryPriority.P2));
queue.TryEnqueue(Event(TelemetryPriority.P3));
queue.TryEnqueue(Event(TelemetryPriority.P4));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P0));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P1));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P2));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P3));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P4));
}
[Fact]
public void P4Full_NewP3_IsAccepted()
{
var (queue, counters) = CreateQueue(p4: 1);
Assert.True(queue.TryEnqueue(Event(TelemetryPriority.P4)));
// File P4 pleine : le P3 part dans sa propre file, indépendante.
Assert.True(queue.TryEnqueue(Event(TelemetryPriority.P3)));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P4));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P3));
Assert.Equal(0L, counters.DroppedQueueFull);
}
[Fact]
public void P1Full_NewP0_IsAccepted_P1Unchanged()
{
var (queue, counters) = CreateQueue(p1: 2, p0: 2);
Assert.True(queue.TryEnqueue(Event(TelemetryPriority.P1)));
Assert.True(queue.TryEnqueue(Event(TelemetryPriority.P1)));
// File P1 saturée : le P0 est accepté dans sa propre file, P1 inchangé.
Assert.True(queue.TryEnqueue(Event(TelemetryPriority.P0)));
Assert.Equal(2, queue.GetQueueCount(TelemetryPriorityQueues.P1));
Assert.Equal(1, queue.GetQueueCount(TelemetryPriorityQueues.P0));
Assert.Equal(0L, counters.DroppedQueueFull);
}
[Fact]
public void P0Full_NewP0_IsDropped_Immediately_WithCounter()
{
var (queue, counters) = CreateQueue(p0: 1);
Assert.True(queue.TryEnqueue(Event(TelemetryPriority.P0)));
// Retourne immédiatement (aucun blocage), événement abandonné, compteur P0 incrémenté.
Assert.False(queue.TryEnqueue(Event(TelemetryPriority.P0)));
Assert.Equal(1L, counters.DroppedQueueFull);
Assert.Equal(1L, counters.DroppedP0);
Assert.Equal(1L, counters.GetPriorityDropCount(TelemetryPriorityQueues.P0));
Assert.Equal(0L, counters.DroppedP1);
Assert.Equal(1, queue.Count);
}
[Fact]
public void TryRead_DrainsInPriorityOrder()
{
var (queue, _) = CreateQueue();
queue.TryEnqueue(Event(TelemetryPriority.P0));
queue.TryEnqueue(Event(TelemetryPriority.P4));
Assert.True(queue.TryRead(TelemetryPriorityQueues.P0, out OmikaEvent critical));
Assert.True(queue.TryRead(TelemetryPriorityQueues.P4, out OmikaEvent analytics));
Assert.Equal(TelemetryPriority.P0, critical.EffectivePriority);
Assert.Equal(TelemetryPriority.P4, analytics.EffectivePriority);
Assert.Equal(0, queue.Count);
}
[Fact]
public void InvalidCapacity_DoesNotThrow_AndIsClamped()
{
var (queue, _) = CreateQueue(p0: -5, p1: 0);
Assert.Equal(1, queue.CapacityP0);
Assert.Equal(1, queue.CapacityP1);
Assert.Equal(1 + 1 + 2 + 2 + 2, queue.TotalCapacity);
}
[Fact]
public void TotalCapacity_IsSumOfFiveQueues()
{
var (queue, _) = CreateQueue(p0: 1, p1: 2, p2: 3, p3: 4, p4: 5);
Assert.Equal(15, queue.TotalCapacity);
Assert.Equal(1, queue.CapacityP0);
Assert.Equal(2, queue.CapacityP1);
Assert.Equal(3, queue.CapacityP2);
Assert.Equal(4, queue.CapacityP3);
Assert.Equal(5, queue.CapacityP4);
}
}