Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/UnityNuGet.Tests/RegistryCacheTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void GetNpmVersion(string version, string expected)
Assert.That(RegistryCache.GetNpmVersion(NuGetVersion.Parse(version)), Is.EqualTo(expected));
}

[Test]
[Test, Order(99)]
public async Task TestBuild()
{
bool errorsTriggered = false;
Expand Down
150 changes: 44 additions & 106 deletions src/UnityNuGet.Tests/RegistryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace UnityNuGet.Tests
{
public class RegistryTests
{
private readonly RegistryOptions _registryOptions = new() { RegistryFilePath = "registry.json" };
private static readonly RegistryOptions s_registryOptions = new() { RegistryFilePath = "registry.json" };

[Test]
[TestCase("scriban")]
Expand All @@ -37,7 +37,7 @@ public async Task Make_Sure_That_The_Registry_Is_Case_Insensitive(string package
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new FakeLoggerProvider());

var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(_registryOptions));
var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(s_registryOptions));

await registry.StartAsync(CancellationToken.None);

Expand All @@ -57,7 +57,7 @@ public async Task Make_Sure_That_The_Order_In_The_Registry_Is_Respected()
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new FakeLoggerProvider());

var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(_registryOptions));
var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(s_registryOptions));

await registry.StartAsync(CancellationToken.None);

Expand All @@ -76,7 +76,7 @@ public async Task Ensure_That_Packages_Already_Included_In_Net_Standard_Are_not_
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new FakeLoggerProvider());

var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(_registryOptions));
var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(s_registryOptions));

await registry.StartAsync(CancellationToken.None);

Expand Down Expand Up @@ -140,16 +140,15 @@ public async Task CanParse_PackageWithRuntimes()
Assert.That(libFiles.SetEquals(runtimeFiles), Is.True);
}

[Test]
public async Task Ensure_Min_Version_Is_Correct_Ignoring_Analyzers_And_Native_Libs()
static async Task<TestCaseData[]> AllRegistries()
{
var hostEnvironmentMock = new Mock<IHostEnvironment>();
hostEnvironmentMock.Setup(h => h.EnvironmentName).Returns(Environments.Development);

var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new FakeLoggerProvider());

var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(_registryOptions));
var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(s_registryOptions));

var logger = new NuGetConsoleTestLogger();
CancellationToken cancellationToken = CancellationToken.None;
Expand Down Expand Up @@ -211,118 +210,57 @@ public async Task Ensure_Min_Version_Is_Correct_Ignoring_Analyzers_And_Native_Li

var excludedPackagesRegex = new Regex(@$"^{string.Join('|', excludedPackages)}$");

foreach (KeyValuePair<string, RegistryEntry> registryKvp in registry.Where(r => !r.Value.Analyzer && !r.Value.Ignored))
return registry.Where(r => !r.Value.Analyzer && !r.Value.Ignored).OrderBy((pair) => pair.Key).Select((pair) =>
{
string packageId = registryKvp.Key;

if (excludedPackagesRegex.IsMatch(packageId))
{
continue;
}

VersionRange? versionRange = registryKvp.Value.Version;

IEnumerable<IPackageSearchMetadata> dependencyPackageMetas = await resource.GetMetadataAsync(
packageId,
includePrerelease: false,
includeUnlisted: false,
cache,
logger,
cancellationToken);

PackageIdentity? packageIdentity = NuGetHelper.GetMinimumCompatiblePackageIdentity(dependencyPackageMetas, nuGetFrameworks, includeAny: false);

if (packageIdentity != null)
{
Assert.That(versionRange!.MinVersion, Is.EqualTo(packageIdentity.Version), $"Package {packageId}");
}
else
{
ISettings settings = Settings.LoadDefaultSettings(root: null);

DownloadResourceResult downloadResult = await PackageDownloader.GetDownloadResourceResultAsync(
[repository],
new PackageIdentity(registryKvp.Key, registryKvp.Value.Version!.MinVersion),
new PackageDownloadContext(cache),
SettingsUtility.GetGlobalPackagesFolder(settings),
logger, cancellationToken);

bool hasNativeLib = await NativeLibraries.GetSupportedNativeLibsAsync(downloadResult.PackageReader, logger).AnyAsync();

if (hasNativeLib)
{
continue;
}
else
{
Assert.Fail(packageId);
}
}
}
return new TestCaseData(resource,logger,cache,repository,excludedPackagesRegex,nuGetFrameworks,pair.Key,pair.Value.Version).SetArgDisplayNames(pair.Key,pair.Value.Version!.ToString());
}).ToArray();
}

