Premiere commit - Omika
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user