up
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

This commit is contained in:
StellaOps Bot
2025-12-13 09:37:15 +02:00
parent e00f6365da
commit 6e45066e37
349 changed files with 17160 additions and 1867 deletions

View File

@@ -10,7 +10,6 @@ using System.Threading.Tasks;
using FluentAssertions;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using MongoDB.Bson;
using StellaOps.Scanner.Reachability;
using StellaOps.Signals.Models;
using StellaOps.Signals.Options;
@@ -36,7 +35,25 @@ public sealed class ScannerToSignalsReachabilityTests
var variantPath = Path.Combine(FixtureRoot, caseId, "images", variant);
Directory.Exists(variantPath).Should().BeTrue();
var builder = ReachabilityGraphBuilder.FromFixture(variantPath);
var truth = JsonDocument.Parse(File.ReadAllText(Path.Combine(variantPath, "reachgraph.truth.json"))).RootElement;
var paths = truth.GetProperty("paths")
.EnumerateArray()
.Select(path => path.EnumerateArray().Select(x => x.GetString()!).Where(x => !string.IsNullOrWhiteSpace(x)).ToList())
.Where(path => path.Count > 0)
.ToList();
var builder = new ReachabilityGraphBuilder();
foreach (var path in paths)
{
for (var i = 0; i < path.Count; i++)
{
builder.AddNode(path[i]);
if (i + 1 < path.Count)
{
builder.AddEdge(path[i], path[i + 1]);
}
}
}
var artifactJson = builder.BuildJson(indented: false);
var parser = new SimpleJsonCallgraphParser("java");
var parserResolver = new StaticParserResolver(new Dictionary<string, ICallgraphParser>
@@ -45,10 +62,12 @@ public sealed class ScannerToSignalsReachabilityTests
});
var artifactStore = new InMemoryCallgraphArtifactStore();
var callgraphRepo = new InMemoryCallgraphRepository();
var reachabilityStore = new InMemoryReachabilityStoreRepository(TimeProvider.System);
var ingestionService = new CallgraphIngestionService(
parserResolver,
artifactStore,
callgraphRepo,
reachabilityStore,
new CallgraphNormalizationService(),
Options.Create(new SignalsOptions()),
TimeProvider.System,
@@ -77,12 +96,14 @@ public sealed class ScannerToSignalsReachabilityTests
new NullEventsPublisher(),
NullLogger<ReachabilityScoringService>.Instance);
var truth = JsonDocument.Parse(File.ReadAllText(Path.Combine(variantPath, "reachgraph.truth.json"))).RootElement;
var entryPoints = truth.GetProperty("paths").EnumerateArray()
.Select(path => path[0].GetString()!)
var entryPoints = paths
.Select(path => path[0])
.Distinct(StringComparer.Ordinal)
.ToList();
var targets = paths
.Select(path => path[^1])
.Distinct(StringComparer.Ordinal)
.ToList();
var targets = truth.GetProperty("sinks").EnumerateArray().Select(s => s.GetProperty("sid").GetString()!).ToList();
var recomputeRequest = new ReachabilityRecomputeRequest
{
@@ -161,7 +182,7 @@ public sealed class ScannerToSignalsReachabilityTests
{
if (string.IsNullOrWhiteSpace(document.Id))
{
document.Id = ObjectId.GenerateNewId().ToString();
document.Id = $"cg-{storage.Count + 1}";
}
storage[document.Id] = document;
@@ -228,6 +249,9 @@ public sealed class ScannerToSignalsReachabilityTests
private sealed class InMemoryCallgraphArtifactStore : ICallgraphArtifactStore
{
private readonly Dictionary<string, byte[]> artifacts = new(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<string, byte[]> manifests = new(StringComparer.OrdinalIgnoreCase);
public async Task<StoredCallgraphArtifact> SaveAsync(CallgraphArtifactSaveRequest request, Stream content, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(request);
@@ -251,6 +275,15 @@ public sealed class ScannerToSignalsReachabilityTests
var casUri = $"cas://fixtures/{request.Component}/{request.Version}/{computedHash}";
var manifestPath = $"cas://fixtures/{request.Component}/{request.Version}/{computedHash}/manifest";
artifacts[computedHash] = bytes;
if (request.ManifestContent is not null)
{
await using var manifestBuffer = new MemoryStream();
await request.ManifestContent.CopyToAsync(manifestBuffer, cancellationToken).ConfigureAwait(false);
manifests[computedHash] = manifestBuffer.ToArray();
}
return new StoredCallgraphArtifact(
Path: $"fixtures/{request.Component}/{request.Version}/{request.FileName}",
Length: bytes.Length,
@@ -260,6 +293,29 @@ public sealed class ScannerToSignalsReachabilityTests
ManifestPath: manifestPath,
ManifestCasUri: manifestPath);
}
public Task<Stream?> GetAsync(string hash, string? fileName, CancellationToken cancellationToken)
{
if (!artifacts.TryGetValue(hash, out var bytes))
{
return Task.FromResult<Stream?>(null);
}
return Task.FromResult<Stream?>(new MemoryStream(bytes, writable: false));
}
public Task<Stream?> GetManifestAsync(string hash, CancellationToken cancellationToken)
{
if (!manifests.TryGetValue(hash, out var bytes))
{
return Task.FromResult<Stream?>(null);
}
return Task.FromResult<Stream?>(new MemoryStream(bytes, writable: false));
}
public Task<bool> ExistsAsync(string hash, CancellationToken cancellationToken)
=> Task.FromResult(artifacts.ContainsKey(hash));
}
private static string LocateRepoRoot()
{