using Omika.Core.Configuration; using Omika.Core.Observability; namespace Omika.Tests.Observability; /// /// Fabrique de test partagée pour le pipeline d'observabilité. /// internal static class ObservabilityTestHarness { public static (SafeTelemetrySink Sink, PriorityTelemetryQueue Queue, TelemetryCounters Counters) CreatePipeline(ObservabilityOptions? options = null) { ObservabilityOptions opts = options ?? new ObservabilityOptions(); var counters = new TelemetryCounters(); var queue = new PriorityTelemetryQueue(opts, counters); var sink = new SafeTelemetrySink(opts, queue, counters); return (sink, queue, counters); } public static TelemetryEvent NewEvent( EventCode code, TelemetryLevel level = TelemetryLevel.Info, TelemetryPriority? priority = null, TelemetryMetadata? metadata = null) => new() { EventCode = code, Level = level, Priority = priority, Metadata = metadata }; public static DiagnosticEvent NewDiagnostic( EventCode code, TelemetryLevel level = TelemetryLevel.Info, TelemetryPriority? priority = null) => new() { EventCode = code, Level = level, Priority = priority }; public static async Task WaitUntilAsync(Func condition, int timeoutMs = 3000) { DateTimeOffset deadline = DateTimeOffset.UtcNow.AddMilliseconds(timeoutMs); while (!condition() && DateTimeOffset.UtcNow < deadline) { await Task.Delay(10); } Assert.True(condition(), "La condition n'a pas été atteinte dans le délai imparti."); } }