[Test]
public async Task Ensure_Do_Not_Exceed_The_Maximum_Number_Of_Allowed_Versions()
const int MaxAllowedVersions = 100;

[TestCaseSource(nameof(AllRegistries))]
public async Task Ensure_Min_Version_Is_Correct_Ignoring_Analyzers_And_Native_Libs(PackageMetadataResource resource,
NuGetConsoleTestLogger logger,
SourceCacheContext cache,
SourceRepository repository,
Regex excludedPackagesRegex,
RegistryTargetFramework[] nuGetFrameworks,
string packageId,
VersionRange versionRange)
{
const int maxAllowedVersions = 100;

var hostEnvironmentMock = new Mock<IHostEnvironment>();
hostEnvironmentMock.Setup(h => h.EnvironmentName).Returns(Environments.Development);
IEnumerable<IPackageSearchMetadata> dependencyPackageMetas = await resource.GetMetadataAsync(
packageId,
includePrerelease: false,
includeUnlisted: false,
cache,
logger,
CancellationToken.None);

var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new FakeLoggerProvider());
IPackageSearchMetadata[] versions = dependencyPackageMetas.Where(v => versionRange!.Satisfies(v.Identity.Version)).ToArray();
Warn.If(versions, Has.Length.GreaterThan(MaxAllowedVersions));

var registry = new Registry(hostEnvironmentMock.Object, loggerFactory, Options.Create(_registryOptions));

var logger = new NuGetConsoleTestLogger();
CancellationToken cancellationToken = CancellationToken.None;
if (excludedPackagesRegex.IsMatch(packageId))
return;

await registry.StartAsync(cancellationToken);
PackageIdentity? packageIdentity = NuGetHelper.GetMinimumCompatiblePackageIdentity(dependencyPackageMetas, nuGetFrameworks, includeAny: false);

var cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();

List<(string packageId, int versionCount)> packages = [];

foreach (KeyValuePair<string, RegistryEntry> registryKvp in registry.Where(r => !r.Value.Analyzer && !r.Value.Ignored))
if (packageIdentity != null)
{
string packageId = registryKvp.Key;

VersionRange? versionRange = registryKvp.Value.Version;

IEnumerable<IPackageSearchMetadata> dependencyPackageMetas = await resource.GetMetadataAsync(
packageId,
includePrerelease: false,
includeUnlisted: false,
cache,
logger,
cancellationToken);

IPackageSearchMetadata[] versions = dependencyPackageMetas.Where(v => versionRange!.Satisfies(v.Identity.Version)).ToArray();

if (versions.Length > maxAllowedVersions)
{
packages.Add((registryKvp.Key, versions.Length));
}
Assert.That(versionRange!.MinVersion, Is.EqualTo(packageIdentity.Version), $"Package {packageId}");
}

StringBuilder stringBuilder = new();

foreach ((string packageId, int versionCount) in packages.OrderByDescending(p => p.versionCount))
else
{
stringBuilder.AppendLine($"{packageId} -> {versionCount}");
}
ISettings settings = Settings.LoadDefaultSettings(root: null);

if (stringBuilder.Length == 0)
{
const bool trueConstant = true;
DownloadResourceResult downloadResult = await PackageDownloader.GetDownloadResourceResultAsync(
[repository],
new PackageIdentity(packageId, versionRange!.MinVersion),
new PackageDownloadContext(cache),
SettingsUtility.GetGlobalPackagesFolder(settings),
logger, CancellationToken.None);

Assert.That(trueConstant, Is.True);
}
else
{
Assert.Inconclusive(stringBuilder.ToString());
bool hasNativeLib = await NativeLibraries.GetSupportedNativeLibsAsync(downloadResult.PackageReader, logger).AnyAsync();
Assert.That(hasNativeLib, packageId);
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/UnityNuGet.Tests/UnityNuGet.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
</ItemGroup>

<ItemGroup>
<EmbeddedResource Include="..\..\registry.json" />
<ProjectReference Include="..\UnityNuGet\UnityNuGet.csproj" />
</ItemGroup>

Expand Down
Loading