138 lines
4.8 KiB
C#
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);
|
|
}
|
|
}
|