File: TelemetryRepositoryTests\ResourceTests.cs
Web Access
Project: src\tests\Aspire.Dashboard.Tests\Aspire.Dashboard.Tests.csproj (Aspire.Dashboard.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Dashboard.Otlp.Model;
using Aspire.Dashboard.Otlp.Storage;
using Google.Protobuf.Collections;
using OpenTelemetry.Proto.Trace.V1;
using Xunit;
using static Aspire.Tests.Shared.Telemetry.TelemetryTestHelpers;
 
namespace Aspire.Dashboard.Tests.TelemetryRepositoryTests;
 
public class ResourceTests
{
    [Fact]
    public void GetResourceByCompositeName()
    {
        // Arrange
        var repository = CreateRepository();
 
        AddResource(repository, "app2");
        AddResource(repository, "app1");
 
        // Act 1
        var resources = repository.GetResources();
 
        // Assert 1
        Assert.Collection(resources,
            app =>
            {
                Assert.Equal("app1", app.ResourceName);
                Assert.Equal("TestId", app.InstanceId);
            },
            app =>
            {
                Assert.Equal("app2", app.ResourceName);
                Assert.Equal("TestId", app.InstanceId);
            });
 
        // Act 2
        var app1 = repository.GetResourceByCompositeName("app1-TestId");
        var app2 = repository.GetResourceByCompositeName("APP2-TESTID");
        var notFound = repository.GetResourceByCompositeName("APP2_TESTID");
 
        // Assert 2
        Assert.NotNull(app1);
        Assert.Equal("app1", app1.ResourceName);
        Assert.Equal(resources[0], app1);
 
        Assert.NotNull(app2);
        Assert.Equal("app2", app2.ResourceName);
        Assert.Equal(resources[1], app2);
 
        Assert.Null(notFound);
    }
 
    [Fact]
    public void GetResources_WithNameAndNoKey()
    {
        // Arrange
        var repository = CreateRepository();
 
        AddResource(repository, "app2");
        AddResource(repository, "app1", instanceId: "123");
        AddResource(repository, "app1", instanceId: "456");
 
        // Act 1
        var resources1 = repository.GetResources(new ResourceKey("app1", InstanceId: null));
 
        // Assert 1
        Assert.Collection(resources1,
            app =>
            {
                Assert.Equal("app1", app.ResourceName);
                Assert.Equal("123", app.InstanceId);
            },
            app =>
            {
                Assert.Equal("app1", app.ResourceName);
                Assert.Equal("456", app.InstanceId);
            });
 
        // Act 2
        var resources2 = repository.GetResources(new ResourceKey("app2", InstanceId: null));
 
        // Assert 2
        Assert.Collection(resources2,
            app =>
            {
                Assert.Equal("app2", app.ResourceName);
                Assert.Equal("TestId", app.InstanceId);
            });
    }
 
    [Fact]
    public void GetResources_Order()
    {
        // Arrange
        var repository = CreateRepository();
 
        AddResource(repository, "app2");
        AddResource(repository, "app1", instanceId: "def");
        AddResource(repository, "app1", instanceId: "abc");
 
        // Act
        var resources = repository.GetResources();
 
        // Assert
        Assert.Collection(resources,
            app =>
            {
                Assert.Equal("app1", app.ResourceName);
                Assert.Equal("abc", app.InstanceId);
            },
            app =>
            {
                Assert.Equal("app1", app.ResourceName);
                Assert.Equal("def", app.InstanceId);
            },
            app =>
            {
                Assert.Equal("app2", app.ResourceName);
                Assert.Equal("TestId", app.InstanceId);
            });
    }
 
    [Fact]
    public void GetResourceName_GuidInstanceId_Shorten()
    {
        // Arrange
        var repository = CreateRepository();
        var guid1 = "19572b19-d1c0-4a51-98b4-fcc2658f73d3";
        var guid2 = "f66e2b1e-f420-4a22-a067-8dd2f6fcda86";
 
        AddResource(repository, "app1", guid1);
        AddResource(repository, "app1", guid2);
 
        // Act
        var resources = repository.GetResources();
 
        var instance1Name = OtlpResource.GetResourceName(resources[0], resources);
        var instance2Name = OtlpResource.GetResourceName(resources[1], resources);
 
        // Assert
        Assert.Equal("app1-19572b19", instance1Name);
        Assert.Equal("app1-f66e2b1e", instance2Name);
    }
 
    private static void AddResource(TelemetryRepository repository, string name, string? instanceId = null)
    {
        var addContext = new AddContext();
        repository.AddTraces(addContext, new RepeatedField<ResourceSpans>()
        {
            new ResourceSpans
            {
                Resource = CreateResource(name: name, instanceId: instanceId)
            }
        });
 
        Assert.Equal(0, addContext.FailureCount);
    }
}