diff --git a/NuGet.Core.sln b/NuGet.Core.sln index 811b3430a17..954d32a8033 100644 --- a/NuGet.Core.sln +++ b/NuGet.Core.sln @@ -134,6 +134,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "NuGet.Repositories.Test", " EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "NuGet.Commands.Test.Utility", "test\NuGet.Core.Tests\NuGet.Commands.Test.Utility\NuGet.Commands.Test.Utility.xproj", "{975924FA-3B4F-46AD-AA3B-F7C066D3955C}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "NuGet.DependencyResolver.Core.Tests.Utility", "test\NuGet.Core.Tests\NuGet.DependencyResolver.Core.Tests.Utility\NuGet.DependencyResolver.Core.Tests.Utility.xproj", "{23C35C81-55E5-4E21-9E67-CCDEE901072B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -360,6 +362,10 @@ Global {975924FA-3B4F-46AD-AA3B-F7C066D3955C}.Debug|Any CPU.Build.0 = Debug|Any CPU {975924FA-3B4F-46AD-AA3B-F7C066D3955C}.Release|Any CPU.ActiveCfg = Release|Any CPU {975924FA-3B4F-46AD-AA3B-F7C066D3955C}.Release|Any CPU.Build.0 = Release|Any CPU + {23C35C81-55E5-4E21-9E67-CCDEE901072B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23C35C81-55E5-4E21-9E67-CCDEE901072B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23C35C81-55E5-4E21-9E67-CCDEE901072B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23C35C81-55E5-4E21-9E67-CCDEE901072B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -420,5 +426,6 @@ Global {2034C981-C938-4F0F-8F3B-528B83CB8F7D} = {BB63CACA-866F-454F-BA4C-78B788D032BB} {93D1D30C-45F8-4DCE-8EAD-7C7C504713B6} = {7323F93B-D141-4001-BB9E-7AF14031143E} {975924FA-3B4F-46AD-AA3B-F7C066D3955C} = {7323F93B-D141-4001-BB9E-7AF14031143E} + {23C35C81-55E5-4E21-9E67-CCDEE901072B} = {7323F93B-D141-4001-BB9E-7AF14031143E} EndGlobalSection EndGlobal diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/OriginalCaseGlobalPackageFolder.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/OriginalCaseGlobalPackageFolder.cs index 8c796530eab..84b3a52f187 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/OriginalCaseGlobalPackageFolder.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/OriginalCaseGlobalPackageFolder.cs @@ -160,7 +160,12 @@ private async Task CopyToAsync(RemoteMatch remoteMatch, Stream destination, Canc else { // Otherwise, get it from the provider. - await remoteMatch.Provider.CopyToAsync(remoteMatch.Library, destination, token); + await remoteMatch.Provider.CopyToAsync( + remoteMatch.Library, + destination, + _request.CacheContext, + _request.Log, + token); } } } diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreCommand.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreCommand.cs index 296d86af541..4d0c489bf26 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreCommand.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreCommand.cs @@ -28,9 +28,9 @@ internal class ProjectRestoreCommand private readonly ProjectRestoreRequest _request; - public ProjectRestoreCommand(ILogger logger, ProjectRestoreRequest request) + public ProjectRestoreCommand(ProjectRestoreRequest request) { - _logger = logger; + _logger = request.Log; _request = request; } @@ -272,7 +272,12 @@ private async Task InstallPackageAsync(RemoteMatch installItem, CancellationToke _request.XmlDocFileSaveMode); await PackageExtractor.InstallFromSourceAsync( - stream => installItem.Provider.CopyToAsync(installItem.Library, stream, token), + stream => installItem.Provider.CopyToAsync( + installItem.Library, + stream, + _request.CacheContext, + _logger, + token), versionFolderPathContext, token); } diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreRequest.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreRequest.cs index adc4da982f8..65da29bf3c9 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreRequest.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/ProjectRestoreRequest.cs @@ -3,10 +3,12 @@ using System.Collections.Concurrent; using System.Collections.Generic; +using NuGet.Common; using NuGet.Frameworks; using NuGet.Packaging; using NuGet.Packaging.Core; using NuGet.ProjectModel; +using NuGet.Protocol.Core.Types; using NuGet.RuntimeModel; namespace NuGet.Commands @@ -20,6 +22,8 @@ public ProjectRestoreRequest( Dictionary runtimeGraphCache, ConcurrentDictionary runtimeGraphCacheByPackage) { + CacheContext = request.CacheContext; + Log = request.Log; PackagesDirectory = request.PackagesDirectory; ExistingLockFile = existingLockFile; RuntimeGraphCache = runtimeGraphCache; @@ -30,6 +34,8 @@ public ProjectRestoreRequest( XmlDocFileSaveMode = request.XmlDocFileSaveMode; } + public SourceCacheContext CacheContext { get; } + public ILogger Log { get; } public string PackagesDirectory { get; } public int MaxDegreeOfConcurrency { get; } public LockFile ExistingLockFile { get; } diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/MSBuildP2PRestoreRequestProvider.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/MSBuildP2PRestoreRequestProvider.cs index 0bbd6e2aa97..51648c9ec01 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/MSBuildP2PRestoreRequestProvider.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/MSBuildP2PRestoreRequestProvider.cs @@ -91,6 +91,7 @@ protected virtual RestoreSummaryRequest Create( var request = new RestoreRequest( project.PackageSpec, sharedCache, + restoreContext.CacheContext, restoreContext.Log); restoreContext.ApplyStandardProperties(request); diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/ProjectJsonRestoreRequestProvider.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/ProjectJsonRestoreRequestProvider.cs index e838fed2b7a..1bcdf774c35 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/ProjectJsonRestoreRequestProvider.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RequestFactory/ProjectJsonRestoreRequestProvider.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Threading.Tasks; using NuGet.Common; -using NuGet.Configuration; using NuGet.ProjectModel; namespace NuGet.Commands @@ -84,6 +83,7 @@ private RestoreSummaryRequest Create( var request = new RestoreRequest( project, sharedCache, + restoreContext.CacheContext, restoreContext.Log); restoreContext.ApplyStandardProperties(request); diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs index 44f738ddafd..5a43e226398 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreCommand.cs @@ -388,7 +388,7 @@ private async Task> ExecuteToolRestoresAsync( existingToolLockFile, new Dictionary(), _runtimeGraphCacheByPackage); - var projectRestoreCommand = new ProjectRestoreCommand(_logger, projectRestoreRequest); + var projectRestoreCommand = new ProjectRestoreCommand(projectRestoreRequest); var result = await projectRestoreCommand.TryRestore( tool.LibraryRange, projectFrameworkRuntimePairs, @@ -556,7 +556,7 @@ private async Task> ExecuteRestoreAsync( _request.ExistingLockFile, _runtimeGraphCache, _runtimeGraphCacheByPackage); - var projectRestoreCommand = new ProjectRestoreCommand(_logger, projectRestoreRequest); + var projectRestoreCommand = new ProjectRestoreCommand(projectRestoreRequest); var result = await projectRestoreCommand.TryRestore( projectRange, projectFrameworkRuntimePairs, @@ -660,7 +660,9 @@ private static IEnumerable CreateFrameworkRuntimePairs( private static RemoteWalkContext CreateRemoteWalkContext(RestoreRequest request) { - var context = new RemoteWalkContext(); + var context = new RemoteWalkContext( + request.CacheContext, + request.Log); foreach (var provider in request.DependencyProviders.LocalProviders) { diff --git a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreRequest.cs b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreRequest.cs index 6710415cbb7..2768133096d 100644 --- a/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreRequest.cs +++ b/src/NuGet.Core/NuGet.Commands/RestoreCommand/RestoreRequest.cs @@ -8,6 +8,7 @@ using NuGet.Packaging; using NuGet.Packaging.PackageExtraction; using NuGet.ProjectModel; +using NuGet.Protocol.Core.Types; namespace NuGet.Commands { @@ -18,6 +19,7 @@ public class RestoreRequest public RestoreRequest( PackageSpec project, RestoreCommandProviders dependencyProviders, + SourceCacheContext cacheContext, ILogger log) { if (project == null) @@ -30,6 +32,11 @@ public RestoreRequest( throw new ArgumentNullException(nameof(dependencyProviders)); } + if (cacheContext == null) + { + throw new ArgumentNullException(nameof(cacheContext)); + } + if (log == null) { throw new ArgumentNullException(nameof(log)); @@ -43,11 +50,14 @@ public RestoreRequest( PackagesDirectory = dependencyProviders.GlobalPackages.RepositoryRoot; IsLowercasePackagesDirectory = true; + CacheContext = cacheContext; Log = log; DependencyProviders = dependencyProviders; } + public SourceCacheContext CacheContext { get; set; } + public ILogger Log { get; set; } /// diff --git a/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/IRemoteDependencyProvider.cs b/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/IRemoteDependencyProvider.cs index 77b0d45dcf2..0fc48aa215a 100644 --- a/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/IRemoteDependencyProvider.cs +++ b/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/IRemoteDependencyProvider.cs @@ -5,8 +5,10 @@ using System.IO; using System.Threading; using System.Threading.Tasks; +using NuGet.Common; using NuGet.Frameworks; using NuGet.LibraryModel; +using NuGet.Protocol.Core.Types; namespace NuGet.DependencyResolver { @@ -14,10 +16,25 @@ public interface IRemoteDependencyProvider { bool IsHttp { get; } - Task FindLibraryAsync(LibraryRange libraryRange, NuGetFramework targetFramework, CancellationToken cancellationToken); + Task FindLibraryAsync( + LibraryRange libraryRange, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken); - Task> GetDependenciesAsync(LibraryIdentity match, NuGetFramework targetFramework, CancellationToken cancellationToken); + Task> GetDependenciesAsync( + LibraryIdentity match, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken); - Task CopyToAsync(LibraryIdentity match, Stream stream, CancellationToken cancellationToken); + Task CopyToAsync( + LibraryIdentity match, + Stream stream, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken); } } diff --git a/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/LocalDependencyProvider.cs b/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/LocalDependencyProvider.cs index 569f19638ee..fa2cafcab1e 100644 --- a/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/LocalDependencyProvider.cs +++ b/src/NuGet.Core/NuGet.DependencyResolver.Core/Providers/LocalDependencyProvider.cs @@ -6,8 +6,10 @@ using System.IO; using System.Threading; using System.Threading.Tasks; +using NuGet.Common; using NuGet.Frameworks; using NuGet.LibraryModel; +using NuGet.Protocol.Core.Types; namespace NuGet.DependencyResolver { @@ -22,7 +24,12 @@ public LocalDependencyProvider(IDependencyProvider dependencyProvider) public bool IsHttp { get; private set; } - public Task FindLibraryAsync(LibraryRange libraryRange, NuGetFramework targetFramework, CancellationToken cancellationToken) + public Task FindLibraryAsync( + LibraryRange libraryRange, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { var library = _dependencyProvider.GetLibrary(libraryRange, targetFramework); @@ -34,14 +41,24 @@ public Task FindLibraryAsync(LibraryRange libraryRange, NuGetFr return Task.FromResult(library.Identity); } - public Task> GetDependenciesAsync(LibraryIdentity library, NuGetFramework targetFramework, CancellationToken cancellationToken) + public Task> GetDependenciesAsync( + LibraryIdentity library, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { var description = _dependencyProvider.GetLibrary(library, targetFramework); return Task.FromResult(description.Dependencies); } - public Task CopyToAsync(LibraryIdentity match, Stream stream, CancellationToken cancellationToken) + public Task CopyToAsync( + LibraryIdentity match, + Stream stream, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { throw new NotSupportedException(); } diff --git a/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteDependencyWalker.cs b/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteDependencyWalker.cs index f42cd6e73c6..40cd1046e90 100644 --- a/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteDependencyWalker.cs +++ b/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteDependencyWalker.cs @@ -354,7 +354,12 @@ private async Task> FindLibraryEntry( else { // Look up the dependencies from the source - dependencies = await match.Provider.GetDependenciesAsync(match.Library, framework, cancellationToken); + dependencies = await match.Provider.GetDependenciesAsync( + match.Library, + framework, + _context.CacheContext, + _context.Logger, + cancellationToken); } return new GraphItem(match.Library) @@ -553,21 +558,44 @@ private async Task FindLibraryByVersion(LibraryRange libraryRange, if (libraryRange.VersionRange.IsFloating) { // Don't optimize the non http path for floating versions or we'll miss things - return await FindLibrary(libraryRange, providers, provider => provider.FindLibraryAsync(libraryRange, framework, token)); + return await FindLibrary( + libraryRange, + providers, + provider => provider.FindLibraryAsync( + libraryRange, + framework, + _context.CacheContext, + _context.Logger, + token)); } // Try the non http sources first - var nonHttpMatch = await FindLibrary(libraryRange, providers.Where(p => !p.IsHttp), provider => provider.FindLibraryAsync(libraryRange, framework, token)); + var nonHttpMatch = await FindLibrary( + libraryRange, + providers.Where(p => !p.IsHttp), + provider => provider.FindLibraryAsync( + libraryRange, + framework, + _context.CacheContext, + _context.Logger, + token)); // If we found an exact match then use it - if (nonHttpMatch != null - && nonHttpMatch.Library.Version.Equals(libraryRange.VersionRange.MinVersion)) + if (nonHttpMatch != null && nonHttpMatch.Library.Version.Equals(libraryRange.VersionRange.MinVersion)) { return nonHttpMatch; } // Otherwise try the http sources - var httpMatch = await FindLibrary(libraryRange, providers.Where(p => p.IsHttp), provider => provider.FindLibraryAsync(libraryRange, framework, token)); + var httpMatch = await FindLibrary( + libraryRange, + providers.Where(p => p.IsHttp), + provider => provider.FindLibraryAsync( + libraryRange, + framework, + _context.CacheContext, + _context.Logger, + token)); // Pick the best match of the 2 if (libraryRange.VersionRange.IsBetter( diff --git a/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteWalkContext.cs b/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteWalkContext.cs index f796f8bb422..fb51bab798d 100644 --- a/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteWalkContext.cs +++ b/src/NuGet.Core/NuGet.DependencyResolver.Core/Remote/RemoteWalkContext.cs @@ -1,18 +1,33 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; -using NuGet.LibraryModel; +using NuGet.Common; using NuGet.Packaging.Core; +using NuGet.Protocol.Core.Types; namespace NuGet.DependencyResolver { public class RemoteWalkContext { - public RemoteWalkContext() + public RemoteWalkContext(SourceCacheContext cacheContext, ILogger logger) { + if (cacheContext == null) + { + throw new ArgumentNullException(nameof(cacheContext)); + } + + if (logger == null) + { + throw new ArgumentNullException(nameof(logger)); + } + + CacheContext = cacheContext; + Logger = logger; + ProjectLibraryProviders = new List(); LocalLibraryProviders = new List(); RemoteLibraryProviders = new List(); @@ -21,6 +36,9 @@ public RemoteWalkContext() PackageFileCache = new ConcurrentDictionary>(PackageIdentity.Comparer); } + public SourceCacheContext CacheContext { get; } + public ILogger Logger { get; } + public IList ProjectLibraryProviders { get; } public IList LocalLibraryProviders { get; } public IList RemoteLibraryProviders { get; } diff --git a/src/NuGet.Core/NuGet.DependencyResolver/SourceRepositoryDependencyProvider.cs b/src/NuGet.Core/NuGet.DependencyResolver/SourceRepositoryDependencyProvider.cs index efca5caa323..d85485eb212 100644 --- a/src/NuGet.Core/NuGet.DependencyResolver/SourceRepositoryDependencyProvider.cs +++ b/src/NuGet.Core/NuGet.DependencyResolver/SourceRepositoryDependencyProvider.cs @@ -51,7 +51,12 @@ public SourceRepositoryDependencyProvider( public bool IsHttp => _sourceRepository.PackageSource.IsHttp; - public async Task FindLibraryAsync(LibraryRange libraryRange, NuGetFramework targetFramework, CancellationToken cancellationToken) + public async Task FindLibraryAsync( + LibraryRange libraryRange, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { await EnsureResource(); @@ -62,7 +67,11 @@ public async Task FindLibraryAsync(LibraryRange libraryRange, N { await _throttle.WaitAsync(); } - packageVersions = await _findPackagesByIdResource.GetAllVersionsAsync(libraryRange.Name, cancellationToken); + packageVersions = await _findPackagesByIdResource.GetAllVersionsAsync( + libraryRange.Name, + cacheContext, + logger, + cancellationToken); } catch (FatalProtocolException e) when (_ignoreFailedSources) { @@ -85,6 +94,8 @@ public async Task FindLibraryAsync(LibraryRange libraryRange, N var packageIdentity = await _findPackagesByIdResource.GetOriginalIdentityAsync( libraryRange.Name, packageVersion, + cacheContext, + logger, cancellationToken); return new LibraryIdentity @@ -98,7 +109,12 @@ public async Task FindLibraryAsync(LibraryRange libraryRange, N return null; } - public async Task> GetDependenciesAsync(LibraryIdentity match, NuGetFramework targetFramework, CancellationToken cancellationToken) + public async Task> GetDependenciesAsync( + LibraryIdentity match, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { await EnsureResource(); @@ -109,7 +125,12 @@ public async Task> GetDependenciesAsync(LibraryId { await _throttle.WaitAsync(); } - packageInfo = await _findPackagesByIdResource.GetDependencyInfoAsync(match.Name, match.Version, cancellationToken); + packageInfo = await _findPackagesByIdResource.GetDependencyInfoAsync( + match.Name, + match.Version, + cacheContext, + logger, + cancellationToken); } catch (FatalProtocolException e) when (_ignoreFailedSources) { @@ -127,7 +148,12 @@ public async Task> GetDependenciesAsync(LibraryId return GetDependencies(packageInfo, targetFramework); } - public async Task CopyToAsync(LibraryIdentity identity, Stream stream, CancellationToken cancellationToken) + public async Task CopyToAsync( + LibraryIdentity identity, + Stream stream, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { await EnsureResource(); @@ -146,6 +172,8 @@ await _findPackagesByIdResource.CopyNupkgToStreamAsync( identity.Name, identity.Version, stream, + cacheContext, + logger, CancellationToken.None); } catch (FatalProtocolException e) when (_ignoreFailedSources) @@ -193,8 +221,6 @@ private async Task EnsureResource() if (_findPackagesByIdResource == null) { var resource = await _sourceRepository.GetResourceAsync(); - resource.Logger = _logger; - resource.CacheContext = _cacheContext; lock (_lock) { diff --git a/src/NuGet.Core/NuGet.PackageManagement/BuildIntegration/BuildIntegratedRestoreUtility.cs b/src/NuGet.Core/NuGet.PackageManagement/BuildIntegration/BuildIntegratedRestoreUtility.cs index d4e66e96c3a..4ba405ca3b6 100644 --- a/src/NuGet.Core/NuGet.PackageManagement/BuildIntegration/BuildIntegratedRestoreUtility.cs +++ b/src/NuGet.Core/NuGet.PackageManagement/BuildIntegration/BuildIntegratedRestoreUtility.cs @@ -75,6 +75,7 @@ public static async Task RestoreAsync( project.PackageSpec, context, providers, + cacheContext, token); // Throw before writing if this has been canceled @@ -95,6 +96,7 @@ internal static async Task RestoreAsync( PackageSpec packageSpec, ExternalProjectReferenceContext context, RestoreCommandProviders providers, + SourceCacheContext cacheContext, CancellationToken token) { // Restoring packages @@ -103,7 +105,7 @@ internal static async Task RestoreAsync( Strings.BuildIntegratedPackageRestoreStarted, project.ProjectName)); - var request = new RestoreRequest(packageSpec, providers, logger); + var request = new RestoreRequest(packageSpec, providers, cacheContext, logger); request.MaxDegreeOfConcurrency = PackageManagementConstants.DefaultMaxDegreeOfParallelism; // Add the existing lock file if it exists diff --git a/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs b/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs index e494532749c..e1094e2140f 100644 --- a/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs +++ b/src/NuGet.Core/NuGet.PackageManagement/NuGetPackageManager.cs @@ -2256,7 +2256,6 @@ public async Task PreviewBuildIntegratedProjectAct } var logger = new ProjectContextLogger(nuGetProjectContext); - var buildIntegratedContext = new ExternalProjectReferenceContext(logger); var pathContext = NuGetPathContext.Create(Settings); @@ -2269,6 +2268,8 @@ public async Task PreviewBuildIntegratedProjectAct { cacheContext.MaxAge = DateTimeOffset.UtcNow; + var buildIntegratedContext = new ExternalProjectReferenceContext(logger); + var providers = RestoreCommandProviders.Create( pathContext.UserPackageFolder, pathContext.FallbackPackageFolders, @@ -2289,6 +2290,7 @@ public async Task PreviewBuildIntegratedProjectAct originalPackageSpec, buildIntegratedContext, providers, + cacheContext, token); originalLockFile = originalRestoreResult.LockFile; @@ -2318,6 +2320,7 @@ public async Task PreviewBuildIntegratedProjectAct packageSpec, buildIntegratedContext, providers, + cacheContext, token); InstallationCompatibility.EnsurePackageCompatibility( diff --git a/src/NuGet.Core/NuGet.ProjectManagement/Projects/BuildIntegratedProjectReferenceContext.cs b/src/NuGet.Core/NuGet.ProjectManagement/Projects/BuildIntegratedProjectReferenceContext.cs index 552ba5786e5..3f2c16396e1 100644 --- a/src/NuGet.Core/NuGet.ProjectManagement/Projects/BuildIntegratedProjectReferenceContext.cs +++ b/src/NuGet.Core/NuGet.ProjectManagement/Projects/BuildIntegratedProjectReferenceContext.cs @@ -7,14 +7,6 @@ namespace NuGet.ProjectManagement { public class ExternalProjectReferenceContext { - /// - /// Create a new build integrated project reference context and cache. - /// - public ExternalProjectReferenceContext() - : this(NullLogger.Instance) - { - } - /// /// Create a new build integrated project reference context and caches. /// @@ -34,34 +26,6 @@ public ExternalProjectReferenceContext(ILogger logger) StringComparer.OrdinalIgnoreCase); } - /// - /// Create a new build integrated project reference context with the given caches. - /// - public ExternalProjectReferenceContext( - ILogger logger, - IDictionary> cache, - IDictionary specCache) - { - if (logger == null) - { - throw new ArgumentNullException(nameof(logger)); - } - - if (cache == null) - { - throw new ArgumentNullException(nameof(cache)); - } - - if (specCache == null) - { - throw new ArgumentNullException(nameof(specCache)); - } - - Logger = logger; - Cache = cache; - SpecCache = specCache; - } - /// /// Cached references /// diff --git a/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV2FindPackageByIdResource.cs b/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV2FindPackageByIdResource.cs index c67fba517a9..bccdd5b5104 100644 --- a/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV2FindPackageByIdResource.cs +++ b/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV2FindPackageByIdResource.cs @@ -10,6 +10,7 @@ using System.Threading; using System.Threading.Tasks; using System.Xml; +using NuGet.Common; using NuGet.Configuration; using NuGet.Packaging; using NuGet.Packaging.Core; @@ -32,15 +33,24 @@ public LocalV2FindPackageByIdResource(PackageSource packageSource) _source = rootDirInfo.FullName; } - public override Task> GetAllVersionsAsync(string id, CancellationToken token) + public override Task> GetAllVersionsAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token) { - var infos = GetPackageInfos(id); + var infos = GetPackageInfos(id, logger); return Task.FromResult(infos.Select(p => p.Identity.Version)); } - public override Task GetOriginalIdentityAsync(string id, NuGetVersion version, CancellationToken token) + public override Task GetOriginalIdentityAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token) { - var info = GetPackageInfo(id, version); + var info = GetPackageInfo(id, version, logger); if (info != null) { return Task.FromResult(info.Identity); @@ -53,9 +63,11 @@ public override async Task CopyNupkgToStreamAsync( string id, NuGetVersion version, Stream destination, + SourceCacheContext cacheContext, + ILogger logger, CancellationToken token) { - var info = GetPackageInfo(id, version); + var info = GetPackageInfo(id, version, logger); if (info != null) { @@ -69,10 +81,15 @@ public override async Task CopyNupkgToStreamAsync( return false; } - public override Task GetDependencyInfoAsync(string id, NuGetVersion version, CancellationToken token) + public override Task GetDependencyInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token) { FindPackageByIdDependencyInfo dependencyInfo = null; - var info = GetPackageInfo(id, version); + var info = GetPackageInfo(id, version, logger); if (info != null) { dependencyInfo = GetDependencyInfo(info.Nuspec); @@ -81,22 +98,22 @@ public override Task GetDependencyInfoAsync(strin return Task.FromResult(dependencyInfo); } - private LocalPackageInfo GetPackageInfo(string id, NuGetVersion version) + private LocalPackageInfo GetPackageInfo(string id, NuGetVersion version, ILogger logger) { - return GetPackageInfos(id).FirstOrDefault(package => package.Identity.Version == version); + return GetPackageInfos(id, logger).FirstOrDefault(package => package.Identity.Version == version); } - private IReadOnlyList GetPackageInfos(string id) + private IReadOnlyList GetPackageInfos(string id, ILogger logger) { - return _packageInfoCache.GetOrAdd(id, (packageId) => GetPackageInfosCore(packageId)); + return _packageInfoCache.GetOrAdd(id, (packageId) => GetPackageInfosCore(packageId, logger)); } - private IReadOnlyList GetPackageInfosCore(string id) + private IReadOnlyList GetPackageInfosCore(string id, ILogger logger) { var result = new List(); // packages\{packageId}.{version}.nupkg - var nupkgFiles = LocalFolderUtility.GetNupkgsFromFlatFolder(_source, Logger) + var nupkgFiles = LocalFolderUtility.GetNupkgsFromFlatFolder(_source, logger) .Where(path => LocalFolderUtility.IsPossiblePackageMatch(path, id)); foreach (var nupkgInfo in nupkgFiles) diff --git a/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV3FindPackageByIdResource.cs b/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV3FindPackageByIdResource.cs index c69a801fa54..a7aac783e39 100644 --- a/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV3FindPackageByIdResource.cs +++ b/src/NuGet.Core/NuGet.Protocol.Core.v3/LocalRepositories/LocalV3FindPackageByIdResource.cs @@ -10,6 +10,7 @@ using System.Threading; using System.Threading.Tasks; using System.Xml; +using NuGet.Common; using NuGet.Configuration; using NuGet.Packaging; using NuGet.Packaging.Core; @@ -42,18 +43,24 @@ public LocalV3FindPackageByIdResource(PackageSource source) _resolver = new VersionFolderPathResolver(_source); } - public override Task> GetAllVersionsAsync(string id, CancellationToken token) + public override Task> GetAllVersionsAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token) { - return Task.FromResult(GetVersions(id).AsEnumerable()); + return Task.FromResult(GetVersions(id, logger).AsEnumerable()); } public override async Task CopyNupkgToStreamAsync( string id, NuGetVersion version, Stream destination, + SourceCacheContext cacheContext, + ILogger logger, CancellationToken token) { - var matchedVersion = GetVersion(id, version); + var matchedVersion = GetVersion(id, version, logger); if (matchedVersion != null) { @@ -69,9 +76,14 @@ public override async Task CopyNupkgToStreamAsync( return false; } - public override Task GetOriginalIdentityAsync(string id, NuGetVersion version, CancellationToken token) + public override Task GetOriginalIdentityAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token) { - var matchedVersion = GetVersion(id, version); + var matchedVersion = GetVersion(id, version, logger); PackageIdentity outputIdentity = null; if (matchedVersion != null) { @@ -89,9 +101,14 @@ public override Task GetOriginalIdentityAsync(string id, NuGetV return Task.FromResult(outputIdentity); } - public override Task GetDependencyInfoAsync(string id, NuGetVersion version, CancellationToken token) + public override Task GetDependencyInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token) { - var matchedVersion = GetVersion(id, version); + var matchedVersion = GetVersion(id, version, logger); FindPackageByIdDependencyInfo dependencyInfo = null; if (matchedVersion != null) { @@ -139,17 +156,17 @@ private T ProcessNuspecReader(string id, NuGetVersion version, Func v == version); + return GetVersions(id, logger).FirstOrDefault(v => v == version); } - private List GetVersions(string id) + private List GetVersions(string id, ILogger logger) { - return _cache.GetOrAdd(id, keyId => GetVersionsCore(keyId)); + return _cache.GetOrAdd(id, keyId => GetVersionsCore(keyId, logger)); } - private List GetVersionsCore(string id) + private List GetVersionsCore(string id, ILogger logger) { var versions = new List(); var idDir = new DirectoryInfo(_resolver.GetVersionListPath(id)); @@ -172,7 +189,7 @@ private List GetVersionsCore(string id) NuGetVersion version; if (!NuGetVersion.TryParse(versionPart, out version)) { - Logger.LogWarning(string.Format( + logger.LogWarning(string.Format( CultureInfo.CurrentCulture, Strings.InvalidVersionFolder, versionDir.FullName)); diff --git a/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/HttpFileSystemBasedFindPackageByIdResource.cs b/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/HttpFileSystemBasedFindPackageByIdResource.cs index 1eb02e95b3f..2fd3eefd1b1 100644 --- a/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/HttpFileSystemBasedFindPackageByIdResource.cs +++ b/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/HttpFileSystemBasedFindPackageByIdResource.cs @@ -62,15 +62,24 @@ public HttpFileSystemBasedFindPackageByIdResource( _nupkgDownloader = new FindPackagesByIdNupkgDownloader(httpSource); } - public override async Task> GetAllVersionsAsync(string id, CancellationToken cancellationToken) + public override async Task> GetAllVersionsAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfos = await EnsurePackagesAsync(id, cancellationToken); + var packageInfos = await EnsurePackagesAsync(id, cacheContext, logger, cancellationToken); return packageInfos.Keys; } - public override async Task GetOriginalIdentityAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + public override async Task GetOriginalIdentityAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfos = await EnsurePackagesAsync(id, cancellationToken); + var packageInfos = await EnsurePackagesAsync(id, cacheContext, logger, cancellationToken); PackageInfo packageInfo; if (!packageInfos.TryGetValue(version, out packageInfo)) @@ -85,17 +94,22 @@ public override async Task GetOriginalIdentityAsync(string id, var reader = await _nupkgDownloader.GetNuspecReaderFromNupkgAsync( packageInfo.Identity, packageInfo.ContentUri, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); return reader.GetIdentity(); }); } - public override async Task GetDependencyInfoAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + public override async Task GetDependencyInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfos = await EnsurePackagesAsync(id, cancellationToken); + var packageInfos = await EnsurePackagesAsync(id, cacheContext, logger, cancellationToken); PackageInfo packageInfo; if (packageInfos.TryGetValue(version, out packageInfo)) @@ -103,8 +117,8 @@ public override async Task GetDependencyInfoAsync var reader = await _nupkgDownloader.GetNuspecReaderFromNupkgAsync( packageInfo.Identity, packageInfo.ContentUri, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); // Populate the package identity cache while we have the .nuspec open. @@ -121,9 +135,11 @@ public override async Task CopyNupkgToStreamAsync( string id, NuGetVersion version, Stream destination, + SourceCacheContext cacheContext, + ILogger logger, CancellationToken cancellationToken) { - var packageInfos = await EnsurePackagesAsync(id, cancellationToken); + var packageInfos = await EnsurePackagesAsync(id, cacheContext, logger, cancellationToken); PackageInfo packageInfo; if (packageInfos.TryGetValue(version, out packageInfo)) @@ -132,26 +148,38 @@ public override async Task CopyNupkgToStreamAsync( packageInfo.Identity, packageInfo.ContentUri, destination, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); } return false; } - private Task> EnsurePackagesAsync(string id, CancellationToken cancellationToken) + private Task> EnsurePackagesAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - return _packageInfoCache.GetOrAdd(id, (keyId) => FindPackagesByIdAsync(keyId, cancellationToken)); + return _packageInfoCache.GetOrAdd(id, (keyId) => FindPackagesByIdAsync( + keyId, + cacheContext, + logger, + cancellationToken)); } - private async Task> FindPackagesByIdAsync(string id, CancellationToken cancellationToken) + private async Task> FindPackagesByIdAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { for (var retry = 0; retry != 3; ++retry) { var baseUri = _baseUris[retry % _baseUris.Count].OriginalString; var uri = baseUri + id.ToLowerInvariant() + "/index.json"; - var httpSourceCacheContext = HttpSourceCacheContext.Create(CacheContext, retry); + var httpSourceCacheContext = HttpSourceCacheContext.Create(cacheContext, retry); try { @@ -176,7 +204,7 @@ private async Task> FindPackagesById } catch { - Logger.LogWarning(string.Format(CultureInfo.CurrentCulture, Strings.Log_FileIsCorrupt, httpSourceResult.CacheFile)); + logger.LogWarning(string.Format(CultureInfo.CurrentCulture, Strings.Log_FileIsCorrupt, httpSourceResult.CacheFile)); throw; } @@ -188,7 +216,7 @@ private async Task> FindPackagesById return Task.FromResult(result); }, - Logger, + logger, cancellationToken); } catch (Exception ex) when (retry < 2) @@ -196,12 +224,12 @@ private async Task> FindPackagesById var message = string.Format(CultureInfo.CurrentCulture, Strings.Log_RetryingFindPackagesById, nameof(FindPackagesByIdAsync), uri) + Environment.NewLine + ExceptionUtilities.DisplayMessage(ex); - Logger.LogMinimal(message); + logger.LogMinimal(message); } catch (Exception ex) when (retry == 2) { var message = string.Format(CultureInfo.CurrentCulture, Strings.Log_FailedToRetrievePackage, uri); - Logger.LogError(message + Environment.NewLine + ExceptionUtilities.DisplayMessage(ex)); + logger.LogError(message + Environment.NewLine + ExceptionUtilities.DisplayMessage(ex)); throw new FatalProtocolException(message, ex); } diff --git a/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV2FindPackageByIdResource.cs b/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV2FindPackageByIdResource.cs index 41232f660a7..289426c8d8f 100644 --- a/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV2FindPackageByIdResource.cs +++ b/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV2FindPackageByIdResource.cs @@ -50,19 +50,34 @@ public RemoteV2FindPackageByIdResource(PackageSource packageSource, HttpSource h public PackageSource PackageSource { get; } - public override async Task> GetAllVersionsAsync(string id, CancellationToken cancellationToken) + public override async Task> GetAllVersionsAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var result = await EnsurePackagesAsync(id, cancellationToken); + var result = await EnsurePackagesAsync(id, cacheContext, logger, cancellationToken); return result.Select(item => item.Identity.Version); } - public override async Task GetOriginalIdentityAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + public override async Task GetOriginalIdentityAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { return await _packageIdentityCache.GetOrAdd( new PackageIdentity(id, version), async original => { - var packageInfo = await GetPackageInfoAsync(original.Id, original.Version, cancellationToken); + var packageInfo = await GetPackageInfoAsync( + original.Id, + original.Version, + cacheContext, + logger, + cancellationToken); + if (packageInfo == null) { return null; @@ -71,28 +86,33 @@ public override async Task GetOriginalIdentityAsync(string id, var reader = await _nupkgDownloader.GetNuspecReaderFromNupkgAsync( packageInfo.Identity, packageInfo.ContentUri, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); return reader.GetIdentity(); }); } - public override async Task GetDependencyInfoAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + public override async Task GetDependencyInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfo = await GetPackageInfoAsync(id, version, cancellationToken); + var packageInfo = await GetPackageInfoAsync(id, version, cacheContext, logger, cancellationToken); if (packageInfo == null) { - Logger.LogWarning($"Unable to find package {id}{version}"); + logger.LogWarning($"Unable to find package {id}{version}"); return null; } var reader = await _nupkgDownloader.GetNuspecReaderFromNupkgAsync( packageInfo.Identity, packageInfo.ContentUri, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); // Populate the package identity cache while we have the .nuspec open. @@ -107,9 +127,11 @@ public override async Task CopyNupkgToStreamAsync( string id, NuGetVersion version, Stream destination, + SourceCacheContext cacheContext, + ILogger logger, CancellationToken token) { - var packageInfo = await GetPackageInfoAsync(id, version, token); + var packageInfo = await GetPackageInfoAsync(id, version, cacheContext, logger, token); if (packageInfo == null) { return false; @@ -119,18 +141,27 @@ public override async Task CopyNupkgToStreamAsync( packageInfo.Identity, packageInfo.ContentUri, destination, - CacheContext, - Logger, + cacheContext, + logger, token); } - private async Task GetPackageInfoAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + private async Task GetPackageInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfos = await EnsurePackagesAsync(id, cancellationToken); + var packageInfos = await EnsurePackagesAsync(id, cacheContext, logger, cancellationToken); return packageInfos.FirstOrDefault(p => p.Identity.Version == version); } - private Task> EnsurePackagesAsync(string id, CancellationToken cancellationToken) + private Task> EnsurePackagesAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { Task> task; @@ -138,7 +169,7 @@ private Task> EnsurePackagesAsync(string id, Cancellati { if (!_packageVersionsCache.TryGetValue(id, out task)) { - task = FindPackagesByIdAsyncCore(id, cancellationToken); + task = FindPackagesByIdAsyncCore(id, cacheContext, logger, cancellationToken); _packageVersionsCache[id] = task; } } @@ -146,12 +177,16 @@ private Task> EnsurePackagesAsync(string id, Cancellati return task; } - private async Task> FindPackagesByIdAsyncCore(string id, CancellationToken cancellationToken) + private async Task> FindPackagesByIdAsyncCore( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { for (var retry = 0; retry != 3; ++retry) { var uri = _baseUri + "FindPackagesById()?id='" + id + "'"; - var httpSourceCacheContext = HttpSourceCacheContext.Create(CacheContext, retry); + var httpSourceCacheContext = HttpSourceCacheContext.Create(cacheContext, retry); try { @@ -223,7 +258,7 @@ private async Task> FindPackagesByIdAsyncCore(string id return Task.FromResult(true); }, - Logger, + logger, cancellationToken); } @@ -234,13 +269,13 @@ private async Task> FindPackagesByIdAsyncCore(string id string message = string.Format(CultureInfo.CurrentCulture, Strings.Log_RetryingFindPackagesById, nameof(FindPackagesByIdAsyncCore), uri) + Environment.NewLine + ExceptionUtilities.DisplayMessage(ex); - Logger.LogMinimal(message); + logger.LogMinimal(message); } catch (Exception ex) when (retry == 2) { // Fail silently by returning empty result list var message = string.Format(CultureInfo.CurrentCulture, Strings.Log_FailedToRetrievePackage, uri); - Logger.LogError(message + Environment.NewLine + ex.Message); + logger.LogError(message + Environment.NewLine + ex.Message); throw new FatalProtocolException(message, ex); } diff --git a/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV3FindPackageByIdResource.cs b/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV3FindPackageByIdResource.cs index bb1c10dfed8..b42fe2cd0ad 100644 --- a/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV3FindPackageByIdResource.cs +++ b/src/NuGet.Core/NuGet.Protocol.Core.v3/RemoteRepositories/RemoteV3FindPackageByIdResource.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using NuGet.Common; using NuGet.Packaging.Core; using NuGet.Protocol.Core.Types; using NuGet.Versioning; @@ -34,15 +35,24 @@ public RemoteV3FindPackageByIdResource(SourceRepository sourceRepository, HttpSo public SourceRepository SourceRepository { get; } - public override async Task> GetAllVersionsAsync(string id, CancellationToken cancellationToken) + public override async Task> GetAllVersionsAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var result = await EnsurePackagesAsync(id, cancellationToken); + var result = await EnsurePackagesAsync(id, logger, cancellationToken); return result.Select(item => item.Identity.Version); } - public override async Task GetOriginalIdentityAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + public override async Task GetOriginalIdentityAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfo = await GetPackageInfoAsync(id, version, cancellationToken); + var packageInfo = await GetPackageInfoAsync(id, version, logger, cancellationToken); if (packageInfo == null) { return null; @@ -51,9 +61,14 @@ public override async Task GetOriginalIdentityAsync(string id, return packageInfo.Identity; } - public override async Task GetDependencyInfoAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + public override async Task GetDependencyInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfo = await GetPackageInfoAsync(id, version, cancellationToken); + var packageInfo = await GetPackageInfoAsync(id, version, logger, cancellationToken); if (packageInfo == null) { return null; @@ -62,8 +77,8 @@ public override async Task GetDependencyInfoAsync var reader = await _nupkgDownloader.GetNuspecReaderFromNupkgAsync( packageInfo.Identity, packageInfo.ContentUri, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); return GetDependencyInfo(reader); @@ -73,9 +88,11 @@ public override async Task CopyNupkgToStreamAsync( string id, NuGetVersion version, Stream destination, + SourceCacheContext cacheContext, + ILogger logger, CancellationToken cancellationToken) { - var packageInfo = await GetPackageInfoAsync(id, version, cancellationToken); + var packageInfo = await GetPackageInfoAsync(id, version, logger, cancellationToken); if (packageInfo == null) { return false; @@ -85,18 +102,25 @@ public override async Task CopyNupkgToStreamAsync( packageInfo.Identity, packageInfo.ContentUri, destination, - CacheContext, - Logger, + cacheContext, + logger, cancellationToken); } - private async Task GetPackageInfoAsync(string id, NuGetVersion version, CancellationToken cancellationToken) + private async Task GetPackageInfoAsync( + string id, + NuGetVersion version, + ILogger logger, + CancellationToken cancellationToken) { - var packageInfos = await EnsurePackagesAsync(id, cancellationToken); + var packageInfos = await EnsurePackagesAsync(id, logger, cancellationToken); return packageInfos.FirstOrDefault(p => p.Identity.Version == version); } - private Task> EnsurePackagesAsync(string id, CancellationToken cancellationToken) + private Task> EnsurePackagesAsync( + string id, + ILogger logger, + CancellationToken cancellationToken) { Task> task; @@ -104,7 +128,7 @@ private Task> EnsurePackagesAsync(string { if (!_packageVersionsCache.TryGetValue(id, out task)) { - task = FindPackagesByIdAsyncCore(id, cancellationToken); + task = FindPackagesByIdAsyncCore(id, logger, cancellationToken); _packageVersionsCache[id] = task; } } @@ -112,12 +136,15 @@ private Task> EnsurePackagesAsync(string return task; } - private async Task> FindPackagesByIdAsyncCore(string id, CancellationToken cancellationToken) + private async Task> FindPackagesByIdAsyncCore( + string id, + ILogger logger, + CancellationToken cancellationToken) { // This is invoked from inside a lock. await EnsureDependencyProvider(cancellationToken); - return await _dependencyInfoResource.ResolvePackages(id, Logger, cancellationToken); + return await _dependencyInfoResource.ResolvePackages(id, logger, cancellationToken); } private async Task EnsureDependencyProvider(CancellationToken cancellationToken) diff --git a/src/NuGet.Core/NuGet.Protocol.Core.v3/Resources/FindPackageByIdResource.cs b/src/NuGet.Core/NuGet.Protocol.Core.v3/Resources/FindPackageByIdResource.cs index 1960ba3ee1f..9d1a42978f0 100644 --- a/src/NuGet.Core/NuGet.Protocol.Core.v3/Resources/FindPackageByIdResource.cs +++ b/src/NuGet.Core/NuGet.Protocol.Core.v3/Resources/FindPackageByIdResource.cs @@ -14,29 +14,38 @@ namespace NuGet.Protocol.Core.Types { public abstract class FindPackageByIdResource : INuGetResource { - public virtual SourceCacheContext CacheContext { get; set; } - - public virtual ILogger Logger { get; set; } = new NullLogger(); - - public abstract Task> GetAllVersionsAsync(string id, CancellationToken token); + public abstract Task> GetAllVersionsAsync( + string id, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token); /// /// Gets the for a specific package. /// /// The packag id. /// The package version. + /// The source cache context. + /// The logger. /// The . /// /// A that on completion returns a of the /// package, if found, /// null otherwise. /// - public abstract Task GetDependencyInfoAsync(string id, NuGetVersion version, CancellationToken token); + public abstract Task GetDependencyInfoAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token); public abstract Task CopyNupkgToStreamAsync( string id, NuGetVersion version, Stream destination, + SourceCacheContext cacheContext, + ILogger logger, CancellationToken token); /// @@ -46,9 +55,16 @@ public abstract Task CopyNupkgToStreamAsync( /// /// The package ID. This value is case insensitive. /// The version. + /// The source cache context. + /// The logger. /// The cancellation token. /// The package identity, with the ID having the case provided by the package author. - public abstract Task GetOriginalIdentityAsync(string id, NuGetVersion version, CancellationToken token); + public abstract Task GetOriginalIdentityAsync( + string id, + NuGetVersion version, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken token); /// /// Read dependency info from a nuspec. diff --git a/src/NuGet.Core/NuGet.Protocol.Test.Utility/TestSourceCacheContext.cs b/src/NuGet.Core/NuGet.Protocol.Test.Utility/TestSourceCacheContext.cs index 056b63f6430..d6d28ddfd4f 100644 --- a/src/NuGet.Core/NuGet.Protocol.Test.Utility/TestSourceCacheContext.cs +++ b/src/NuGet.Core/NuGet.Protocol.Test.Utility/TestSourceCacheContext.cs @@ -4,7 +4,7 @@ using System; using NuGet.Protocol.Core.Types; -namespace NuGet.Protocol.Test.Utility +namespace NuGet.Protocol.Test { /// /// This is a test source cache context that should be used in places where it is not convenient to dispose the diff --git a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs index ed0f99f5e9d..4062a602c6c 100644 --- a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs +++ b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs @@ -1956,7 +1956,7 @@ public async Task RestoreCommand_RestoreFloatingVersionWithIgnoreFailingLocalSou var cachingSourceProvider = new CachingSourceProvider(new PackageSourceProvider(NullSettings.Instance)); var provider = RestoreCommandProviders.Create(packagesDir, new List(), sources.Select(p => cachingSourceProvider.CreateRepository(p)), context, logger); - var request = new RestoreRequest(spec, provider, logger); + var request = new RestoreRequest(spec, provider, context, logger); request.LockFilePath = Path.Combine(projectDir, "project.lock.json"); @@ -2003,7 +2003,7 @@ public async Task RestoreCommand_RestoreFloatingVersionWithIgnoreFailingHttpSour var cachingSourceProvider = new CachingSourceProvider(new PackageSourceProvider(NullSettings.Instance)); var provider = RestoreCommandProviders.Create(packagesDir, new List(), sources.Select(p => cachingSourceProvider.CreateRepository(p)), context, logger); - var request = new RestoreRequest(spec, provider, logger); + var request = new RestoreRequest(spec, provider, context, logger); request.LockFilePath = Path.Combine(projectDir, "project.lock.json"); diff --git a/test/NuGet.Core.FuncTests/NuGet.Protocol.FuncTest/FindPackageByIdResourceTests.cs b/test/NuGet.Core.FuncTests/NuGet.Protocol.FuncTest/FindPackageByIdResourceTests.cs index d0d69a5a2e3..53fe8076c1e 100644 --- a/test/NuGet.Core.FuncTests/NuGet.Protocol.FuncTest/FindPackageByIdResourceTests.cs +++ b/test/NuGet.Core.FuncTests/NuGet.Protocol.FuncTest/FindPackageByIdResourceTests.cs @@ -21,14 +21,18 @@ public async Task FindPackageByIdResource_NormalizedVersion(string packageSource // Arrange var repo = Repository.Factory.GetCoreV3(packageSource); var findPackageByIdResource = await repo.GetResourceAsync(); + var logger = new TestLogger(); using (var context = new SourceCacheContext()) { context.NoCache = true; - findPackageByIdResource.CacheContext = context; // Act - var packages = await findPackageByIdResource.GetAllVersionsAsync("owin", CancellationToken.None); + var packages = await findPackageByIdResource.GetAllVersionsAsync( + "owin", + context, + logger, + CancellationToken.None); // Assert Assert.Equal(1, packages.Count()); @@ -46,14 +50,18 @@ public async Task FindPackageByIdResource_NoDependencyVersion(string packageSour // Arrange var repo = Repository.Factory.GetCoreV3(packageSource); var findPackageByIdResource = await repo.GetResourceAsync(); + var logger = new TestLogger(); using (var context = new SourceCacheContext()) { context.NoCache = true; - findPackageByIdResource.CacheContext = context; // Act - var packages = await findPackageByIdResource.GetAllVersionsAsync("costura.fody", CancellationToken.None); + var packages = await findPackageByIdResource.GetAllVersionsAsync( + "costura.fody", + context, + logger, + CancellationToken.None); // Assert Assert.Equal(1, packages.Count()); @@ -71,13 +79,18 @@ public async Task FindPackageByIdResource_Basic(string packageSource) // Arrange var repo = Repository.Factory.GetCoreV3(packageSource); var findPackageByIdResource = await repo.GetResourceAsync(); + var logger = new TestLogger(); + using (var context = new SourceCacheContext()) { context.NoCache = true; - findPackageByIdResource.CacheContext = context; // Act - var packages = await findPackageByIdResource.GetAllVersionsAsync("Newtonsoft.json", CancellationToken.None); + var packages = await findPackageByIdResource.GetAllVersionsAsync( + "Newtonsoft.json", + context, + logger, + CancellationToken.None); // Assert Assert.Equal(1, packages.Count()); @@ -97,14 +110,18 @@ public async Task FindPackageByIdResource_Credential(string packageSource, strin source.Credentials = sourceCredential; var repo = Repository.Factory.GetCoreV2(source); var findPackageByIdResource = await repo.GetResourceAsync(); + var logger = new TestLogger(); using (var context = new SourceCacheContext()) { context.NoCache = true; - findPackageByIdResource.CacheContext = context; // Act - var packages = await findPackageByIdResource.GetAllVersionsAsync("Newtonsoft.json", CancellationToken.None); + var packages = await findPackageByIdResource.GetAllVersionsAsync( + "Newtonsoft.json", + context, + logger, + CancellationToken.None); // Assert Assert.Equal(1, packages.Count()); @@ -124,13 +141,18 @@ public async Task FindPackageByIdResource_CredentialNoDependencyVersion(string p source.Credentials = sourceCredential; var repo = Repository.Factory.GetCoreV2(source); var findPackageByIdResource = await repo.GetResourceAsync(); + var logger = new TestLogger(); + using (var context = new SourceCacheContext()) { context.NoCache = true; - findPackageByIdResource.CacheContext = context; // Act - var packages = await findPackageByIdResource.GetAllVersionsAsync("costura.fody", CancellationToken.None); + var packages = await findPackageByIdResource.GetAllVersionsAsync( + "costura.fody", + context, + logger, + CancellationToken.None); // Assert Assert.Equal(1, packages.Count()); @@ -150,13 +172,18 @@ public async Task FindPackageByIdResource_CredentialNormalizedVersion(string pac source.Credentials = sourceCredential; var repo = Repository.Factory.GetCoreV2(source); var findPackageByIdResource = await repo.GetResourceAsync(); + var logger = new TestLogger(); + using (var context = new SourceCacheContext()) { context.NoCache = true; - findPackageByIdResource.CacheContext = context; // Act - var packages = await findPackageByIdResource.GetAllVersionsAsync("owin", CancellationToken.None); + var packages = await findPackageByIdResource.GetAllVersionsAsync( + "owin", + context, + logger, + CancellationToken.None); // Assert Assert.Equal(1, packages.Count()); diff --git a/test/NuGet.Core.Tests/NuGet.Commands.Test.Utility/TestRestoreRequest.cs b/test/NuGet.Core.Tests/NuGet.Commands.Test.Utility/TestRestoreRequest.cs index b04ad58a592..89cd264a446 100644 --- a/test/NuGet.Core.Tests/NuGet.Commands.Test.Utility/TestRestoreRequest.cs +++ b/test/NuGet.Core.Tests/NuGet.Commands.Test.Utility/TestRestoreRequest.cs @@ -8,7 +8,7 @@ using NuGet.ProjectModel; using NuGet.Protocol; using NuGet.Protocol.Core.Types; -using NuGet.Protocol.Test.Utility; +using NuGet.Protocol.Test; namespace NuGet.Commands.Test { @@ -106,6 +106,7 @@ public TestRestoreRequest( sources: sources, cacheContext: cacheContext, log: log), + cacheContext, log) { } diff --git a/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommand/OriginalCaseGlobalPackagesFolderTests.cs b/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommand/OriginalCaseGlobalPackagesFolderTests.cs index 863300b5c1c..67ab688cef0 100644 --- a/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommand/OriginalCaseGlobalPackagesFolderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Commands.Test/RestoreCommand/OriginalCaseGlobalPackagesFolderTests.cs @@ -7,13 +7,16 @@ using System.Threading.Tasks; using Moq; using Newtonsoft.Json.Linq; +using NuGet.Common; using NuGet.Configuration; using NuGet.DependencyResolver; +using NuGet.DependencyResolver.Tests; using NuGet.Frameworks; using NuGet.LibraryModel; using NuGet.Packaging; using NuGet.Packaging.Core; using NuGet.ProjectModel; +using NuGet.Protocol.Core.Types; using NuGet.Test.Utility; using NuGet.Versioning; using Xunit; @@ -293,14 +296,17 @@ private static RestoreTargetGraph GetRestoreTargetGraph(PackageIdentity identity .Setup(x => x.CopyToAsync( It.IsAny(), It.IsAny(), + It.IsAny(), + It.IsAny(), It.IsAny())) - .Callback((_, destination, __) => - { - using (var package = File.OpenRead(packagePath.FullName)) + .Callback( + (_, destination, __, ___, ____) => { - package.CopyTo(destination); - } - }) + using (var package = File.OpenRead(packagePath.FullName)) + { + package.CopyTo(destination); + } + }) .Returns(Task.CompletedTask); var graph = RestoreTargetGraph.Create( @@ -321,7 +327,7 @@ private static RestoreTargetGraph GetRestoreTargetGraph(PackageIdentity identity } } }, - new RemoteWalkContext(), + new TestRemoteWalkContext(), logger, FrameworkConstants.CommonFrameworks.NetStandard16); diff --git a/test/NuGet.Core.Tests/NuGet.Commands.Test/project.json b/test/NuGet.Core.Tests/NuGet.Commands.Test/project.json index fb752abf74c..62d886cea0b 100644 --- a/test/NuGet.Core.Tests/NuGet.Commands.Test/project.json +++ b/test/NuGet.Core.Tests/NuGet.Commands.Test/project.json @@ -10,6 +10,9 @@ "NuGet.Commands.Test.Utility": { "target": "project" }, + "NuGet.DependencyResolver.Core.Tests.Utility": { + "target": "project" + }, "xunit": "2.1.0" }, "frameworks": { diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/NuGet.DependencyResolver.Core.Tests.Utility.xproj b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/NuGet.DependencyResolver.Core.Tests.Utility.xproj new file mode 100644 index 00000000000..c851c5dc3b2 --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/NuGet.DependencyResolver.Core.Tests.Utility.xproj @@ -0,0 +1,19 @@ + + + + 14.0.25420 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 23c35c81-55e5-4e21-9e67-ccdee901072b + NuGet.DependencyResolver.Core.Tests.Utility + .\obj + .\bin\ + + + + 2.0 + + + \ No newline at end of file diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/TestRestoreWalkContext.cs b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/TestRestoreWalkContext.cs new file mode 100644 index 00000000000..4b9c03b7bd9 --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/TestRestoreWalkContext.cs @@ -0,0 +1,15 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using NuGet.Common; +using NuGet.Protocol.Test; + +namespace NuGet.DependencyResolver.Tests +{ + public class TestRemoteWalkContext : RemoteWalkContext + { + public TestRemoteWalkContext() : base(new TestSourceCacheContext(), NullLogger.Instance) + { + } + } +} diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/project.json b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/project.json new file mode 100644 index 00000000000..f3df72e651a --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests.Utility/project.json @@ -0,0 +1,48 @@ +{ + "version": "1.0.0-*", + "copyright": "Copyright .NET Foundation. All rights reserved.", + "packOptions": { + "licenseUrl": "https://raw.githubusercontent.com/NuGet/NuGet.Client/dev/LICENSE.txt", + "projectUrl": "https://github.com/NuGet/NuGet.Client" + }, + "buildOptions": { + "warningsAsErrors": true, + "xmlDoc": true, + "nowarn": [ + "CS1591" + ], + "compile": { + "include": [ + "../../../Shared/*.cs" + ] + } + }, + "dependencies": { + "NuGet.DependencyResolver.Core": { + "target": "project" + }, + "NuGet.Protocol.Test.Utility": { + "target": "project" + } + }, + "frameworks": { + "net46": { + "dependencies": {}, + "buildOptions": { + "define": [ + "IS_DESKTOP" + ] + } + }, + "netstandard1.3": { + "dependencies": { + "NETStandard.Library": "1.6.0" + }, + "buildOptions": { + "define": [ + "IS_CORECLR" + ] + } + } + } +} diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/ResolverFacts.cs b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/ResolverFacts.cs index bcb170a792a..718115ed0a9 100644 --- a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/ResolverFacts.cs +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/ResolverFacts.cs @@ -4,8 +4,11 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using NuGet.Common; +using NuGet.DependencyResolver.Tests; using NuGet.Frameworks; using NuGet.LibraryModel; +using NuGet.Protocol.Core.Types; using NuGet.Versioning; using Xunit; @@ -31,7 +34,7 @@ public async Task FasterProviderReturnsResultsBeforeSlowOnesIfExactMatchFound() Version = new NuGetVersion("1.0.0") }); - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); context.RemoteLibraryProviders.Add(slowProvider); context.RemoteLibraryProviders.Add(fastProvider); @@ -71,7 +74,7 @@ public async Task SlowerFeedWinsIfBetterMatchExists() Version = new NuGetVersion("1.1.0") }); - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); context.RemoteLibraryProviders.Add(slowProvider); context.RemoteLibraryProviders.Add(fastProvider); @@ -110,12 +113,22 @@ public void AddLibrary(LibraryIdentity identity) public bool IsHttp => true; - public Task CopyToAsync(LibraryIdentity match, Stream stream, CancellationToken cancellationToken) + public Task CopyToAsync( + LibraryIdentity match, + Stream stream, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { throw new NotImplementedException(); } - public async Task FindLibraryAsync(LibraryRange libraryRange, NuGetFramework targetFramework, CancellationToken cancellationToken) + public async Task FindLibraryAsync( + LibraryRange libraryRange, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { if (_delay != TimeSpan.Zero) { @@ -125,7 +138,12 @@ public async Task FindLibraryAsync(LibraryRange libraryRange, N return _libraries.FindBestMatch(libraryRange.VersionRange, l => l?.Version); } - public Task> GetDependenciesAsync(LibraryIdentity match, NuGetFramework targetFramework, CancellationToken cancellationToken) + public Task> GetDependenciesAsync( + LibraryIdentity match, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { return Task.FromResult(Enumerable.Empty()); } diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/project.json b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/project.json index 15288759018..5a56f93192c 100644 --- a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/project.json +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Core.Tests/project.json @@ -4,6 +4,15 @@ "NuGet.DependencyResolver.Core": { "target": "project" }, + "NuGet.DependencyResolver.Core.Tests.Utility": { + "target": "project" + }, + "NuGet.Protocol.Test.Utility": { + "target": "project" + }, + "NuGet.Test.Utility": { + "target": "project" + }, "xunit": "2.1.0" }, "frameworks": { diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/RemoteDependencyWalkerTests.cs b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/RemoteDependencyWalkerTests.cs index d208e91e7d7..23286bd6d49 100644 --- a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/RemoteDependencyWalkerTests.cs +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/RemoteDependencyWalkerTests.cs @@ -4,8 +4,10 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using NuGet.Common; using NuGet.Frameworks; using NuGet.LibraryModel; +using NuGet.Protocol.Core.Types; using NuGet.Versioning; using Xunit; @@ -16,7 +18,7 @@ public class RemoteDependencyWalkerTests [Fact] public async Task AllowPreleaseVersionNoConflict() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0-beta") .DependsOn("B", "1.0") @@ -44,7 +46,7 @@ public async Task AllowPreleaseVersionNoConflict() [Fact] public async Task CyclesAreDetected() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0"); @@ -68,7 +70,7 @@ public async Task CyclesAreDetected() [Fact] public async Task CyclesAreDetectedIf2VersionsOfTheSamePackageId() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0"); @@ -92,7 +94,7 @@ public async Task CyclesAreDetectedIf2VersionsOfTheSamePackageId() [Fact] public async Task DeepCycleCheck() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0"); @@ -124,7 +126,7 @@ public async Task DeepCycleCheck() [Fact] public async Task DependencyRangesButNoConflict() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -157,7 +159,7 @@ public async Task DependencyRangesButNoConflict() [Fact] public async Task SingleConflict() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -191,7 +193,7 @@ public async Task SingleConflict() [Fact] public async Task SingleConflictWhereConflictingDependenyIsUnresolved() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -224,7 +226,7 @@ public async Task SingleConflictWhereConflictingDependenyIsUnresolved() [Fact] public async Task StrictDependenciesButNoConflict() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -251,7 +253,7 @@ public async Task StrictDependenciesButNoConflict() [Fact] public async Task ConflictAtDifferentLevel() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -295,7 +297,7 @@ public async Task ConflictAtDifferentLevel() [Fact] public async Task TryResolveConflicts_ThrowsIfPackageConstraintCannotBeResolved() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("Root", "1.0") .DependsOn("A", "1.0") @@ -329,7 +331,7 @@ public async Task TryResolveConflicts_ThrowsIfPackageConstraintCannotBeResolved( [Fact] public async Task TryResolveConflicts_WorksWhenVersionRangeIsNotSpecified() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("Root", "1.0") .DependsOn("A", "1.0") @@ -368,7 +370,7 @@ public async Task TryResolveConflicts_WorksWhenVersionRangeIsNotSpecified() [Fact] public async Task NearestWinsOverridesStrictDependency() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -398,7 +400,7 @@ public async Task NearestWinsOverridesStrictDependency() [Fact] public async Task NearestWinsOverridesStrictDependencyButDowngradeWarns() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -433,7 +435,7 @@ public async Task NearestWinsOverridesStrictDependencyButDowngradeWarns() [Fact] public async Task DowngradeSkippedIfEqual() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -456,7 +458,7 @@ public async Task DowngradeSkippedIfEqual() [Fact] public async Task DowngradeAtRootIsDetected() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -485,7 +487,7 @@ public async Task DowngradeAtRootIsDetected() [Fact] public async Task DowngradeNotAtRootIsDetected() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0"); @@ -516,7 +518,7 @@ public async Task DowngradeNotAtRootIsDetected() [Fact] public async Task DowngradeOverddienByCousinCheck() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "1.0") @@ -548,7 +550,7 @@ public async Task DowngradeOverddienByCousinCheck() [Fact] public async Task PotentialDowngradeThenUpgrade() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "1.2") @@ -579,7 +581,7 @@ public async Task PotentialDowngradeThenUpgrade() [Fact] public async Task DowngradeThenUpgradeThenDowngrade() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "1.0") @@ -613,7 +615,7 @@ public async Task DowngradeThenUpgradeThenDowngrade() [Fact] public async Task UpgradeThenDowngradeThenEqual() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "2.0") @@ -642,7 +644,7 @@ public async Task UpgradeThenDowngradeThenEqual() [Fact] public async Task DoubleDowngrade() { - var context = new RemoteWalkContext(); + var context = new TestRemoteWalkContext(); var provider = new DependencyProvider(); provider.Package("A", "1.0") .DependsOn("B", "0.7") @@ -823,19 +825,34 @@ public bool IsHttp } } - public Task CopyToAsync(LibraryIdentity match, Stream stream, CancellationToken cancellationToken) + public Task CopyToAsync( + LibraryIdentity match, + Stream stream, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { throw new NotImplementedException(); } - public Task FindLibraryAsync(LibraryRange libraryRange, NuGetFramework targetFramework, CancellationToken cancellationToken) + public Task FindLibraryAsync( + LibraryRange libraryRange, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { var packages = _graph.Keys.Where(p => p.Name == libraryRange.Name); return Task.FromResult(packages.FindBestMatch(libraryRange.VersionRange, i => i?.Version)); } - public Task> GetDependenciesAsync(LibraryIdentity match, NuGetFramework targetFramework, CancellationToken cancellationToken) + public Task> GetDependenciesAsync( + LibraryIdentity match, + NuGetFramework targetFramework, + SourceCacheContext cacheContext, + ILogger logger, + CancellationToken cancellationToken) { List dependencies; if (_graph.TryGetValue(match, out dependencies)) diff --git a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/project.json b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/project.json index 8033608c81f..b1963d3b3f1 100644 --- a/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/project.json +++ b/test/NuGet.Core.Tests/NuGet.DependencyResolver.Tests/project.json @@ -4,6 +4,9 @@ "NuGet.DependencyResolver": { "target": "project" }, + "NuGet.DependencyResolver.Core.Tests.Utility": { + "target": "project" + }, "xunit": "2.1.0" }, "frameworks": { diff --git a/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/InstallationCompatibilityTests.cs b/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/InstallationCompatibilityTests.cs index 6e0ab477f46..9dc10007eb4 100644 --- a/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/InstallationCompatibilityTests.cs +++ b/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/InstallationCompatibilityTests.cs @@ -9,6 +9,7 @@ using NuGet.Common; using NuGet.Configuration; using NuGet.DependencyResolver; +using NuGet.DependencyResolver.Tests; using NuGet.Frameworks; using NuGet.LibraryModel; using NuGet.Packaging; @@ -435,7 +436,7 @@ public RestoreResult GetRestoreResult(IEnumerable identities) var graph = RestoreTargetGraph.Create( new[] { node }, - new RemoteWalkContext(), + new TestRemoteWalkContext(), NullLogger.Instance, FrameworkConstants.CommonFrameworks.NetStandard10); diff --git a/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/project.json b/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/project.json index 762c5017805..d81fe79e261 100644 --- a/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/project.json +++ b/test/NuGet.Core.Tests/NuGet.PackageManagement.Test/project.json @@ -8,6 +8,9 @@ "Test.Utility": { "target": "project" }, + "NuGet.DependencyResolver.Core.Tests.Utility": { + "target": "project" + }, "xunit": "2.1.0" }, "frameworks": { diff --git a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/HttpFileSystemBasedFindPackageByIdResourceTests.cs b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/HttpFileSystemBasedFindPackageByIdResourceTests.cs index 0ed137edcd1..cc1b2deaafd 100644 --- a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/HttpFileSystemBasedFindPackageByIdResourceTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/HttpFileSystemBasedFindPackageByIdResourceTests.cs @@ -5,7 +5,6 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using NuGet.Common; using NuGet.Protocol.Core.Types; using NuGet.Test.Utility; using NuGet.Versioning; @@ -52,16 +51,18 @@ public async Task HttpFileSystemBasedFindPackageById_GetOriginalIdentity() }; var repo = StaticHttpHandler.CreateSource(source, Repository.Provider.GetCoreV3(), responses); + var logger = new TestLogger(); + using (var cacheContext = new SourceCacheContext()) { var resource = await repo.GetResourceAsync(); - resource.Logger = NullLogger.Instance; - resource.CacheContext = cacheContext; // Act var identity = await resource.GetOriginalIdentityAsync( "DEEPEQUAL", new NuGetVersion("1.4.0.1-RC"), + cacheContext, + logger, CancellationToken.None); // Assert diff --git a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/LocalResourceTests/FindPackageByIdResourceTests.cs b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/LocalResourceTests/FindPackageByIdResourceTests.cs index 30c7ba136bb..139a3a62ab1 100644 --- a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/LocalResourceTests/FindPackageByIdResourceTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/LocalResourceTests/FindPackageByIdResourceTests.cs @@ -35,25 +35,35 @@ public async Task FindPackageByIdResource_V2V3Compare() var resourceV2 = new LocalV2FindPackageByIdResource(new PackageSource(rootV2)); var resourceV3 = new LocalV3FindPackageByIdResource(new PackageSource(rootV3)); - - resourceV2.Logger = testLogger; - resourceV3.Logger = testLogger; - using (var cacheContext1 = new SourceCacheContext()) - using (var cacheContext2 = new SourceCacheContext()) + + using (var cacheContext = new SourceCacheContext()) { - resourceV2.CacheContext = cacheContext1; - resourceV3.CacheContext = cacheContext2; - var bNonNorm = new PackageIdentity("B", NuGetVersion.Parse("1.0")); // Act - var versionsV2 = new HashSet(await resourceV2.GetAllVersionsAsync("A", CancellationToken.None)); - var versionsV3 = new HashSet(await resourceV3.GetAllVersionsAsync("A", CancellationToken.None)); + var versionsV2 = new HashSet(await resourceV2.GetAllVersionsAsync( + "A", + cacheContext, + testLogger, + CancellationToken.None)); - var emptyV2 = (await resourceV2.GetAllVersionsAsync("c", CancellationToken.None)) + var versionsV3 = new HashSet(await resourceV3.GetAllVersionsAsync( + "A", + cacheContext, + testLogger, + CancellationToken.None)); + + var emptyV2 = (await resourceV2.GetAllVersionsAsync( + "c", + cacheContext, + testLogger, + CancellationToken.None)) .ToList(); - var emptyV3 = (await resourceV3.GetAllVersionsAsync("c", CancellationToken.None)) + var emptyV3 = (await resourceV3.GetAllVersionsAsync("c", + cacheContext, + testLogger, + CancellationToken.None)) .ToList(); var v2Stream = new MemoryStream(); @@ -61,6 +71,8 @@ await resourceV2.CopyNupkgToStreamAsync( bNonNorm.Id, bNonNorm.Version, v2Stream, + cacheContext, + testLogger, CancellationToken.None); var v3Stream = new MemoryStream(); @@ -68,13 +80,37 @@ await resourceV3.CopyNupkgToStreamAsync( bNonNorm.Id, bNonNorm.Version, v3Stream, + cacheContext, + testLogger, CancellationToken.None); - var depV2 = await resourceV2.GetDependencyInfoAsync(bNonNorm.Id, bNonNorm.Version, CancellationToken.None); - var depV3 = await resourceV3.GetDependencyInfoAsync(bNonNorm.Id, bNonNorm.Version, CancellationToken.None); + var depV2 = await resourceV2.GetDependencyInfoAsync( + bNonNorm.Id, + bNonNorm.Version, + cacheContext, + testLogger, + CancellationToken.None); - var depEmptyV2 = await resourceV2.GetDependencyInfoAsync(bNonNorm.Id, NuGetVersion.Parse("2.9"), CancellationToken.None); - var depEmptyV3 = await resourceV3.GetDependencyInfoAsync(bNonNorm.Id, NuGetVersion.Parse("2.9"), CancellationToken.None); + var depV3 = await resourceV3.GetDependencyInfoAsync( + bNonNorm.Id, + bNonNorm.Version, + cacheContext, + testLogger, + CancellationToken.None); + + var depEmptyV2 = await resourceV2.GetDependencyInfoAsync( + bNonNorm.Id, + NuGetVersion.Parse("2.9"), + cacheContext, + testLogger, + CancellationToken.None); + + var depEmptyV3 = await resourceV3.GetDependencyInfoAsync( + bNonNorm.Id, + NuGetVersion.Parse("2.9"), + cacheContext, + testLogger, + CancellationToken.None); // Assert Assert.True(versionsV2.SetEquals(versionsV3)); diff --git a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV2FindPackageByIdResourceTests.cs b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV2FindPackageByIdResourceTests.cs index d307d02ad96..40326c5d36b 100644 --- a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV2FindPackageByIdResourceTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV2FindPackageByIdResourceTests.cs @@ -28,15 +28,18 @@ public async Task RemoteV2FindPackageById_VerifyNoErrorsOnNoContent() responses.Add(serviceAddress + "FindPackagesById()?id='a'", "204"); var repo = StaticHttpHandler.CreateSource(serviceAddress, Repository.Provider.GetCoreV3(), responses); + var logger = new TestLogger(); using (var cacheContext = new SourceCacheContext()) { var resource = await repo.GetResourceAsync(); - resource.Logger = NullLogger.Instance; - resource.CacheContext = cacheContext; // Act - var versions = await resource.GetAllVersionsAsync("a", CancellationToken.None); + var versions = await resource.GetAllVersionsAsync( + "a", + cacheContext, + logger, + CancellationToken.None); // Assert // Verify no items returned, and no exceptions were thrown above @@ -80,17 +83,18 @@ public async Task RemoteV2FindPackageById_GetOriginalIdentity_IdInResponse() }; var repo = StaticHttpHandler.CreateSource(serviceAddress, Repository.Provider.GetCoreV3(), responses); + var logger = new TestLogger(); using (var cacheContext = new SourceCacheContext()) { var resource = await repo.GetResourceAsync(); - resource.Logger = NullLogger.Instance; - resource.CacheContext = cacheContext; // Act var identity = await resource.GetOriginalIdentityAsync( "XUNIT", new NuGetVersion("2.2.0-BETA1-build3239"), + cacheContext, + logger, CancellationToken.None); // Assert @@ -137,17 +141,18 @@ public async Task RemoteV2FindPackageById_GetOriginalIdentity_IdNotInResponse() }; var repo = StaticHttpHandler.CreateSource(serviceAddress, Repository.Provider.GetCoreV3(), responses); + var logger = new TestLogger(); using (var cacheContext = new SourceCacheContext()) { var resource = await repo.GetResourceAsync(); - resource.Logger = NullLogger.Instance; - resource.CacheContext = cacheContext; // Act var identity = await resource.GetOriginalIdentityAsync( "WINDOWSAZURE.STORAGE", new NuGetVersion("6.2.2-PREVIEW"), + cacheContext, + logger, CancellationToken.None); // Assert diff --git a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV3FindPackageByIdResourceTests.cs b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV3FindPackageByIdResourceTests.cs index e0ae3dc4497..419cb841079 100644 --- a/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV3FindPackageByIdResourceTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Protocol.Core.v3.Tests/RemoteV3FindPackageByIdResourceTests.cs @@ -2,6 +2,7 @@ using System.Threading; using System.Threading.Tasks; using NuGet.Protocol.Core.Types; +using NuGet.Test.Utility; using NuGet.Versioning; using Test.Utility; using Xunit; @@ -19,18 +20,24 @@ public async Task RemoteV3FindPackageById_GetOriginalIdentity_IdInResponse() responses.Add("https://api.nuget.org/v3/registration0/deepequal/index.json", JsonData.DeepEqualRegistationIndex); var repo = StaticHttpHandler.CreateSource("http://testsource.com/v3/index.json", Repository.Provider.GetCoreV3(), responses); + var logger = new TestLogger(); - // Act - var resource = await repo.GetResourceAsync(); - var identity = await resource.GetOriginalIdentityAsync( - "DEEPEQUAL", - new NuGetVersion("1.4.0.1-RC"), - CancellationToken.None); + using (var cacheContext = new SourceCacheContext()) + { + // Act + var resource = await repo.GetResourceAsync(); + var identity = await resource.GetOriginalIdentityAsync( + "DEEPEQUAL", + new NuGetVersion("1.4.0.1-RC"), + cacheContext, + logger, + CancellationToken.None); - // Assert - Assert.IsType(resource); - Assert.Equal("DeepEqual", identity.Id); - Assert.Equal("1.4.0.1-rc", identity.Version.ToNormalizedString()); + // Assert + Assert.IsType(resource); + Assert.Equal("DeepEqual", identity.Id); + Assert.Equal("1.4.0.1-rc", identity.Version.ToNormalizedString()); + } } } }