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
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:
@@ -32,10 +32,12 @@ public class CallgraphIngestionServiceTests
|
||||
var parser = new StubParser("java");
|
||||
var resolver = new StubParserResolver(parser);
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new SignalsOptions());
|
||||
var reachabilityStore = new InMemoryReachabilityStoreRepository(_timeProvider);
|
||||
var service = new CallgraphIngestionService(
|
||||
resolver,
|
||||
_artifactStore,
|
||||
_repository,
|
||||
reachabilityStore,
|
||||
_normalizer,
|
||||
options,
|
||||
_timeProvider,
|
||||
@@ -70,6 +72,15 @@ public class CallgraphIngestionServiceTests
|
||||
stored.Metadata!["schemaVersion"].Should().Be("1.0");
|
||||
stored.Metadata!["analyzer.name"].Should().Be("stub");
|
||||
stored.Artifact.GraphHash.Should().Be(response.GraphHash);
|
||||
|
||||
var storedNodes = await reachabilityStore.GetFuncNodesByGraphAsync(response.GraphHash, CancellationToken.None);
|
||||
storedNodes.Should().HaveCount(1);
|
||||
storedNodes[0].SymbolId.Should().Be("com/example/Foo.bar:(I)V");
|
||||
|
||||
var storedEdges = await reachabilityStore.GetCallEdgesByGraphAsync(response.GraphHash, CancellationToken.None);
|
||||
storedEdges.Should().HaveCount(1);
|
||||
storedEdges[0].SourceId.Should().Be("com/example/Foo.bar:(I)V");
|
||||
storedEdges[0].TargetId.Should().Be("com/example/Foo.bar:(I)V");
|
||||
}
|
||||
|
||||
private sealed class StubParser : ICallgraphParser
|
||||
|
||||
@@ -88,6 +88,79 @@ public class ReachabilityScoringServiceTests
|
||||
Assert.False(string.IsNullOrWhiteSpace(fact.Metadata?["fact.digest"]));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RecomputeAsync_ComputesUncertaintyRiskScoreUsingConfiguredEntropyWeights()
|
||||
{
|
||||
var callgraph = new CallgraphDocument
|
||||
{
|
||||
Id = "cg-2",
|
||||
Language = "java",
|
||||
Component = "demo",
|
||||
Version = "1.0.0",
|
||||
Nodes = new List<CallgraphNode>
|
||||
{
|
||||
new("main", "Main", "method", null, null, null),
|
||||
new("svc", "Svc", "method", null, null, null),
|
||||
new("target", "Target", "method", null, null, null)
|
||||
},
|
||||
Edges = new List<CallgraphEdge>
|
||||
{
|
||||
new("main", "svc", "call"),
|
||||
new("svc", "target", "call")
|
||||
}
|
||||
};
|
||||
|
||||
var callgraphRepository = new InMemoryCallgraphRepository(callgraph);
|
||||
var factRepository = new InMemoryReachabilityFactRepository();
|
||||
|
||||
var options = new SignalsOptions();
|
||||
options.Scoring.ReachableConfidence = 0.8;
|
||||
options.Scoring.RuntimeBonus = 0.1;
|
||||
options.Scoring.UncertaintyEntropyMultiplier = 1.0;
|
||||
options.Scoring.UncertaintyBoostCeiling = 0.3;
|
||||
|
||||
var cache = new InMemoryReachabilityCache();
|
||||
var eventsPublisher = new RecordingEventsPublisher();
|
||||
var unknowns = new InMemoryUnknownsRepository();
|
||||
unknowns.Stored.Add(new UnknownSymbolDocument
|
||||
{
|
||||
SubjectKey = "demo|1.0.0",
|
||||
CallgraphId = callgraph.Id,
|
||||
SymbolId = "sym:unknown",
|
||||
Reason = "fixture",
|
||||
CreatedAt = DateTimeOffset.Parse("2025-12-13T00:00:00Z")
|
||||
});
|
||||
|
||||
var service = new ReachabilityScoringService(
|
||||
callgraphRepository,
|
||||
factRepository,
|
||||
TimeProvider.System,
|
||||
Options.Create(options),
|
||||
cache,
|
||||
unknowns,
|
||||
eventsPublisher,
|
||||
NullLogger<ReachabilityScoringService>.Instance);
|
||||
|
||||
var request = new ReachabilityRecomputeRequest
|
||||
{
|
||||
CallgraphId = callgraph.Id,
|
||||
Subject = new ReachabilitySubject { Component = "demo", Version = "1.0.0" },
|
||||
EntryPoints = new List<string> { "main" },
|
||||
Targets = new List<string> { "target" },
|
||||
RuntimeHits = new List<string> { "svc", "target" }
|
||||
};
|
||||
|
||||
var fact = await service.RecomputeAsync(request, CancellationToken.None);
|
||||
|
||||
Assert.NotNull(fact.Uncertainty);
|
||||
Assert.Equal("T2", fact.Uncertainty!.AggregateTier);
|
||||
Assert.Contains(fact.Uncertainty.States, state => state.Code == "U1");
|
||||
|
||||
Assert.Equal(0.26325, fact.Score, 5); // 0.405 base score * (1 - 0.35 unknowns penalty ceiling)
|
||||
Assert.Equal(0.62775, fact.RiskScore, 5); // 0.405 base score * (1 + 0.25 tier modifier + 0.3 entropy boost ceiling)
|
||||
Assert.Equal(fact.RiskScore, fact.Uncertainty.RiskScore ?? 0.0, 5);
|
||||
}
|
||||
|
||||
private sealed class InMemoryCallgraphRepository : ICallgraphRepository
|
||||
{
|
||||
private readonly CallgraphDocument document;
|
||||
|
||||
Reference in New Issue
Block a user