File: NuGet\NuGetSignatureVerificationEnablerTests.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 Aspire.Cli.NuGet;
using Aspire.Cli.Tests.TestServices;
using Aspire.Cli.Tests.Utils;
using Microsoft.DotNet.RemoteExecutor;
 
namespace Aspire.Cli.Tests.NuGet;
 
public class NuGetSignatureVerificationEnablerTests
{
    private static IEnvironment CreateEnvironment(Dictionary<string, string?>? envVars = null)
    {
        return new TestEnvironment(envVars);
    }
 
    [Fact]
    public void Apply_FeatureFlagDisabled_DoesNotSetEnvVar()
    {
        var envVars = new Dictionary<string, string>();
        var features = new TestFeatures().SetFeature(KnownFeatures.NuGetSignatureVerificationEnabled, false);
        var environment = CreateEnvironment();
 
        NuGetSignatureVerificationEnabler.Apply(envVars, features, environment);
 
        Assert.Empty(envVars);
    }
 
    [Fact]
    public void Apply_FeatureEnabled_NoUserOverride_SetsTrueOnLinux()
    {
        if (!OperatingSystem.IsLinux())
        {
            return;
        }
 
        var envVars = new Dictionary<string, string>();
        var features = new TestFeatures(); // default is true for this feature
        var environment = CreateEnvironment(new Dictionary<string, string?>()); // empty env — no user override
 
        NuGetSignatureVerificationEnabler.Apply(envVars, features, environment);
 
        Assert.True(envVars.ContainsKey(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        Assert.Equal("True", envVars[NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification]);
    }
 
    [Fact]
    public void Apply_FeatureEnabled_UserOverrideFalse_PropagatesFalseOnLinux()
    {
        if (!OperatingSystem.IsLinux())
        {
            return;
        }
 
        var envVars = new Dictionary<string, string>();
        var features = new TestFeatures();
        var environment = CreateEnvironment(new Dictionary<string, string?>
        {
            [NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification] = "false"
        });
 
        NuGetSignatureVerificationEnabler.Apply(envVars, features, environment);
 
        Assert.True(envVars.ContainsKey(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        Assert.Equal("False", envVars[NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification]);
    }
 
    [Fact]
    public void Apply_FeatureEnabled_UserOverrideTrue_SetsTrueOnLinux()
    {
        if (!OperatingSystem.IsLinux())
        {
            return;
        }
 
        var envVars = new Dictionary<string, string>();
        var features = new TestFeatures();
        var environment = CreateEnvironment(new Dictionary<string, string?>
        {
            [NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification] = "true"
        });
 
        NuGetSignatureVerificationEnabler.Apply(envVars, features, environment);
 
        Assert.True(envVars.ContainsKey(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        Assert.Equal("True", envVars[NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification]);
    }
 
    [Fact]
    public void Apply_NonLinux_DoesNotSetEnvVar()
    {
        if (OperatingSystem.IsLinux())
        {
            return;
        }
 
        var envVars = new Dictionary<string, string>();
        var features = new TestFeatures(); // default is true
        var environment = CreateEnvironment();
 
        NuGetSignatureVerificationEnabler.Apply(envVars, features, environment);
 
        Assert.Empty(envVars);
    }
 
    // The ApplyToCurrentProcess tests change the real process environment and a process-wide scope count, so each
    // one runs in its own process. The variable is also set inside the child, because passing it through the child's
    // start info alone was not reliable when other test classes ran alongside.
 
    [Fact]
    public void ApplyToCurrentProcess_RestoresUnsetValueWhenScopeEnds()
    {
        RemoteExecutor.Invoke(static () =>
        {
            Environment.SetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification, null);
 
            using (NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(new TestFeatures(), TestEnvironment.CreateLinux()))
            {
                Assert.Equal("True", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
            }
 
            Assert.Null(Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        }).Dispose();
    }
 
    [Fact]
    public void ApplyToCurrentProcess_PreservesExplicitFalse()
    {
        RemoteExecutor.Invoke(static () =>
        {
            Environment.SetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification, "false");
            var environment = TestEnvironment.CreateLinux(new Dictionary<string, string?>
            {
                [NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification] = "false"
            });
 
            using (NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(new TestFeatures(), environment))
            {
                Assert.Equal("False", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
            }
 
            // The user's original spelling comes back, not the normalized value applied during the scope.
            Assert.Equal("false", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        }).Dispose();
    }
 
    [Fact]
    public void ApplyToCurrentProcess_RestoresPreviousValueWhenScopeEnds()
    {
        RemoteExecutor.Invoke(static () =>
        {
            Environment.SetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification, "not-a-bool");
            var environment = TestEnvironment.CreateLinux(new Dictionary<string, string?>
            {
                [NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification] = "not-a-bool"
            });
 
            using (NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(new TestFeatures(), environment))
            {
                Assert.Equal("True", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
            }
 
            Assert.Equal("not-a-bool", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        }).Dispose();
    }
 
    [Fact]
    public void ApplyToCurrentProcess_KeepsValueUntilLastOverlappingScopeEnds()
    {
        RemoteExecutor.Invoke(static () =>
        {
            Environment.SetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification, null);
            var features = new TestFeatures();
            var environment = TestEnvironment.CreateLinux();
 
            var first = NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(features, environment);
            var second = NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(features, environment);
 
            first.Dispose();
            Assert.Equal("True", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
 
            second.Dispose();
            Assert.Null(Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        }).Dispose();
    }
 
    [Fact]
    public void ApplyToCurrentProcess_IgnoresRepeatedDisposal()
    {
        RemoteExecutor.Invoke(static () =>
        {
            Environment.SetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification, null);
            var features = new TestFeatures();
            var environment = TestEnvironment.CreateLinux();
 
            var first = NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(features, environment);
            var second = NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(features, environment);
 
            // Disposing one scope twice must not end the other scope early.
            first.Dispose();
            first.Dispose();
            Assert.Equal("True", Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
 
            second.Dispose();
            Assert.Null(Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        }).Dispose();
    }
 
    [Fact]
    public void ApplyToCurrentProcess_FeatureDisabled_LeavesEnvironmentUnchanged()
    {
        RemoteExecutor.Invoke(static () =>
        {
            Environment.SetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification, null);
            var features = new TestFeatures().SetFeature(KnownFeatures.NuGetSignatureVerificationEnabled, false);
 
            using (NuGetSignatureVerificationEnabler.ApplyToCurrentProcess(features, TestEnvironment.CreateLinux()))
            {
                Assert.Null(Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
            }
 
            Assert.Null(Environment.GetEnvironmentVariable(NuGetSignatureVerificationEnabler.DotNetNuGetSignatureVerification));
        }).Dispose();
    }
}