using Omika.Core.Observability.Diagnostic; namespace Omika.Tests.Observability.Diagnostic; public class TraceContextTests { [Fact] public void BeginTrace_SetsCurrentTraceId_AndDisposeRestores() { var context = new TraceContext(); Assert.Null(context.CurrentTraceId); using (context.BeginTrace()) { Assert.NotNull(context.CurrentTraceId); Assert.NotEqual(Guid.Empty, context.CurrentTraceId!.Value); } Assert.Null(context.CurrentTraceId); } [Fact] public void NestedScope_RestoresPreviousTrace() { var context = new TraceContext(); Guid outer = Guid.Parse("11111111-1111-1111-1111-111111111111"); Guid inner = Guid.Parse("22222222-2222-2222-2222-222222222222"); using (context.BeginTrace(outer)) { using (context.BeginTrace(inner)) { Assert.Equal(inner, context.CurrentTraceId); } Assert.Equal(outer, context.CurrentTraceId); } Assert.Null(context.CurrentTraceId); } [Fact] public async Task AsyncFlow_PreservesTraceAcrossAwait() { var context = new TraceContext(); Guid trace = Guid.NewGuid(); using (context.BeginTrace(trace)) { await Task.Delay(20); Assert.Equal(trace, context.CurrentTraceId); } Assert.Null(context.CurrentTraceId); } [Fact] public async Task AsyncParallel_NoTraceIdLeak() { var context = new TraceContext(); Guid first = Guid.NewGuid(); Guid second = Guid.NewGuid(); async Task RunAsync(Guid traceId) { using (context.BeginTrace(traceId)) { await Task.Delay(30); Assert.Equal(traceId, context.CurrentTraceId); } } await Task.WhenAll(RunAsync(first), RunAsync(second)); Assert.Null(context.CurrentTraceId); } }