diff --git a/src/Dotnet.Script.DependencyModel/Context/DotnetRestorer.cs b/src/Dotnet.Script.DependencyModel/Context/DotnetRestorer.cs index bfacf1ca..8b8a9f4a 100644 --- a/src/Dotnet.Script.DependencyModel/Context/DotnetRestorer.cs +++ b/src/Dotnet.Script.DependencyModel/Context/DotnetRestorer.cs @@ -31,11 +31,13 @@ public void Restore(ProjectFileInfo projectFileInfo, string[] packageSources) _logger.Debug($"Restoring {projectFileInfo.Path} using the dotnet cli. RuntimeIdentifier : {runtimeIdentifier} NugetConfigFile: {projectFileInfo.NuGetConfigFile}"); - var exitcode = _commandRunner.Execute("dotnet", $"restore \"{projectFileInfo.Path}\" -r {runtimeIdentifier} {packageSourcesArgument} {configFileArgument}", workingDirectory); - if (exitcode != 0) + var commandPath = "dotnet"; + var commandArguments = $"restore \"{projectFileInfo.Path}\" -r {runtimeIdentifier} {packageSourcesArgument} {configFileArgument}"; + var commandResult = _commandRunner.Capture(commandPath, commandArguments, workingDirectory); + if (commandResult.ExitCode != 0) { // We must throw here, otherwise we may incorrectly run with the old 'project.assets.json' - throw new Exception($"Unable to restore packages from '{projectFileInfo.Path}'. Make sure that all script files contains valid NuGet references"); + throw new Exception($"Unable to restore packages from '{projectFileInfo.Path}'{System.Environment.NewLine}Make sure that all script files contains valid NuGet references{System.Environment.NewLine}{System.Environment.NewLine}Details:{System.Environment.NewLine}{workingDirectory} : {commandPath} {commandArguments}{System.Environment.NewLine}{commandResult.StandardOut}"); } string CreatePackageSourcesArguments() diff --git a/src/Dotnet.Script.Tests/DotnetRestorerTests.cs b/src/Dotnet.Script.Tests/DotnetRestorerTests.cs new file mode 100644 index 00000000..c954d6cc --- /dev/null +++ b/src/Dotnet.Script.Tests/DotnetRestorerTests.cs @@ -0,0 +1,80 @@ +using Dotnet.Script.DependencyModel.Context; +using Dotnet.Script.DependencyModel.Process; +using Dotnet.Script.DependencyModel.ProjectSystem; +using Dotnet.Script.Shared.Tests; +using System; +using System.IO; +using Xunit; +using Xunit.Abstractions; + +namespace Dotnet.Script.Tests +{ + public class DotnetRestorerTests + { + private PackageReference ValidPackageReferenceA => new PackageReference("Newtonsoft.Json", "12.0.3"); + private PackageReference ValidPackageReferenceB => new PackageReference("Moq", "4.14.5"); + + private PackageReference InvalidPackageReferenceA => new PackageReference("7c63e1f5-2248-ed31-9480-e4cb5ac322fe", "1.0.0"); + + public DotnetRestorerTests(ITestOutputHelper testOutputHelper) + { + testOutputHelper.Capture(); + } + + [Fact] + public void ShouldRestoreProjectPackageReferences() + { + using (var projectFolder = new DisposableFolder()) + { + var pathToProjectFile = Path.Combine(projectFolder.Path, "script.csproj"); + + var projectFile = new ProjectFile(); + projectFile.PackageReferences.Add(ValidPackageReferenceA); + projectFile.PackageReferences.Add(ValidPackageReferenceB); + projectFile.Save(pathToProjectFile); + + var projectFileInfo = new ProjectFileInfo(pathToProjectFile, string.Empty); + + var logFactory = TestOutputHelper.CreateTestLogFactory(); + var commandRunner = new CommandRunner(logFactory); + var restorer = new DotnetRestorer(commandRunner, logFactory); + + var pathToProjectObjDirectory = Path.Combine(projectFolder.Path, "obj"); + + Assert.False(Directory.Exists(pathToProjectObjDirectory)); + + restorer.Restore(projectFileInfo, Array.Empty()); + + Assert.True(Directory.Exists(pathToProjectObjDirectory)); + } + } + + [Fact] + public void ShouldThrowExceptionOnRestoreError() + { + using (var projectFolder = new DisposableFolder()) + { + var pathToProjectFile = Path.Combine(projectFolder.Path, "script.csproj"); + + var projectFile = new ProjectFile(); + projectFile.PackageReferences.Add(ValidPackageReferenceA); + projectFile.PackageReferences.Add(InvalidPackageReferenceA); + projectFile.PackageReferences.Add(ValidPackageReferenceB); + projectFile.Save(pathToProjectFile); + + var projectFileInfo = new ProjectFileInfo(pathToProjectFile, string.Empty); + + var logFactory = TestOutputHelper.CreateTestLogFactory(); + var commandRunner = new CommandRunner(logFactory); + var restorer = new DotnetRestorer(commandRunner, logFactory); + + var exception = Assert.Throws(() => + { + restorer.Restore(projectFileInfo, Array.Empty()); + }); + + Assert.Contains("NU1101", exception.Message); // unable to find package + } + } + } +}