up
Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled

This commit is contained in:
StellaOps Bot
2025-12-01 21:16:22 +02:00
parent c11d87d252
commit 909d9b6220
208 changed files with 860954 additions and 832 deletions

View File

@@ -246,13 +246,34 @@ public sealed class SurfaceManifestStageExecutorTests
Span: null,
Metadata: null);
var plan = new EntryTracePlan(
ImmutableArray.Create("/bin/entry"),
ImmutableDictionary<string, string>.Empty,
WorkingDirectory: "/",
User: "root",
TerminalPath: "/bin/entry",
Type: EntryTraceTerminalType.Native,
Runtime: "native",
Confidence: 92.5,
Evidence: ImmutableDictionary<string, string>.Empty);
var terminal = new EntryTraceTerminal(
Path: "/bin/entry",
Type: EntryTraceTerminalType.Native,
Runtime: "native",
Confidence: 92.5,
Evidence: ImmutableDictionary<string, string>.Empty,
User: "root",
WorkingDirectory: "/",
Arguments: ImmutableArray.Create("/bin/entry"));
var graph = new EntryTraceGraph(
Outcome: EntryTraceOutcome.Resolved,
Nodes: ImmutableArray.Create(node),
Edges: ImmutableArray<EntryTraceEdge>.Empty,
Diagnostics: ImmutableArray<EntryTraceDiagnostic>.Empty,
Plans: ImmutableArray<EntryTracePlan>.Empty,
Terminals: ImmutableArray<EntryTraceTerminal>.Empty);
Plans: ImmutableArray.Create(plan),
Terminals: ImmutableArray.Create(terminal));
context.Analysis.Set(ScanAnalysisKeys.EntryTraceGraph, graph);
@@ -301,6 +322,44 @@ public sealed class SurfaceManifestStageExecutorTests
Assert.NotEmpty(packageStore.LastInventory!.Packages);
}
[Fact]
public async Task ExecuteAsync_AddsBestEntryTraceMetadata()
{
var metrics = new ScannerWorkerMetrics();
var publisher = new TestSurfaceManifestPublisher("tenant-a");
var cache = new RecordingSurfaceCache();
var environment = new TestSurfaceEnvironment("tenant-a");
var hash = CreateCryptoHash();
var packageStore = new RecordingRubyPackageStore();
var executor = new SurfaceManifestStageExecutor(
publisher,
cache,
environment,
metrics,
NullLogger<SurfaceManifestStageExecutor>.Instance,
hash,
packageStore);
var context = CreateContext();
PopulateAnalysis(context);
await executor.ExecuteAsync(context, CancellationToken.None);
var entrytracePayloads = publisher.LastRequest!.Payloads
.Where(p => p.Kind.StartsWith("entrytrace", StringComparison.OrdinalIgnoreCase))
.ToList();
Assert.NotEmpty(entrytracePayloads);
foreach (var payload in entrytracePayloads)
{
Assert.Equal("/bin/entry", payload.Metadata!["best_terminal"]);
Assert.Equal("92.5000", payload.Metadata!["best_confidence"]);
Assert.Equal("root", payload.Metadata!["best_user"]);
Assert.Equal("/", payload.Metadata!["best_workdir"]);
}
}
private static async Task PopulateRubyAnalyzerResultsAsync(ScanJobContext context)
{
var fixturePath = Path.Combine(