File: DotNet\OwnedProcessExecutionTests.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.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.Globalization;
using Aspire.Cli.DotNet;
using Aspire.Cli.Tests.Utils;
using Aspire.Shared;
using Aspire.Shared.Tests;
using Aspire.TestUtilities;
using Microsoft.Extensions.Logging.Abstractions;
 
namespace Aspire.Cli.Tests.DotNet;
 
[RequiresTools(["dotnet"])]
[Collection(ProcessTestCollection.Name)]
public class OwnedProcessExecutionTests(ProcessTestFixture fixture)
{
    [Theory]
    [InlineData(false, 0)]
    [InlineData(false, 23)]
    [InlineData(true, 0)]
    [InlineData(true, 23)]
    public async Task OwnedHelper_PreservesStatusAndReapsWorkers(bool parentExitOptIn, int exitCode)
    {
        using var readiness = new ProcessTestReadiness();
        var factory = new ProcessExecutionFactory(new TestEnvironment(), NullLogger<ProcessExecutionFactory>.Instance);
        await using var execution = factory.CreateExecution(
            fixture.CreateStartInfo("tree-exit", readiness.Name, exitCode.ToString(CultureInfo.InvariantCulture)),
            new ProcessInvocationOptions
            {
                KillOnParentExit = parentExitOptIn,
                Lifetime = parentExitOptIn ? ChildProcessLifetime.CallerManaged : ChildProcessLifetime.OwnedTree,
                CreateSupervisorStartInfo = fixture.CreateSupervisorStartInfo
            });
        ProcessTestIdentity[] identities = [];
        try
        {
            await execution.StartAsync(TestContext.Current.CancellationToken);
            identities = await readiness.ReadTreeAsync();
 
            Assert.Equal(exitCode, await execution.WaitForExitAsync(TestContext.Current.CancellationToken).WaitAsync(TimeSpan.FromSeconds(30)));
            await Task.WhenAll(identities.Select(ProcessTestFixture.AssertExitedAsync));
        }
        finally
        {
            foreach (var identity in identities)
            {
                ProcessTestFixture.KillIfRunning(identity);
            }
        }
    }
}