Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled
93 lines
3.4 KiB
C#
93 lines
3.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
using StellaOps.Concelier.Merge.Identity;
|
|
using StellaOps.Concelier.Models;
|
|
using Xunit;
|
|
|
|
namespace StellaOps.Concelier.Merge.Tests;
|
|
|
|
public sealed class AdvisoryIdentityResolverTests
|
|
{
|
|
private readonly AdvisoryIdentityResolver _resolver = new();
|
|
|
|
[Fact]
|
|
public void Resolve_GroupsBySharedCveAlias()
|
|
{
|
|
var nvd = CreateAdvisory("CVE-2025-1234", aliases: new[] { "CVE-2025-1234" }, source: "nvd");
|
|
var vendor = CreateAdvisory("VSA-2025-01", aliases: new[] { "CVE-2025-1234", "VSA-2025-01" }, source: "vendor");
|
|
|
|
var clusters = _resolver.Resolve(new[] { nvd, vendor });
|
|
|
|
var cluster = Assert.Single(clusters);
|
|
Assert.Equal("CVE-2025-1234", cluster.AdvisoryKey);
|
|
Assert.Equal(2, cluster.Advisories.Length);
|
|
Assert.True(cluster.Aliases.Any(alias => alias.Value == "CVE-2025-1234"));
|
|
}
|
|
|
|
[Fact]
|
|
public void Resolve_PrefersPsirtAliasWhenNoCve()
|
|
{
|
|
var vendor = CreateAdvisory("VMSA-2025-0001", aliases: new[] { "VMSA-2025-0001" }, source: "vmware");
|
|
var osv = CreateAdvisory("OSV-2025-1", aliases: new[] { "OSV-2025-1", "GHSA-xxxx-yyyy-zzzz", "VMSA-2025-0001" }, source: "osv");
|
|
|
|
var clusters = _resolver.Resolve(new[] { vendor, osv });
|
|
|
|
var cluster = Assert.Single(clusters);
|
|
Assert.Equal("VMSA-2025-0001", cluster.AdvisoryKey);
|
|
Assert.Equal(2, cluster.Advisories.Length);
|
|
Assert.True(cluster.Aliases.Any(alias => alias.Value == "VMSA-2025-0001"));
|
|
}
|
|
|
|
[Fact]
|
|
public void Resolve_FallsBackToGhsaWhenOnlyGhsaPresent()
|
|
{
|
|
var ghsa = CreateAdvisory("GHSA-aaaa-bbbb-cccc", aliases: new[] { "GHSA-aaaa-bbbb-cccc" }, source: "ghsa");
|
|
var osv = CreateAdvisory("OSV-2025-99", aliases: new[] { "OSV-2025-99", "GHSA-aaaa-bbbb-cccc" }, source: "osv");
|
|
|
|
var clusters = _resolver.Resolve(new[] { ghsa, osv });
|
|
|
|
var cluster = Assert.Single(clusters);
|
|
Assert.Equal("GHSA-aaaa-bbbb-cccc", cluster.AdvisoryKey);
|
|
Assert.Equal(2, cluster.Advisories.Length);
|
|
Assert.True(cluster.Aliases.Any(alias => alias.Value == "GHSA-aaaa-bbbb-cccc"));
|
|
}
|
|
|
|
[Fact]
|
|
public void Resolve_GroupsByKeyWhenNoAliases()
|
|
{
|
|
var first = CreateAdvisory("custom-1", aliases: Array.Empty<string>(), source: "source-a");
|
|
var second = CreateAdvisory("custom-1", aliases: Array.Empty<string>(), source: "source-b");
|
|
|
|
var clusters = _resolver.Resolve(new[] { first, second });
|
|
|
|
var cluster = Assert.Single(clusters);
|
|
Assert.Equal("custom-1", cluster.AdvisoryKey);
|
|
Assert.Equal(2, cluster.Advisories.Length);
|
|
Assert.Contains(cluster.Aliases, alias => alias.Value == "custom-1");
|
|
}
|
|
|
|
private static Advisory CreateAdvisory(string key, string[] aliases, string source)
|
|
{
|
|
var provenance = new[]
|
|
{
|
|
new AdvisoryProvenance(source, "mapping", key, DateTimeOffset.UtcNow),
|
|
};
|
|
|
|
return new Advisory(
|
|
key,
|
|
$"{key} title",
|
|
$"{key} summary",
|
|
"en",
|
|
DateTimeOffset.UtcNow,
|
|
DateTimeOffset.UtcNow,
|
|
null,
|
|
exploitKnown: false,
|
|
aliases,
|
|
Array.Empty<AdvisoryCredit>(),
|
|
Array.Empty<AdvisoryReference>(),
|
|
Array.Empty<AffectedPackage>(),
|
|
Array.Empty<CvssMetric>(),
|
|
provenance);
|
|
}
|
|
}
|