Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,12 @@ protected override void OnInitialized()
}
}

private ValueTask<GridItemsProviderResult<SpanWaterfallViewModel>> GetData(GridItemsProviderRequest<SpanWaterfallViewModel> request)
// Internal to be used in unit tests
internal ValueTask<GridItemsProviderResult<SpanWaterfallViewModel>> GetData(GridItemsProviderRequest<SpanWaterfallViewModel> request)
{
Debug.Assert(_spanWaterfallViewModels != null);

var visibleViewModels = new HashSet<SpanWaterfallViewModel>();
var visibleViewModels = new SortedSet<SpanWaterfallViewModel>(Comparer<SpanWaterfallViewModel>.Create((a, b) => a.Span.StartTime.CompareTo(b.Span.StartTime)));
foreach (var viewModel in _spanWaterfallViewModels)
{
if (!viewModel.IsHidden && viewModel.MatchesFilter(_filter, GetResourceName, out var matchedDescendents))
Expand Down
56 changes: 56 additions & 0 deletions tests/Aspire.Dashboard.Components.Tests/Pages/TraceDetailsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,62 @@ public async Task Render_ChangeTrace_RowsRendered()
await AsyncTestHelpers.AssertIsTrueRetryAsync(() => rows.Count == 2, "Expected rows to be rendered.");
}

[Fact]
public async Task Render_SpansOrderedByStartTime_RowsRenderedInCorrectOrder()
{
// Arrange
SetupTraceDetailsServices();

var viewport = new ViewportInformation(IsDesktop: true, IsUltraLowHeight: false, IsUltraLowWidth: false);

var dimensionManager = Services.GetRequiredService<DimensionManager>();
dimensionManager.InvokeOnViewportInformationChanged(viewport);

var telemetryRepository = Services.GetRequiredService<TelemetryRepository>();
telemetryRepository.AddTraces(new AddContext(),
new RepeatedField<ResourceSpans>
{
new ResourceSpans
{
Resource = CreateResource(),
ScopeSpans =
{
new ScopeSpans
{
Scope = CreateScope(),
Spans =
{
CreateSpan(traceId: "1", spanId: "1-1",
startTime: s_testTime.AddMinutes(1),
endTime: s_testTime.AddMinutes(10)),
CreateSpan(traceId: "1", spanId: "1-2",
startTime: s_testTime.AddMinutes(5),
endTime: s_testTime.AddMinutes(10), parentSpanId: "1-1"),
CreateSpan(traceId: "1", spanId: "1-3",
startTime: s_testTime.AddMinutes(2),
endTime: s_testTime.AddMinutes(6), parentSpanId: "1-1")
}
}
}
}
});

// Act
var traceId = Convert.ToHexString(Encoding.UTF8.GetBytes("1"));
var cut = RenderComponent<TraceDetail>(builder =>
{
builder.Add(p => p.TraceId, traceId);
builder.AddCascadingValue(viewport);
});

var data = await cut.Instance.GetData(new GridItemsProviderRequest<SpanWaterfallViewModel>());

Assert.Collection(data.Items,
item => Assert.Equal("Test span. Id: 1-1", item.Span.Name),
item => Assert.Equal("Test span. Id: 1-3", item.Span.Name),
item => Assert.Equal("Test span. Id: 1-2", item.Span.Name));
}

private void SetupTraceDetailsServices()
{
var version = typeof(FluentMain).Assembly.GetName().Version!;
Expand Down
Loading