File: CommandFactoryTests\GivenAProjectDependencyCommandResolver.cs
Web Access
Project: ..\..\..\test\dotnet.Tests\dotnet.Tests.csproj (dotnet.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
using Microsoft.DotNet.Cli.Utils;
 
namespace Microsoft.DotNet.Tests
{
    public class GivenAProjectDependencyCommandResolver : SdkTest
    {
        private string _configuration;
 
        public GivenAProjectDependencyCommandResolver(ITestOutputHelper log) : base(log)
        {
            Environment.SetEnvironmentVariable(
                Constants.MSBUILD_EXE_PATH,
                Path.Combine(TestContext.Current.ToolsetUnderTest.SdkFolderUnderTest, "MSBuild.dll"));
 
            _configuration = Environment.GetEnvironmentVariable("CONFIGURATION") ?? "Debug";
        }
 
        [Fact]
        public void ItReturnsACommandSpecWhenToolIsInAProjectRef()
        {
            var testAsset =
                _testAssetsManager.CopyTestAsset("TestAppWithProjDepTool")
                    .WithSource();
 
            NuGetConfigWriter.Write(testAsset.Path, TestContext.Current.TestPackages);
 
            new DotnetBuildCommand(Log)
                .WithWorkingDirectory(testAsset.Path)
                .Execute("--configuration", _configuration)
                .Should().Pass();
 
            var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
 
            var commandResolverArguments = new CommandResolverArguments()
            {
                CommandName = "dotnet-portable",
                Configuration = _configuration,
                ProjectDirectory = testAsset.Path,
                Framework = NuGet.Frameworks.NuGetFramework.Parse(ToolsetInfo.CurrentTargetFramework)
            };
 
            var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
 
            result.Should().NotBeNull();
 
            var commandFile = Path.GetFileNameWithoutExtension(result.Path);
 
            commandFile.Should().Be("dotnet");
 
            result.Args.Should().Contain(commandResolverArguments.CommandName);
        }
 
        [Fact]
        public void ItPassesDepsfileArgToHostWhenReturningACommandSpecForMSBuildProject()
        {
            var testAsset =
                _testAssetsManager.CopyTestAsset("TestAppWithProjDepTool")
                    .WithSource();
 
            NuGetConfigWriter.Write(testAsset.Path, TestContext.Current.TestPackages);
 
            new DotnetBuildCommand(Log)
                .WithWorkingDirectory(testAsset.Path)
                .Execute("--configuration", _configuration)
                .Should().Pass();
 
            var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
 
            var commandResolverArguments = new CommandResolverArguments()
            {
                CommandName = "dotnet-portable",
                Configuration = _configuration,
                ProjectDirectory = testAsset.Path,
                Framework = NuGet.Frameworks.NuGetFramework.Parse(ToolsetInfo.CurrentTargetFramework)
            };
 
            var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
 
            result.Should().NotBeNull();
 
            result.Args.Should().Contain("--depsfile");
        }
 
        [Fact]
        public void ItReturnsNullWhenCommandNameDoesNotExistInProjectDependenciesForMSBuildProject()
        {
            var testAsset =
                _testAssetsManager.CopyTestAsset("TestAppWithProjDepTool")
                    .WithSource();
 
            NuGetConfigWriter.Write(testAsset.Path, TestContext.Current.TestPackages);
 
            new RestoreCommand(testAsset)
                .Execute()
                .Should()
                .Pass();
 
            var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
 
            var commandResolverArguments = new CommandResolverArguments()
            {
                CommandName = "nonexistent-command",
                CommandArguments = null,
                ProjectDirectory = testAsset.Path,
                Framework = NuGet.Frameworks.NuGetFramework.Parse(ToolsetInfo.CurrentTargetFramework)
            };
 
            var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
 
            result.Should().BeNull();
        }
 
        [Fact]
        public void ItSetsDepsfileToOutputInCommandspecForMSBuild()
        {
            var testAsset =
                _testAssetsManager.CopyTestAsset("TestAppWithProjDepTool")
                    .WithSource();
 
            NuGetConfigWriter.Write(testAsset.Path, TestContext.Current.TestPackages);
 
            new RestoreCommand(testAsset)
                .Execute()
                .Should()
                .Pass();
 
            var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
 
            var outputDir = Path.Combine(testAsset.Path, "out");
 
            var commandResolverArguments = new CommandResolverArguments()
            {
                CommandName = "dotnet-portable",
                Configuration = "Debug",
                ProjectDirectory = testAsset.Path,
                Framework = NuGet.Frameworks.NuGetFramework.Parse(ToolsetInfo.CurrentTargetFramework),
                OutputPath = outputDir
            };
 
            new DotnetBuildCommand(Log)
                .WithWorkingDirectory(testAsset.Path)
                .Execute($"-o", outputDir)
                .Should()
                .Pass();
 
            var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
 
            var depsFilePath = Path.Combine(outputDir, "TestAppWithProjDepTool.deps.json");
 
            result.Should().NotBeNull();
            result.Args.Should().Contain($"--depsfile {depsFilePath}");
        }
 
        private ProjectDependenciesCommandResolver SetupProjectDependenciesCommandResolver(
            IEnvironmentProvider environment = null,
            IPackagedCommandSpecFactory packagedCommandSpecFactory = null)
        {
            Environment.SetEnvironmentVariable(
                Constants.MSBUILD_EXE_PATH,
                Path.Combine(TestContext.Current.ToolsetUnderTest.SdkFolderUnderTest, "MSBuild.dll"));
 
            environment = environment ?? new EnvironmentProvider();
 
            packagedCommandSpecFactory = packagedCommandSpecFactory ?? new PackagedCommandSpecFactory();
 
            var projectDependenciesCommandResolver = new ProjectDependenciesCommandResolver(environment, packagedCommandSpecFactory);
 
            return projectDependenciesCommandResolver;
        }
    }
}