78 lines
2.0 KiB
C#
78 lines
2.0 KiB
C#
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);
|
|
}
|
|
}
|