2018-01-24 10:16:27 -08:00
|
|
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.IO;
|
|
|
|
using System.Linq;
|
|
|
|
using FluentAssertions;
|
|
|
|
using Microsoft.DotNet.Cli;
|
|
|
|
using Microsoft.DotNet.Cli.CommandLine;
|
|
|
|
using Microsoft.DotNet.Cli.Utils;
|
|
|
|
using Microsoft.DotNet.ToolPackage;
|
|
|
|
using Microsoft.DotNet.Tools.Install.Tool;
|
|
|
|
using Microsoft.DotNet.Tools.Tests.ComponentMocks;
|
2018-01-17 19:26:52 -08:00
|
|
|
using Microsoft.DotNet.Tools.Test.Utilities;
|
2018-01-24 10:16:27 -08:00
|
|
|
using Microsoft.Extensions.DependencyModel.Tests;
|
|
|
|
using Microsoft.Extensions.EnvironmentAbstractions;
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
using Xunit;
|
|
|
|
using Parser = Microsoft.DotNet.Cli.Parser;
|
|
|
|
using LocalizableStrings = Microsoft.DotNet.Tools.Install.Tool.LocalizableStrings;
|
2018-02-06 13:38:06 -08:00
|
|
|
using System.Runtime.InteropServices;
|
2018-01-24 10:16:27 -08:00
|
|
|
|
|
|
|
namespace Microsoft.DotNet.Tests.InstallToolCommandTests
|
|
|
|
{
|
|
|
|
public class InstallToolCommandTests
|
|
|
|
{
|
|
|
|
private readonly IFileSystem _fileSystemWrapper;
|
|
|
|
private readonly ToolPackageObtainerMock _toolPackageObtainerMock;
|
|
|
|
private readonly ShellShimMakerMock _shellShimMakerMock;
|
|
|
|
private readonly EnvironmentPathInstructionMock _environmentPathInstructionMock;
|
|
|
|
private readonly AppliedOption _appliedCommand;
|
|
|
|
private readonly ParseResult _parseResult;
|
2018-01-17 19:26:52 -08:00
|
|
|
private readonly BufferedReporter _reporter;
|
2018-01-24 10:16:27 -08:00
|
|
|
private const string PathToPlaceShim = "pathToPlace";
|
2018-02-06 13:38:06 -08:00
|
|
|
private const string PathToPlacePackages = PathToPlaceShim + "pkg";
|
|
|
|
private const string PackageId = "global.tool.console.demo";
|
2018-01-24 10:16:27 -08:00
|
|
|
|
|
|
|
public InstallToolCommandTests()
|
|
|
|
{
|
|
|
|
_fileSystemWrapper = new FileSystemMockBuilder().Build();
|
2018-02-06 13:38:06 -08:00
|
|
|
_toolPackageObtainerMock = new ToolPackageObtainerMock(_fileSystemWrapper, toolsPath: PathToPlacePackages);
|
2018-01-24 10:16:27 -08:00
|
|
|
_shellShimMakerMock = new ShellShimMakerMock(PathToPlaceShim, _fileSystemWrapper);
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter = new BufferedReporter();
|
2018-01-24 10:16:27 -08:00
|
|
|
_environmentPathInstructionMock =
|
2018-01-17 19:26:52 -08:00
|
|
|
new EnvironmentPathInstructionMock(_reporter, PathToPlaceShim);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-02-06 13:38:06 -08:00
|
|
|
ParseResult result = Parser.Instance.Parse($"dotnet install tool -g {PackageId}");
|
2018-01-24 10:16:27 -08:00
|
|
|
_appliedCommand = result["dotnet"]["install"]["tool"];
|
|
|
|
var parser = Parser.Instance;
|
2018-02-06 13:38:06 -08:00
|
|
|
_parseResult = parser.ParseFrom("dotnet install", new[] {"tool", PackageId});
|
2018-01-24 10:16:27 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
public void WhenRunWithPackageIdItShouldCreateValidShim()
|
|
|
|
{
|
|
|
|
var installToolCommand = new InstallToolCommand(_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
_toolPackageObtainerMock,
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock);
|
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
installToolCommand.Execute().Should().Be(0);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
|
|
|
// It is hard to simulate shell behavior. Only Assert shim can point to executable dll
|
2018-02-06 13:38:06 -08:00
|
|
|
_fileSystemWrapper.File.Exists(ExpectedCommandPath()).Should().BeTrue();
|
2018-01-24 10:16:27 -08:00
|
|
|
var deserializedFakeShim = JsonConvert.DeserializeObject<ShellShimMakerMock.FakeShim>(
|
2018-02-06 13:38:06 -08:00
|
|
|
_fileSystemWrapper.File.ReadAllText(ExpectedCommandPath()));
|
2018-01-24 10:16:27 -08:00
|
|
|
_fileSystemWrapper.File.Exists(deserializedFakeShim.ExecutablePath).Should().BeTrue();
|
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
public void WhenRunWithPackageIdWithSourceItShouldCreateValidShim()
|
|
|
|
{
|
|
|
|
const string sourcePath = "http://mysouce.com";
|
2018-02-06 13:38:06 -08:00
|
|
|
ParseResult result = Parser.Instance.Parse($"dotnet install tool -g {PackageId} --source {sourcePath}");
|
2018-01-24 10:16:27 -08:00
|
|
|
AppliedOption appliedCommand = result["dotnet"]["install"]["tool"];
|
|
|
|
ParseResult parseResult =
|
2018-02-06 13:38:06 -08:00
|
|
|
Parser.Instance.ParseFrom("dotnet install", new[] { "tool", PackageId, "--source", sourcePath });
|
2018-01-24 10:16:27 -08:00
|
|
|
|
|
|
|
var installToolCommand = new InstallToolCommand(appliedCommand,
|
|
|
|
parseResult,
|
|
|
|
new ToolPackageObtainerMock(_fileSystemWrapper, additionalFeeds: new List<MockFeed>
|
|
|
|
{
|
|
|
|
new MockFeed
|
|
|
|
{
|
|
|
|
Type = MockFeedType.Source,
|
|
|
|
Uri = sourcePath,
|
|
|
|
Packages = new List<MockFeedPackage>
|
|
|
|
{
|
|
|
|
new MockFeedPackage
|
|
|
|
{
|
2018-02-06 13:38:06 -08:00
|
|
|
PackageId = PackageId,
|
2018-01-24 10:16:27 -08:00
|
|
|
Version = "1.0.4"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock);
|
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
installToolCommand.Execute().Should().Be(0);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
|
|
|
// It is hard to simulate shell behavior. Only Assert shim can point to executable dll
|
2018-02-06 13:38:06 -08:00
|
|
|
_fileSystemWrapper.File.Exists(ExpectedCommandPath())
|
|
|
|
.Should().BeTrue();
|
2018-01-24 10:16:27 -08:00
|
|
|
ShellShimMakerMock.FakeShim deserializedFakeShim =
|
|
|
|
JsonConvert.DeserializeObject<ShellShimMakerMock.FakeShim>(
|
2018-02-06 13:38:06 -08:00
|
|
|
_fileSystemWrapper.File.ReadAllText(ExpectedCommandPath()));
|
2018-01-24 10:16:27 -08:00
|
|
|
_fileSystemWrapper.File.Exists(deserializedFakeShim.ExecutablePath).Should().BeTrue();
|
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
public void WhenRunWithPackageIdItShouldShowPathInstruction()
|
|
|
|
{
|
|
|
|
var installToolCommand = new InstallToolCommand(_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
_toolPackageObtainerMock,
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock);
|
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
installToolCommand.Execute().Should().Be(0);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter.Lines.Single().Should().NotBeEmpty();
|
2018-01-24 10:16:27 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
2018-01-17 19:26:52 -08:00
|
|
|
public void GivenFailedPackageObtainWhenRunWithPackageIdItShouldFail()
|
2018-01-24 10:16:27 -08:00
|
|
|
{
|
|
|
|
var toolPackageObtainerSimulatorThatThrows
|
|
|
|
= new ToolPackageObtainerMock(
|
|
|
|
_fileSystemWrapper, true, null,
|
|
|
|
() => throw new PackageObtainException("Simulated error"));
|
|
|
|
var installToolCommand = new InstallToolCommand(
|
|
|
|
_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
toolPackageObtainerSimulatorThatThrows,
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock,
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
installToolCommand.Execute().Should().Be(1);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter.Lines.Count.Should().Be(2);
|
|
|
|
|
|
|
|
_reporter
|
|
|
|
.Lines[0]
|
|
|
|
.Should()
|
|
|
|
.Contain("Simulated error");
|
|
|
|
|
|
|
|
_reporter
|
|
|
|
.Lines[1]
|
|
|
|
.Should()
|
|
|
|
.Contain(string.Format(LocalizableStrings.ToolInstallationFailed, "global.tool.console.demo"));
|
2018-01-24 10:16:27 -08:00
|
|
|
}
|
|
|
|
|
2018-02-06 13:38:06 -08:00
|
|
|
[Fact]
|
|
|
|
public void GivenFailedPackageObtainWhenRunWithPackageIdItShouldHaveNoBrokenFolderOnDisk()
|
|
|
|
{
|
|
|
|
var toolPackageObtainerSimulatorThatThrows
|
|
|
|
= new ToolPackageObtainerMock(
|
|
|
|
_fileSystemWrapper, true, null,
|
|
|
|
duringObtain: () => throw new PackageObtainException("Simulated error"),
|
|
|
|
toolsPath: PathToPlacePackages);
|
|
|
|
var installToolCommand = new InstallToolCommand(
|
|
|
|
_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
toolPackageObtainerSimulatorThatThrows,
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock,
|
|
|
|
_reporter);
|
|
|
|
|
|
|
|
installToolCommand.Execute();
|
|
|
|
|
|
|
|
_fileSystemWrapper.Directory.Exists(Path.Combine(PathToPlacePackages, PackageId)).Should().BeFalse();
|
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
public void GivenCreateShimItShouldHaveNoBrokenFolderOnDisk()
|
|
|
|
{
|
|
|
|
_fileSystemWrapper.File.CreateEmptyFile(ExpectedCommandPath()); // Create conflict shim
|
|
|
|
var toolPackageObtainerSimulatorThatThrows
|
|
|
|
= new ToolPackageObtainerMock(
|
|
|
|
_fileSystemWrapper, true, null,
|
|
|
|
toolsPath: PathToPlacePackages);
|
|
|
|
var installToolCommand = new InstallToolCommand(
|
|
|
|
_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
toolPackageObtainerSimulatorThatThrows,
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock,
|
|
|
|
_reporter);
|
|
|
|
|
|
|
|
Action a = () => installToolCommand.Execute();
|
|
|
|
a.ShouldThrow<GracefulException>();
|
|
|
|
|
|
|
|
_fileSystemWrapper.Directory.Exists(Path.Combine(PathToPlacePackages, PackageId)).Should().BeFalse();
|
|
|
|
}
|
|
|
|
|
2018-01-24 10:16:27 -08:00
|
|
|
[Fact]
|
2018-01-17 19:26:52 -08:00
|
|
|
public void GivenInCorrectToolConfigurationWhenRunWithPackageIdItShouldFail()
|
2018-01-24 10:16:27 -08:00
|
|
|
{
|
|
|
|
var toolPackageObtainerSimulatorThatThrows
|
|
|
|
= new ToolPackageObtainerMock(
|
|
|
|
_fileSystemWrapper, true, null,
|
|
|
|
() => throw new ToolConfigurationException("Simulated error"));
|
|
|
|
var installToolCommand = new InstallToolCommand(
|
|
|
|
_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
toolPackageObtainerSimulatorThatThrows,
|
|
|
|
_shellShimMakerMock,
|
|
|
|
_environmentPathInstructionMock,
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter);
|
|
|
|
|
|
|
|
installToolCommand.Execute().Should().Be(1);
|
|
|
|
|
|
|
|
_reporter.Lines.Count.Should().Be(2);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter
|
|
|
|
.Lines[0]
|
|
|
|
.Should()
|
|
|
|
.Contain(
|
|
|
|
string.Format(
|
|
|
|
LocalizableStrings.InvalidToolConfiguration,
|
|
|
|
"Simulated error"));
|
|
|
|
|
|
|
|
_reporter
|
|
|
|
.Lines[1]
|
|
|
|
.Should()
|
|
|
|
.Contain(string.Format(LocalizableStrings.ToolInstallationFailedContactAuthor, "global.tool.console.demo"));
|
2018-01-24 10:16:27 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
public void WhenRunWithPackageIdItShouldShowSuccessMessage()
|
|
|
|
{
|
|
|
|
var installToolCommand = new InstallToolCommand(
|
|
|
|
_appliedCommand,
|
|
|
|
_parseResult,
|
|
|
|
_toolPackageObtainerMock,
|
|
|
|
_shellShimMakerMock,
|
2018-01-17 19:26:52 -08:00
|
|
|
new EnvironmentPathInstructionMock(_reporter, PathToPlaceShim, true),
|
|
|
|
_reporter);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
installToolCommand.Execute().Should().Be(0);
|
2018-01-24 10:16:27 -08:00
|
|
|
|
2018-01-17 19:26:52 -08:00
|
|
|
_reporter
|
|
|
|
.Lines
|
2018-01-24 10:16:27 -08:00
|
|
|
.Single().Should()
|
|
|
|
.Contain(string.Format(LocalizableStrings.InstallationSucceeded, "SimulatorCommand"));
|
|
|
|
}
|
2018-02-06 13:38:06 -08:00
|
|
|
|
|
|
|
private static string ExpectedCommandPath()
|
|
|
|
{
|
|
|
|
var extension = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : string.Empty;
|
|
|
|
return Path.Combine(
|
|
|
|
"pathToPlace",
|
|
|
|
ToolPackageObtainerMock.FakeCommandName + extension);
|
|
|
|
}
|
2018-01-24 10:16:27 -08:00
|
|
|
}
|
|
|
|
}
|