File: NativeServerOptionsTests.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.Server;
 
namespace Aspire.Hosting.Native.Core.Tests;
 
public class NativeServerOptionsTests
{
    [Fact]
    public void SourceGeneratedOptionsApplyExplicitBudgetsAndCapacity()
    {
        var options = JsonSerializer.Deserialize("""
            {"controllerStartupTimeout":"00:03:00","cleanupTimeout":"00:01:30",
             "maximumConcurrentRequests":7,"retainedAppHostLogEntries":13,"backchannelFirstRequestTimeout":"00:00:03",
             "runtime":{"workloadStartupTimeout":"00:05:00","observationInterval":"00:00:01",
                        "retainedResourceLogEntries":5,"maximumPendingRequestsPerResource":3}}
            """, NativeServerJsonContext.Default.NativeServerOptions)!;
        options.Validate();
        Assert.Equal(TimeSpan.FromMinutes(3), options.ControllerStartupTimeout);
        Assert.Equal(TimeSpan.FromSeconds(90), options.CleanupTimeout);
        Assert.Equal(7, options.MaximumConcurrentRequests);
        Assert.Equal(13, options.RetainedAppHostLogEntries);
        Assert.Equal(TimeSpan.FromSeconds(3), options.BackchannelFirstRequestTimeout);
        Assert.Equal(TimeSpan.FromMinutes(5), options.Runtime.WorkloadStartupTimeout);
        Assert.Equal(TimeSpan.FromSeconds(1), options.Runtime.ObservationInterval);
        Assert.Equal(5, options.Runtime.RetainedResourceLogEntries);
        Assert.Equal(3, options.Runtime.MaximumPendingRequestsPerResource);
    }
 
    [Theory]
    [InlineData("""{"maximumConcurrentRequests":0}""")]
    [InlineData("""{"cleanupTimeout":"00:00:00"}""")]
    [InlineData("""{"backchannelFirstRequestTimeout":"00:00:00"}""")]
    [InlineData("""{"runtime":{"observationInterval":"00:05:00"}}""")]
    [InlineData("""{"runtime":{"retainedResourceLogEntries":0}}""")]
    [InlineData("""{"runtime":{"maximumPendingRequestsPerResource":0}}""")]
    public void InvalidPoliciesAreRejected(string json)
    {
        var options = JsonSerializer.Deserialize(json, NativeServerJsonContext.Default.NativeServerOptions)!;
        Assert.Throws<ArgumentException>(options.Validate);
    }
 
    [Fact]
    public void UnknownAndNullConfigurationFailInsteadOfFallingBack()
    {
        Assert.Throws<JsonException>(() => JsonSerializer.Deserialize("""{"cleanupTimout":"00:01:00"}""",
            NativeServerJsonContext.Default.NativeServerOptions));
        Assert.Throws<JsonException>(() => JsonSerializer.Deserialize("""{"runtime":null}""",
            NativeServerJsonContext.Default.NativeServerOptions));
    }
}