File: DcpConnectionMaterialTests.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.Diagnostics;
using Aspire.Shared;
using Aspire.Hosting.Native.Core.Tests.TestServices;
using Microsoft.Extensions.Time.Testing;
 
namespace Aspire.Hosting.Native.Core.Tests;
 
public class DcpConnectionMaterialTests
{
    [Fact]
    public async Task SuccessfulLegacyReadinessPreservesClientTimeoutBeforeAndAfterRequests()
    {
        using var capture = new DiagnosticCapture(true, DcpConnectionMaterial.ActivitySourceName);
        await using var host = await DcpReadyTestHost.StartAsync(TestContext.Current.CancellationToken);
        var timeout = TimeSpan.FromSeconds(10);
        using var material = await DcpConnectionMaterial.WaitAsync(host.KubeconfigPath, () => false,
            timeout, TimeSpan.FromMilliseconds(10), _ => { }, TestContext.Current.CancellationToken);
        Assert.Equal(timeout, material.Client.Timeout);
        var activity = Assert.Single(capture.Activities);
        Assert.Equal("dcp.connection.ready", activity.OperationName);
        Assert.Equal(ActivityStatusCode.Ok, activity.Status);
        Assert.Collection(activity.TagObjects.OrderBy(tag => tag.Key, StringComparer.Ordinal),
            tag => Assert.Equal(new KeyValuePair<string, object?>("dcp.authentication", "bearer"), tag),
            tag => Assert.Equal(new KeyValuePair<string, object?>("dcp.readiness.attempts", 1), tag));
        using var response = await material.Client.GetAsync("/readyz", TestContext.Current.CancellationToken);
        Assert.True(response.IsSuccessStatusCode);
        Assert.Equal(timeout, material.Client.Timeout);
    }
 
    [Fact]
    public async Task SuccessfulProviderReadinessLeavesHttpTimeoutDisabledForNativeRequestBudgets()
    {
        await using var host = await DcpReadyTestHost.StartAsync(TestContext.Current.CancellationToken);
        using var material = await DcpConnectionMaterial.WaitAsync(host.KubeconfigPath, () => false,
            TimeSpan.FromSeconds(10), TimeSpan.FromMilliseconds(10), _ => { }, new FakeTimeProvider(),
            TestContext.Current.CancellationToken);
        Assert.Equal(Timeout.InfiniteTimeSpan, material.Client.Timeout);
        using var response = await material.Client.GetAsync("/readyz", TestContext.Current.CancellationToken);
        Assert.True(response.IsSuccessStatusCode);
    }
 
    [Theory]
    [InlineData("not-base64")]
    [InlineData("YQ==")]
    public async Task NonemptyTruncatedCertificateIsRetriedUntilTheStartupBudgetExpires(string certificate)
    {
        var directory = Directory.CreateTempSubdirectory("dcp-material-test-");
        try
        {
            var path = Path.Combine(directory.FullName, "kubeconfig");
            await File.WriteAllTextAsync(path, $"""
                clusters:
                - cluster:
                    server: https://127.0.0.1:1
                    certificate-authority-data: {certificate}
                users:
                - user:
                    token: token
                """);
            var attempted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
            using var cancellation = new CancellationTokenSource();
            var wait = DcpConnectionMaterial.WaitAsync(path, () => false, TimeSpan.FromSeconds(1),
                TimeSpan.FromMilliseconds(1), _ => attempted.TrySetResult(), cancellation.Token);
            await attempted.Task.WaitAsync(TimeSpan.FromSeconds(10));
            Assert.False(wait.IsCompleted);
            await cancellation.CancelAsync();
            await Assert.ThrowsAnyAsync<OperationCanceledException>(() => wait);
        }
        finally
        {
            directory.Delete(recursive: true);
        }
    }
 
    [Fact]
    public async Task ControllerExitEndsRetriesWithoutAcceptingPartialMaterial()
    {
        using var capture = new DiagnosticCapture(true, DcpConnectionMaterial.ActivitySourceName);
        var directory = Directory.CreateTempSubdirectory("dcp-material-test-");
        try
        {
            await Assert.ThrowsAsync<InvalidOperationException>(() => DcpConnectionMaterial.WaitAsync(
                Path.Combine(directory.FullName, "kubeconfig"), () => true, TimeSpan.FromSeconds(1),
                TimeSpan.FromMilliseconds(1), _ => { }, TestContext.Current.CancellationToken));
            var activity = Assert.Single(capture.Activities);
            Assert.Equal(ActivityStatusCode.Error, activity.Status);
            Assert.Collection(activity.TagObjects.OrderBy(tag => tag.Key, StringComparer.Ordinal),
                tag => Assert.Equal(new KeyValuePair<string, object?>("dcp.readiness.attempts", 1), tag),
                tag => Assert.Equal(new KeyValuePair<string, object?>("error.type", typeof(InvalidOperationException).FullName), tag));
        }
        finally
        {
            directory.Delete(recursive: true);
        }
    }
}