diff --git a/src/Microsoft.NuGet.Build.Tasks.Tests/NuGetTestHelpers.cs b/src/Microsoft.NuGet.Build.Tasks.Tests/NuGetTestHelpers.cs index 03df913b6..690a64d86 100644 --- a/src/Microsoft.NuGet.Build.Tasks.Tests/NuGetTestHelpers.cs +++ b/src/Microsoft.NuGet.Build.Tasks.Tests/NuGetTestHelpers.cs @@ -55,13 +55,23 @@ public static ResolvePackagesResult ResolvePackagesWithJsonFileContents( filesInPackages.Add(fileInPackage); } } + else + { + // We will assume there is a location in the lock file we're using + var lockFile = JObject.Parse(projectLockJsonFileContents); + var firstLocation = ((JObject)lockFile["packageFolders"]).Properties().First().Name; + + foreach (var fileInPackage in GetFakeFileNamesFromPackages(projectLockJsonFileContents, firstLocation)) + { + filesInPackages.Add(fileInPackage); + } + } // Don't require the packages be restored on the machine ResolveNuGetPackageAssets task = null; - DirectoryExists directoryExists = path => task.GetPackageFolders().Any(l => path.StartsWith(l)) || Directory.Exists(path); FileExists fileExists = path => filesInPackages.Contains(path) || File.Exists(path); - task = new ResolveNuGetPackageAssets(directoryExists, fileExists, tryGetRuntimeVersion); + task = new ResolveNuGetPackageAssets(fileExists, tryGetRuntimeVersion); var sw = new StringWriter(); task.BuildEngine = new MockBuildEngine(sw); @@ -105,6 +115,10 @@ private static IEnumerable GetFakeFileNamesFromPackages(string projectJs yield return Path.Combine(packagesDirectory, library.Name, file).Replace('/', '\\'); } } + + // Some earlier versions of NuGet didn't include the hash file in the file list, so fake that + // in here. + yield return Path.Combine(packagesDirectory, library.Name.Replace('/', '\\'), library.Name.Replace('/', '.') + ".nupkg.sha512"); } } } diff --git a/src/Microsoft.NuGet.Build.Tasks/Delegates.cs b/src/Microsoft.NuGet.Build.Tasks/Delegates.cs index 56a3dba1f..5eed52919 100644 --- a/src/Microsoft.NuGet.Build.Tasks/Delegates.cs +++ b/src/Microsoft.NuGet.Build.Tasks/Delegates.cs @@ -3,7 +3,6 @@ namespace Microsoft.NuGet.Build.Tasks { - internal delegate bool DirectoryExists(string path); internal delegate bool FileExists(string path); internal delegate string TryGetRuntimeVersion(string path); } \ No newline at end of file diff --git a/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs b/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs index eb425a372..8574db9a1 100644 --- a/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs +++ b/src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs @@ -49,19 +49,13 @@ public sealed class ResolveNuGetPackageAssets : Task private readonly Dictionary _projectReferencesToOutputBasePaths = new Dictionary(StringComparer.OrdinalIgnoreCase); #region UnitTestSupport - private readonly DirectoryExists _directoryExists = new DirectoryExists(Directory.Exists); private readonly FileExists _fileExists = new FileExists(File.Exists); private readonly TryGetRuntimeVersion _tryGetRuntimeVersion = new TryGetRuntimeVersion(TryGetRuntimeVersion); private readonly bool _reportExceptionsToMSBuildLogger = true; - internal ResolveNuGetPackageAssets(DirectoryExists directoryExists, FileExists fileExists, TryGetRuntimeVersion tryGetRuntimeVersion) + internal ResolveNuGetPackageAssets(FileExists fileExists, TryGetRuntimeVersion tryGetRuntimeVersion) : this() { - if (directoryExists != null) - { - _directoryExists = directoryExists; - } - if (fileExists != null) { _fileExists = fileExists; @@ -894,7 +888,9 @@ private string GetNuGetPackagePath(string packageId, string packageVersion) { string packagePath = Path.Combine(packagesFolder, packageId, packageVersion); - if (_directoryExists(packagePath)) + // The proper way to check if a package is available is to look for the hash file, since that's the last + // file written as a part of the restore process. If it's not there, it means something failed part way through. + if (_fileExists(Path.Combine(packagePath, $"{packageId}.{packageVersion}.nupkg.sha512"))) { return packagePath; }