File: DotnetProjectBuildEnvironmentTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Dotnet.Tests\Aspire.Hosting.Dotnet.Tests.csproj (Aspire.Hosting.Dotnet.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.Logging.Abstractions;
 
namespace Aspire.Hosting.Dotnet.Tests;
 
public class DotnetProjectBuildEnvironmentTests
{
    [Fact]
    public async Task ResponseFileProtectsAndEscapesBuildEnvironmentValues()
    {
        const string environmentValue = "custom\u2003\"flavor\";\r\nvalue%";
        var responseFile = Assert.IsType<MsBuildResponseFile>(
            await DotnetProjectBuildEnvironment.CreateResponseFileAsync(
                new Dictionary<string, string>
                {
                    ["BUILD_FLAVOR"] = environmentValue,
                    ["BUILD\nINJECTED"] = "safe",
                },
                NullLogger.Instance,
                TestContext.Current.CancellationToken));
        var responseFilePath = responseFile.FilePath;
        var responseFileDirectory = Path.GetDirectoryName(responseFilePath)!;
 
        try
        {
            Assert.Equal($"@{responseFilePath}", responseFile.Argument);
            Assert.Equal(
                $"\"--property:BUILD_FLAVOR=custom\u2003%22flavor%22%3B%0D%0Avalue%25\"{Environment.NewLine}" +
                $"\"--property:BUILD%0AINJECTED=safe\"{Environment.NewLine}",
                await File.ReadAllTextAsync(responseFilePath, TestContext.Current.CancellationToken));
 
            if (!OperatingSystem.IsWindows())
            {
                Assert.Equal(
                    UnixFileMode.UserRead | UnixFileMode.UserWrite,
                    File.GetUnixFileMode(responseFilePath));
                Assert.Equal(
                    UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute,
                    File.GetUnixFileMode(responseFileDirectory));
            }
        }
        finally
        {
            responseFile.Dispose();
        }
 
        Assert.False(Directory.Exists(responseFileDirectory));
        responseFile.Dispose();
    }
 
    [Fact]
    public async Task EmptyBuildEnvironmentDoesNotCreateResponseFile()
    {
        var responseFile = await DotnetProjectBuildEnvironment.CreateResponseFileAsync(
            new Dictionary<string, string>(),
            NullLogger.Instance,
            TestContext.Current.CancellationToken);
 
        Assert.Null(responseFile);
    }
}