Skip to content

Commit 082bcae

Browse files
michaelnebelCopilot
andcommitted
C#: Test NuGet CLI restore feed selection
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent d6a6f51 commit 082bcae

1 file changed

Lines changed: 107 additions & 0 deletions

File tree

‎csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs‎

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,113 @@ public void TestFeedsToUse()
248248
], feedsToUse);
249249
}
250250

251+
/// <summary>
252+
/// Verify that NuGet CLI restore excludes private registries and unreachable feeds,
253+
/// while leaving private registries available to dotnet restore.
254+
/// </summary>
255+
[Fact]
256+
public void TestNugetExeRestoreFeedsExcludePrivateRegistries()
257+
{
258+
// Setup
259+
var logger = new LoggerStub();
260+
var dotnet = new DotNetStub([], [], [],
261+
["E https://example.com/registry2", "E https://feed.from/folder1", "E https://feed.from/folder2"]);
262+
using var feedManager = new FeedManager(logger, dotnet, new RegistryProxyStub(),
263+
new FileProviderStub(), new FeedManagerIOStub(["https://feed.from/folder2"]));
264+
265+
// Execute
266+
var feeds = feedManager.MakeNugetExeRestoreFeeds("/path/to/packages.config");
267+
var dotnetFeeds = feedManager.MakeRestoreFeeds("/path/to/project.csproj");
268+
269+
// Verify
270+
Assert.Equal(["https://feed.from/folder1"], feeds);
271+
Assert.Contains("https://example.com/registry2", dotnetFeeds);
272+
}
273+
274+
/// <summary>
275+
/// Verify that NuGet CLI restore excludes private registries that replace NuGet.org,
276+
/// retaining other configured feeds.
277+
/// </summary>
278+
[Fact]
279+
public void TestNugetExeRestoreFeedsExcludePrivateBaseRegistries()
280+
{
281+
// Setup
282+
var logger = new LoggerStub();
283+
var dotnet = new DotNetStub([], [], [],
284+
["E https://api.nuget.org/v3/index.json", "E https://feed.from/folder1"]);
285+
using var feedManager = new FeedManager(logger, dotnet, new RegistryProxyStubWithBaseUrls(),
286+
new FileProviderStub(), new FeedManagerIOStub([]));
287+
288+
// Execute
289+
var feeds = feedManager.MakeNugetExeRestoreFeeds("/path/to/packages.config");
290+
291+
// Verify
292+
Assert.Equal(["https://feed.from/folder1"], feeds);
293+
}
294+
295+
/// <summary>
296+
/// Verify that NuGet CLI restore uses an empty local source when only private registries are configured,
297+
/// regardless of their reachability.
298+
/// </summary>
299+
[Theory]
300+
[InlineData(false)]
301+
[InlineData(true)]
302+
public void TestNugetExeRestoreFeedsWithOnlyPrivateRegistries(bool unreachable)
303+
{
304+
// Setup
305+
var logger = new LoggerStub();
306+
var registryProxy = new RegistryProxyStubWithBaseUrls();
307+
var dotnet = new DotNetStub([], [], [], ["E https://api.nuget.org/v3/index.json"]);
308+
using var feedManager = new FeedManager(logger, dotnet, registryProxy,
309+
new FileProviderStub(), new FeedManagerIOStub(unreachable ? registryProxy.RegistryURLs.ToList() : []));
310+
311+
// Execute
312+
var feeds = feedManager.MakeNugetExeRestoreFeeds("/path/to/packages.config");
313+
314+
// Verify
315+
var source = Assert.Single(feeds);
316+
Assert.True(Path.IsPathFullyQualified(source));
317+
Assert.True(Directory.Exists(source));
318+
}
319+
320+
/// <summary>
321+
/// Verify that NuGet CLI restore explicitly selects reachable feeds when no private registries are configured.
322+
/// </summary>
323+
[Fact]
324+
public void TestNugetExeRestoreFeedsWithoutPrivateRegistries()
325+
{
326+
// Setup
327+
var logger = new LoggerStub();
328+
var dotnet = new DotNetStub([], [], [], ["E https://feed.from/folder1"]);
329+
using var feedManager = new FeedManager(logger, dotnet, null,
330+
new FileProviderStub(), new FeedManagerIOStub([]));
331+
332+
// Execute
333+
var feeds = feedManager.MakeNugetExeRestoreFeeds("/path/to/packages.config");
334+
335+
// Verify
336+
Assert.Equal(["https://feed.from/folder1"], feeds);
337+
}
338+
339+
/// <summary>
340+
/// Verify that NuGet CLI restore falls back to the default NuGet.org feed when no feeds are configured.
341+
/// </summary>
342+
[Fact]
343+
public void TestNugetExeRestoreFeedsUseDefaults()
344+
{
345+
// Setup
346+
var logger = new LoggerStub();
347+
var dotnet = new DotNetStub([], [], [], []);
348+
using var feedManager = new FeedManager(logger, dotnet, null,
349+
new FileProviderStub(), new FeedManagerIOStub([]));
350+
351+
// Execute
352+
var feeds = feedManager.MakeNugetExeRestoreFeeds("/path/to/packages.config");
353+
354+
// Verify
355+
Assert.Equal(["https://api.nuget.org/v3/index.json"], feeds);
356+
}
357+
251358
/// <summary>
252359
/// Verify that `FeedManager` correctly computes the default feeds and reachable default feeds
253360
/// when no private registries are configured.

0 commit comments

Comments
 (0)