15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/necropsy/analyzers/dynamic/coverage_importer.rb', line 15
def analyze(_graph, project)
source = config['source']
return AnalyzerResult.empty unless source
payload = load_payload(File.expand_path(source, project.root))
observation = ObservationPolicy.metadata(payload, expected_revision: config['expected_source_revision'])
malformed = []
alive = node_references(payload).map do |raw_reference|
node_id = normalized_or_raw(raw_reference, malformed, :node)
AliveEvidence.new(
node_id: node_id,
evidence: evidence(
kind: :alive,
details: "Coverage marked #{reference_label(node_id)} as executed",
metadata: observation.merge('node_reference' => node_id),
grade: :observed,
relation: :execution,
source: { 'type' => profile.name.to_s, 'node_reference' => node_id },
scope: ObservationPolicy.evidence_scope(observation).merge('node_reference' => node_id)
)
)
end
edge_evidences = edge_references(payload).filter_map do |edge|
unless edge.is_a?(Hash)
malformed << malformed_reference(:edge, edge)
next
end
caller = edge['caller_id'] || edge[:caller_id]
callee = edge['callee_id'] || edge[:callee_id]
caller_id = normalized_or_raw(caller, malformed, :edge_caller)
callee_id = normalized_or_raw(callee, malformed, :edge_callee)
EdgeEvidence.new(
caller_id: caller_id,
callee_id: callee_id,
evidence: evidence(
kind: :call_edge,
details: "Coverage observed #{reference_label(caller_id)} -> #{reference_label(callee_id)}",
metadata: { 'caller_reference' => caller_id, 'callee_reference' => callee_id },
grade: :observed,
relation: :observed_call,
source: {
'type' => profile.name.to_s,
'caller_reference' => caller_id,
'callee_reference' => callee_id
},
scope: ObservationPolicy.evidence_scope(observation).merge(
'caller_reference' => caller_id,
'callee_reference' => callee_id
)
)
)
end
observation = observation.merge('malformed_references' => malformed) unless malformed.empty?
AnalyzerResult.new(
edge_evidences: edge_evidences,
alive_evidences: alive,
uncertainties: {},
observation: { 'coverage' => observation },
resolutions: [],
evidences: result_evidences(edge_evidences, alive)
)
end
|