refactor(dynamic): enhance resolver detection for frameworks, refine SSA receiver validation, and expand test coverage

This commit is contained in:
elipeter 2026-05-24 14:34:39 -05:00
parent 3027c1afa7
commit f49211d788
38 changed files with 1198 additions and 137 deletions

View file

@ -17,11 +17,15 @@
mod common;
use nyx_scanner::dynamic::framework::registry::adapters_for;
use nyx_scanner::dynamic::framework::{FrameworkBinding, detect_binding};
use nyx_scanner::dynamic::framework::{
FrameworkBinding, detect_binding, detect_binding_with_context,
};
use nyx_scanner::dynamic::lang;
use nyx_scanner::dynamic::spec::{EntryKind, EntryKindTag, HarnessSpec, PayloadSlot};
use nyx_scanner::labels::Cap;
use nyx_scanner::summary::CalleeSite;
use nyx_scanner::summary::FuncSummary;
use nyx_scanner::summary::ssa_summary::SsaFuncSummary;
use nyx_scanner::symbol::Lang;
const SUPPORTED_LANGS: &[Lang] = &[
@ -215,6 +219,39 @@ fn detect_from_bytes(lang: Lang, bytes: &[u8], handler: &str) -> Option<Framewor
detect_binding(&summary, tree.root_node(), bytes, lang)
}
fn detect_collision_fixture_with_receiver(
lang: Lang,
fixture: &str,
handler: &str,
callee: &str,
receiver: &str,
receiver_ty: &str,
) -> Option<FrameworkBinding> {
let bytes = std::fs::read(
std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
.join("tests/fixtures/fp_guards/broker_adapter_collisions")
.join(fixture),
)
.expect("collision fixture exists");
let ts_lang = ts_language_for(lang);
let mut parser = tree_sitter::Parser::new();
parser.set_language(&ts_lang).unwrap();
let tree = parser.parse(&bytes, None).unwrap();
let mut summary = FuncSummary {
name: handler.into(),
..Default::default()
};
summary.callees.push(CalleeSite {
name: callee.to_owned(),
receiver: Some(receiver.to_owned()),
ordinal: 0,
..Default::default()
});
let mut ssa = SsaFuncSummary::default();
ssa.typed_call_receivers.push((0, receiver_ty.to_owned()));
detect_binding_with_context(&summary, Some(&ssa), tree.root_node(), &bytes, lang)
}
fn middleware_names(binding: &FrameworkBinding) -> Vec<String> {
binding
.middleware
@ -417,6 +454,51 @@ def on_message(ch, method, properties, body):\n validate_request(body)\n",
}
}
#[test]
fn phase20_broker_adapter_receiver_collisions_have_fixture_anchors() {
let cases: &[(Lang, &str, &str, &str, &str, &str)] = &[
(
Lang::Python,
"python_non_broker_handler.py",
"handler",
"cache.process_message",
"cache",
"AuditCache",
),
(
Lang::Python,
"python_non_rabbit_process.py",
"process",
"worker.process",
"worker",
"ReportWorker",
),
(
Lang::JavaScript,
"node_non_sqs_send.js",
"handler",
"metrics.send",
"metrics",
"MetricsPublisher",
),
];
for (lang, fixture, handler, callee, receiver, receiver_ty) in cases {
let binding = detect_collision_fixture_with_receiver(
*lang,
fixture,
handler,
callee,
receiver,
receiver_ty,
);
assert!(
binding.is_none(),
"{fixture} should not bind as a broker message handler; got {binding:?}",
);
}
}
#[test]
fn registry_slices_include_phase_20_adapters() {
let java_names: Vec<&'static str> = adapters_for(Lang::Java).iter().map(|a| a.name()).collect();