File: DcpJsonTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Native.Core.Tests\Aspire.Hosting.Native.Core.Tests.csproj (Aspire.Hosting.Native.Core.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using Aspire.Hosting.Native.Dcp;
using Aspire.Hosting.Native.Runtime;
using Aspire.Hosting.Native.Core.Tests.TestServices;
 
namespace Aspire.Hosting.Native.Core.Tests;
 
public class DcpJsonTests
{
    [Fact]
    public async Task GenericContainerSupportsMultipleEndpointsEntrypointAndMounts()
    {
        var spec = new DcpWorkloadSpec
        {
            Image = "example/service:1", Command = "/bin/worker", Env = [],
            Args = ["--serve"],
            Ports = [new DcpContainerPort(8080, "127.0.0.1", WorkloadProtocol.Tcp),
                new DcpContainerPort(8443, "127.0.0.1", WorkloadProtocol.Tcp) { HostPort = 5001 }],
            VolumeMounts = [new DcpVolumeMount(WorkloadMountKind.Volume, "retained-data", "/data", false),
                new DcpVolumeMount(WorkloadMountKind.Bind, "/host/config", "/config", true)]
        };
        await Verify(JsonSerializer.Serialize(spec, DcpJsonContext.Default.DcpWorkloadSpec), "json")
            .UseDirectory("Snapshots");
    }
    [Fact]
    public async Task TypedWorkloadEnvelopePreservesTheDcpWireContract()
    {
        var spec = new DcpWorkloadSpec
        {
            Image = "example/worker:1", Env = [new DcpEnvironment("CUSTOM", "configured")],
            Args = ["--work"], Ports = [new DcpContainerPort(4567, "127.0.0.1", WorkloadProtocol.Tcp)]
        };
        using var handler = new DcpCleanupTestHandler();
        await using var client = handler.CreateClient(new());
        await client.CreateAsync(DcpResourceCollection.Containers, "test-worker",
            JsonSerializer.SerializeToElement(spec, DcpJsonContext.Default.DcpWorkloadSpec), null,
            TestContext.Current.CancellationToken);
        var content = Assert.Single(handler.RequestContents);
        Assert.Equal("application/json", content.ContentType);
        await Verify(content.Body, "json")
            .UseDirectory("Snapshots");
    }
 
    [Fact]
    public void TypedStatusAcceptsAdditionalKubernetesFieldsWithoutInventingExitCodesOrPorts()
    {
        var resource = JsonSerializer.Deserialize("""
            {"apiVersion":"usvc-dev.developer.microsoft.com/v1","kind":"Executable",
             "metadata":{"name":"arbitrary-worker"},"status":{"state":"Exited","futureField":true}}
            """, DcpJsonContext.Default.DcpResource)!;
        Assert.Equal(DcpProcessState.Exited, resource.Status!.State);
        Assert.Null(resource.Status.ExitCode);
        Assert.Null(resource.Status.EffectivePort);
        Assert.Null(resource.Status.Pid);
    }
}