up
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
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
This commit is contained in:
@@ -1,88 +1,88 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Diagnostics.Metrics;
|
||||
using StellaOps.Concelier.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace StellaOps.Concelier.Models.Tests;
|
||||
|
||||
public sealed class OsvGhsaParityDiagnosticsTests
|
||||
{
|
||||
[Fact]
|
||||
public void RecordReport_EmitsTotalAndIssues()
|
||||
{
|
||||
var issues = ImmutableArray.Create(
|
||||
new OsvGhsaParityIssue(
|
||||
GhsaId: "GHSA-AAA",
|
||||
IssueKind: "missing_osv",
|
||||
Detail: "",
|
||||
FieldMask: ImmutableArray.Create(ProvenanceFieldMasks.AffectedPackages)),
|
||||
new OsvGhsaParityIssue(
|
||||
GhsaId: "GHSA-BBB",
|
||||
IssueKind: "severity_mismatch",
|
||||
Detail: "",
|
||||
FieldMask: ImmutableArray<string>.Empty));
|
||||
var report = new OsvGhsaParityReport(2, issues);
|
||||
|
||||
var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary<string, object?> Tags)>();
|
||||
using var listener = CreateListener(measurements);
|
||||
|
||||
OsvGhsaParityDiagnostics.RecordReport(report, "QA");
|
||||
|
||||
listener.Dispose();
|
||||
|
||||
Assert.Equal(3, measurements.Count);
|
||||
|
||||
var total = Assert.Single(measurements, m => m.Instrument == "concelier.osv_ghsa.total");
|
||||
Assert.Equal(2, total.Value);
|
||||
Assert.Equal("qa", total.Tags["dataset"]);
|
||||
|
||||
var missing = Assert.Single(measurements, m => m.Tags.TryGetValue("issueKind", out var kind) && string.Equals((string)kind!, "missing_osv", StringComparison.Ordinal));
|
||||
Assert.Equal("affectedpackages[]", missing.Tags["fieldMask"]);
|
||||
|
||||
var severity = Assert.Single(measurements, m => m.Tags.TryGetValue("issueKind", out var kind) && string.Equals((string)kind!, "severity_mismatch", StringComparison.Ordinal));
|
||||
Assert.Equal("none", severity.Tags["fieldMask"]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RecordReport_NoIssues_OnlyEmitsTotal()
|
||||
{
|
||||
var report = new OsvGhsaParityReport(0, ImmutableArray<OsvGhsaParityIssue>.Empty);
|
||||
var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary<string, object?> Tags)>();
|
||||
using var listener = CreateListener(measurements);
|
||||
|
||||
OsvGhsaParityDiagnostics.RecordReport(report, "");
|
||||
|
||||
listener.Dispose();
|
||||
Assert.Empty(measurements);
|
||||
}
|
||||
|
||||
private static MeterListener CreateListener(List<(string Instrument, long Value, IReadOnlyDictionary<string, object?> Tags)> measurements)
|
||||
{
|
||||
var listener = new MeterListener
|
||||
{
|
||||
InstrumentPublished = (instrument, l) =>
|
||||
{
|
||||
if (instrument.Meter.Name.StartsWith("StellaOps.Concelier.Models.OsvGhsaParity", StringComparison.Ordinal))
|
||||
{
|
||||
l.EnableMeasurementEvents(instrument);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
listener.SetMeasurementEventCallback<long>((instrument, measurement, tags, state) =>
|
||||
{
|
||||
var dict = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (var tag in tags)
|
||||
{
|
||||
dict[tag.Key] = tag.Value;
|
||||
}
|
||||
|
||||
measurements.Add((instrument.Name, measurement, dict));
|
||||
});
|
||||
|
||||
listener.Start();
|
||||
return listener;
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Diagnostics.Metrics;
|
||||
using StellaOps.Concelier.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace StellaOps.Concelier.Models.Tests;
|
||||
|
||||
public sealed class OsvGhsaParityDiagnosticsTests
|
||||
{
|
||||
[Fact]
|
||||
public void RecordReport_EmitsTotalAndIssues()
|
||||
{
|
||||
var issues = ImmutableArray.Create(
|
||||
new OsvGhsaParityIssue(
|
||||
GhsaId: "GHSA-AAA",
|
||||
IssueKind: "missing_osv",
|
||||
Detail: "",
|
||||
FieldMask: ImmutableArray.Create(ProvenanceFieldMasks.AffectedPackages)),
|
||||
new OsvGhsaParityIssue(
|
||||
GhsaId: "GHSA-BBB",
|
||||
IssueKind: "severity_mismatch",
|
||||
Detail: "",
|
||||
FieldMask: ImmutableArray<string>.Empty));
|
||||
var report = new OsvGhsaParityReport(2, issues);
|
||||
|
||||
var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary<string, object?> Tags)>();
|
||||
using var listener = CreateListener(measurements);
|
||||
|
||||
OsvGhsaParityDiagnostics.RecordReport(report, "QA");
|
||||
|
||||
listener.Dispose();
|
||||
|
||||
Assert.Equal(3, measurements.Count);
|
||||
|
||||
var total = Assert.Single(measurements, m => m.Instrument == "concelier.osv_ghsa.total");
|
||||
Assert.Equal(2, total.Value);
|
||||
Assert.Equal("qa", total.Tags["dataset"]);
|
||||
|
||||
var missing = Assert.Single(measurements, m => m.Tags.TryGetValue("issueKind", out var kind) && string.Equals((string)kind!, "missing_osv", StringComparison.Ordinal));
|
||||
Assert.Equal("affectedpackages[]", missing.Tags["fieldMask"]);
|
||||
|
||||
var severity = Assert.Single(measurements, m => m.Tags.TryGetValue("issueKind", out var kind) && string.Equals((string)kind!, "severity_mismatch", StringComparison.Ordinal));
|
||||
Assert.Equal("none", severity.Tags["fieldMask"]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RecordReport_NoIssues_OnlyEmitsTotal()
|
||||
{
|
||||
var report = new OsvGhsaParityReport(0, ImmutableArray<OsvGhsaParityIssue>.Empty);
|
||||
var measurements = new List<(string Instrument, long Value, IReadOnlyDictionary<string, object?> Tags)>();
|
||||
using var listener = CreateListener(measurements);
|
||||
|
||||
OsvGhsaParityDiagnostics.RecordReport(report, "");
|
||||
|
||||
listener.Dispose();
|
||||
Assert.Empty(measurements);
|
||||
}
|
||||
|
||||
private static MeterListener CreateListener(List<(string Instrument, long Value, IReadOnlyDictionary<string, object?> Tags)> measurements)
|
||||
{
|
||||
var listener = new MeterListener
|
||||
{
|
||||
InstrumentPublished = (instrument, l) =>
|
||||
{
|
||||
if (instrument.Meter.Name.StartsWith("StellaOps.Concelier.Models.OsvGhsaParity", StringComparison.Ordinal))
|
||||
{
|
||||
l.EnableMeasurementEvents(instrument);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
listener.SetMeasurementEventCallback<long>((instrument, measurement, tags, state) =>
|
||||
{
|
||||
var dict = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (var tag in tags)
|
||||
{
|
||||
dict[tag.Key] = tag.Value;
|
||||
}
|
||||
|
||||
measurements.Add((instrument.Name, measurement, dict));
|
||||
});
|
||||
|
||||
listener.Start();
|
||||
return listener;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user