dotnet-installer/test/Microsoft.DotNet.Tools.Tests.ComponentMocks/ToolPackageMock.cs
Peter Huene 5ebbd618ec
Fix case sensitivity of tool package identifiers.
This commit fixes the case sensitivity of tool package identifiers.

Previously the install and uninstall commands unintentionally required the tool
package ids to specified in all lowercase for the install / uninstall to work.

Fixes #8682.
2018-03-05 10:18:41 -08:00

128 lines
4.8 KiB
C#

// 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 Microsoft.DotNet.Cli;
using Microsoft.DotNet.ToolPackage;
using Microsoft.Extensions.EnvironmentAbstractions;
using NuGet.Versioning;
namespace Microsoft.DotNet.Tools.Tests.ComponentMocks
{
internal class ToolPackageMock : IToolPackage
{
private IFileSystem _fileSystem;
private Lazy<IReadOnlyList<CommandSettings>> _commands;
private Action _uninstallCallback;
public ToolPackageMock(
IFileSystem fileSystem,
PackageId id,
NuGetVersion version,
DirectoryPath packageDirectory,
Action uninstallCallback = null)
{
_fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
Id = id;
Version = version ?? throw new ArgumentNullException(nameof(version));
PackageDirectory = packageDirectory;
_commands = new Lazy<IReadOnlyList<CommandSettings>>(GetCommands);
_uninstallCallback = uninstallCallback;
}
public PackageId Id { get; private set; }
public NuGetVersion Version { get; private set; }
public DirectoryPath PackageDirectory { get; private set; }
public IReadOnlyList<CommandSettings> Commands
{
get
{
return _commands.Value;
}
}
public void Uninstall()
{
var rootDirectory = PackageDirectory.GetParentPath();
string tempPackageDirectory = null;
TransactionalAction.Run(
action: () => {
try
{
if (_fileSystem.Directory.Exists(PackageDirectory.Value))
{
var tempPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
_fileSystem.Directory.Move(PackageDirectory.Value, tempPath);
tempPackageDirectory = tempPath;
}
if (_fileSystem.Directory.Exists(rootDirectory.Value) &&
!_fileSystem.Directory.EnumerateFileSystemEntries(rootDirectory.Value).Any())
{
_fileSystem.Directory.Delete(rootDirectory.Value, false);
}
if (_uninstallCallback != null)
{
_uninstallCallback();
}
}
catch (Exception ex) when (ex is UnauthorizedAccessException || ex is IOException)
{
throw new ToolPackageException(
string.Format(
CommonLocalizableStrings.FailedToUninstallToolPackage,
Id,
ex.Message),
ex);
}
},
commit: () => {
if (tempPackageDirectory != null)
{
_fileSystem.Directory.Delete(tempPackageDirectory, true);
}
},
rollback: () => {
if (tempPackageDirectory != null)
{
_fileSystem.Directory.CreateDirectory(rootDirectory.Value);
_fileSystem.Directory.Move(tempPackageDirectory, PackageDirectory.Value);
}
});
}
private IReadOnlyList<CommandSettings> GetCommands()
{
try
{
// The mock restorer wrote the path to the executable into project.assets.json (not a real assets file)
// Currently only "dotnet" commands are supported
var executablePath = _fileSystem.File.ReadAllText(Path.Combine(PackageDirectory.Value, "project.assets.json"));
return new CommandSettings[]
{
new CommandSettings(
ProjectRestorerMock.FakeCommandName,
"dotnet",
PackageDirectory.WithFile(executablePath))
};
}
catch (IOException ex)
{
throw new ToolPackageException(
string.Format(
CommonLocalizableStrings.FailedToRetrieveToolConfiguration,
Id,
ex.Message),
ex);
}
}
}
}