Skip to content

Commit 398128e

Browse files
authored
Initialize resource when GetInstalledVersions is called first (#7245)
1 parent 4de61f2 commit 398128e

2 files changed

Lines changed: 57 additions & 8 deletions

File tree

src/NuGet.Core/NuGet.Commands/RestoreCommand/SourceRepositoryDependencyProvider.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -361,13 +361,13 @@ private async Task<LibraryDependencyInfo> GetDependenciesCoreAsync(
361361
FindPackageByIdDependencyInfo packageInfo = null;
362362
try
363363
{
364-
await EnsureResource(cancellationToken);
365-
366364
if (_throttle != null)
367365
{
368366
await _throttle.WaitAsync(cancellationToken);
369367
}
370368

369+
await EnsureResource(cancellationToken);
370+
371371
// Read package info, this will download the package if needed.
372372
packageInfo = await _findPackagesByIdResource.GetDependencyInfoAsync(
373373
match.Name,
@@ -459,13 +459,13 @@ public async Task<IPackageDownloader> GetPackageDownloaderAsync(
459459

460460
try
461461
{
462-
await EnsureResource(cancellationToken);
463-
464462
if (_throttle != null)
465463
{
466464
await _throttle.WaitAsync(cancellationToken);
467465
}
468466

467+
await EnsureResource(cancellationToken);
468+
469469
cancellationToken.ThrowIfCancellationRequested();
470470

471471
var packageDownloader = await _findPackagesByIdResource.GetPackageDownloaderAsync(
@@ -634,10 +634,9 @@ internal async Task<IEnumerable<NuGetVersion>> GetAllVersionsInternalAsync(
634634
{
635635
await _throttle.WaitAsync(cancellationToken);
636636
}
637-
if (_findPackagesByIdResource == null)
638-
{
639-
return null;
640-
}
637+
638+
await EnsureResource(cancellationToken);
639+
641640
return await _findPackagesByIdResource.GetAllVersionsAsync(
642641
id,
643642
cacheContext,

test/NuGet.Core.Tests/NuGet.Commands.Test/SourceRepositoryDependencyProviderTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,56 @@ public async Task GetPackageDownloaderAsync_ReturnsPackageDownloader()
661661
}
662662
}
663663

664+
[Fact]
665+
public async Task GetAllVersionsAsync_EnsuresResourceIsInitialized_ReturnsVersions()
666+
{
667+
// Arrange
668+
// This test verifies that GetAllVersionsAsync properly calls EnsureResource
669+
// to initialize _findPackagesByIdResource. Previously, EnsureResource was not called
670+
// and GetAllVersionsInternalAsync would see _findPackagesByIdResource as null,
671+
// silently returning null instead of the actual versions.
672+
var testLogger = new TestLogger();
673+
var cacheContext = new SourceCacheContext();
674+
var expectedVersions = new[] { NuGetVersion.Parse("1.0.0"), NuGetVersion.Parse("2.0.0") };
675+
676+
var findResource = new Mock<FindPackageByIdResource>();
677+
findResource.Setup(s => s.GetAllVersionsAsync(
678+
It.IsAny<string>(),
679+
It.IsAny<SourceCacheContext>(),
680+
It.IsAny<ILogger>(),
681+
It.IsAny<CancellationToken>()))
682+
.ReturnsAsync(expectedVersions);
683+
684+
var source = new Mock<SourceRepository>();
685+
source.Setup(s => s.GetResourceAsync<FindPackageByIdResource>(CancellationToken.None))
686+
.ReturnsAsync(findResource.Object);
687+
source.SetupGet(s => s.PackageSource)
688+
.Returns(new PackageSource("http://test/index.json"));
689+
690+
var provider = new SourceRepositoryDependencyProvider(
691+
source.Object,
692+
testLogger,
693+
cacheContext,
694+
ignoreFailedSources: true,
695+
ignoreWarning: true);
696+
697+
// Act
698+
var versions = await provider.GetAllVersionsAsync(
699+
"x",
700+
cacheContext,
701+
testLogger,
702+
CancellationToken.None);
703+
704+
// Assert
705+
versions.Should().BeEquivalentTo(expectedVersions);
706+
source.Verify(s => s.GetResourceAsync<FindPackageByIdResource>(CancellationToken.None), Times.Once);
707+
findResource.Verify(s => s.GetAllVersionsAsync(
708+
"x",
709+
It.IsAny<SourceCacheContext>(),
710+
It.IsAny<ILogger>(),
711+
It.IsAny<CancellationToken>()), Times.Once);
712+
}
713+
664714
[Fact]
665715
public async Task FindLibraryAsync_WhenASourceIsInaccessible_AndFailuresAreNotIgnored_EveryCallLogsAnErrorMessage()
666716
{

0 commit comments

Comments
 (0)