Some checks failed
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Policy Simulation / policy-simulate (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (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
Docs CI / lint-and-preview (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
64 lines
2.8 KiB
C#
64 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using FluentAssertions;
|
|
using StellaOps.Replay.Core;
|
|
using StellaOps.Scanner.Reachability;
|
|
using Xunit;
|
|
|
|
namespace StellaOps.Reachability.FixtureTests;
|
|
|
|
public sealed class ReachabilityReplayWriterTests
|
|
{
|
|
[Fact]
|
|
public void AttachEvidence_AppendsGraphsAndTracesDeterministically()
|
|
{
|
|
var manifest = new ReplayManifest
|
|
{
|
|
Scan = new ReplayScanMetadata { Id = "scan-123", Time = DateTimeOffset.Parse("2025-10-15T10:00:00Z", CultureInfo.InvariantCulture) }
|
|
};
|
|
|
|
var graphs = new List<ReachabilityReplayGraph>
|
|
{
|
|
new("static", "cas://graph/B", "ABCDEF", "scanner-jvm", "1.0.0"),
|
|
new("framework", "cas://graph/A", "abcdef", "scanner-jvm", "1.0.0"),
|
|
new("static", "cas://graph/B", "ABCDEF", "scanner-jvm", "1.0.0") // duplicate
|
|
};
|
|
|
|
var traces = new List<ReachabilityReplayTrace>
|
|
{
|
|
new("zastava", "cas://trace/1", "FFEE", DateTimeOffset.Parse("2025-10-15T09:00:00+02:00", CultureInfo.InvariantCulture)),
|
|
new("zastava", "cas://trace/2", "ffee", DateTimeOffset.Parse("2025-10-15T09:05:00Z", CultureInfo.InvariantCulture)),
|
|
new("zastava", "cas://trace/1", "FFEE", DateTimeOffset.Parse("2025-10-15T09:00:00Z", CultureInfo.InvariantCulture)) // duplicate once normalized
|
|
};
|
|
|
|
var writer = new StellaOps.Scanner.Reachability.ReachabilityReplayWriter();
|
|
writer.AttachEvidence(manifest, graphs, traces);
|
|
|
|
manifest.Reachability.Should().NotBeNull();
|
|
manifest.Reachability!.Graphs.Should().HaveCount(2);
|
|
manifest.Reachability.Graphs[0].CasUri.Should().Be("cas://graph/A");
|
|
manifest.Reachability.Graphs[0].Sha256.Should().Be("abcdef");
|
|
manifest.Reachability.Graphs[1].CasUri.Should().Be("cas://graph/B");
|
|
manifest.Reachability.Graphs[1].Kind.Should().Be("static");
|
|
|
|
manifest.Reachability.RuntimeTraces.Should().HaveCount(2);
|
|
manifest.Reachability.RuntimeTraces[0].RecordedAt.Should().Be(DateTimeOffset.Parse("2025-10-15T07:00:00Z"));
|
|
manifest.Reachability.RuntimeTraces[0].Sha256.Should().Be("ffee");
|
|
manifest.Reachability.RuntimeTraces[1].CasUri.Should().Be("cas://trace/2");
|
|
}
|
|
|
|
[Fact]
|
|
public void AttachEvidence_DoesNotCreateSectionWhenEmpty()
|
|
{
|
|
var manifest = new ReplayManifest();
|
|
var writer = new StellaOps.Scanner.Reachability.ReachabilityReplayWriter();
|
|
|
|
writer.AttachEvidence(manifest, Array.Empty<ReachabilityReplayGraph>(), Array.Empty<ReachabilityReplayTrace>());
|
|
|
|
manifest.Reachability.AnalysisId.Should().BeNull();
|
|
manifest.Reachability.Graphs.Should().BeEmpty();
|
|
manifest.Reachability.RuntimeTraces.Should().BeEmpty();
|
|
}
|
|
}
|