File: CommandTests\Tool\Run\ToolRunCommandTests.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.
 
using Microsoft.DotNet.Cli;
using Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
using Microsoft.DotNet.Cli.Commands.Tool.Run;
using Microsoft.DotNet.Cli.ToolManifest;
using Microsoft.DotNet.Cli.ToolPackage;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.Extensions.EnvironmentAbstractions;
using NuGet.Frameworks;
using NuGet.Versioning;
 
namespace Microsoft.DotNet.Tests.Commands.Tool
{
    public class ToolRunCommandTests: SdkTest
    {
        private const string ManifestFilename = "dotnet-tools.json";
        private DirectoryPath _nugetGlobalPackagesFolder;
 
        public ToolRunCommandTests(ITestOutputHelper log) : base(log)
        {
            _nugetGlobalPackagesFolder = new DirectoryPath(NuGetGlobalPackagesFolder.GetLocation());
        }
 
        [Fact]
        public void WhenRunWithRollForwardOptionItShouldIncludeRollForwardInNativeHost()
        {
            var parseResult = Parser.Parse($"dotnet tool run dotnet-a --allow-roll-forward");
 
            var toolRunCommand = new ToolRunCommand(parseResult);
 
            (FilePath fakeExecutable, LocalToolsCommandResolver localToolsCommandResolver) = DefaultSetup("a");
            IEnumerable<string> testForwardArgument = Enumerable.Empty<string>();
 
            var result = localToolsCommandResolver.ResolveStrict(new CommandResolverArguments()
            {
                CommandName = "dotnet-a",
                CommandArguments = testForwardArgument
            }, toolRunCommand._allowRollForward);
 
            result.Should().NotBeNull();
            result.Args.Should().ContainAll("--roll-forward", "Major", fakeExecutable.Value);
        }
 
        [Fact]
        public void WhenRunWithoutRollForwardOptionItShouldNotIncludeRollForwardInNativeHost()
        {
            var parseResult = Parser.Parse($"dotnet tool run dotnet-a");
 
            var toolRunCommand = new ToolRunCommand(parseResult);
 
            (FilePath fakeExecutable, LocalToolsCommandResolver localToolsCommandResolver) = DefaultSetup("a");
            IEnumerable<string> testForwardArgument = Enumerable.Empty<string>();
 
            var result = localToolsCommandResolver.ResolveStrict(new CommandResolverArguments()
            {
                CommandName = "dotnet-a",
                CommandArguments = testForwardArgument
            }, toolRunCommand._allowRollForward);
 
            result.Should().NotBeNull();
            result.Args.Should().Contain(fakeExecutable.Value);
            result.Args.Should().NotContain("--roll-forward", "Major");
        }
 
        private (FilePath, LocalToolsCommandResolver) DefaultSetup(string toolCommand)
        {
            var testDirectoryRoot = _testAssetsManager.CreateTestDirectory();
            var fileSystem = new FileSystemWrapper();
            NuGetVersion packageVersionA = NuGetVersion.Parse("1.0.4");
 
            fileSystem.File.WriteAllText(Path.Combine(testDirectoryRoot.Path, ManifestFilename),
                _jsonContent.Replace("$TOOLCOMMAND$", toolCommand));
            ToolManifestFinder toolManifest =
                new ToolManifestFinder(new DirectoryPath(testDirectoryRoot.Path), fileSystem, new FakeDangerousFileDetector());
            ToolCommandName toolCommandNameA = new ToolCommandName(toolCommand);
            FilePath fakeExecutable = _nugetGlobalPackagesFolder.WithFile("fakeExecutable.dll");
 
            fileSystem.Directory.CreateDirectory(_nugetGlobalPackagesFolder.Value);
            fileSystem.File.CreateEmptyFile(fakeExecutable.Value);
 
            string temporaryDirectory = fileSystem.Directory.CreateTemporaryDirectory().DirectoryPath;
            var localToolsResolverCache = new LocalToolsResolverCache(
                fileSystem,
                new DirectoryPath(Path.Combine(temporaryDirectory, "cache")));
 
            localToolsResolverCache.Save(
                new Dictionary<RestoredCommandIdentifier, ToolCommand>
                {
                    [new RestoredCommandIdentifier(
                            new PackageId("local.tool.console.a"),
                            packageVersionA,
                            NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                            Constants.AnyRid,
                            toolCommandNameA)]
                        = new ToolCommand(toolCommandNameA, "dotnet", fakeExecutable)
                });
 
            var localToolsCommandResolver = new LocalToolsCommandResolver(
                toolManifest,
                localToolsResolverCache,
                fileSystem);
 
            return (fakeExecutable, localToolsCommandResolver);
        }
 
        private string _jsonContent =
            @"{
   ""version"":1,
   ""isRoot"":true,
   ""tools"":{
      ""local.tool.console.a"":{
         ""version"":""1.0.4"",
         ""commands"":[
            ""$TOOLCOMMAND$""
         ]
      }
   }
}";
 
    }
}