use vyre_foundation::ir::Program;
use vyre_primitives::graph::program_graph::ProgramGraphShape;
#[cfg(test)]
use crate::security::flow_composition::dataflow_hit_cpu_ref;
use crate::security::flow_composition::{
dataflow_hit_fixture_expected, dataflow_hit_fixture_inputs, security_flow_program,
SecurityFlowOptions, SinkProjection,
};
pub(crate) const OP_ID: &str = "vyre-libs::security::flows_to_to_sink";
#[must_use]
pub fn flows_to_to_sink(
shape: ProgramGraphShape,
source_buf: &str,
sink_buf: &str,
reach_buf: &str,
hits_buf: &str,
out_scalar_buf: &str,
) -> Program {
security_flow_program(SecurityFlowOptions::hit(
OP_ID,
shape,
source_buf,
reach_buf,
SinkProjection {
sink: sink_buf,
hits: hits_buf,
out_scalar: out_scalar_buf,
},
))
}
inventory::submit! {
vyre_foundation::operation::OperationRegistration::library(
OP_ID,
|| flows_to_to_sink(ProgramGraphShape::new(4, 3), "source", "sink", "reach", "hits", "out_scalar"),
Some(dataflow_hit_fixture_inputs),
Some(dataflow_hit_fixture_expected),
)
.with_category("security")
}
#[cfg(test)]
mod tests {
use super::*;
use crate::security::flow_composition::linear_dataflow;
#[test]
fn one_hop_source_reaches_sink_returns_one() {
let (off, tgt, msk) = linear_dataflow(4);
let source = [0b0001u32]; let sink = [0b0010u32]; let result = dataflow_hit_cpu_ref(4, &off, &tgt, &msk, &source, &sink);
assert_eq!(result, 1);
}
#[test]
fn two_hops_unreachable_in_one_step_returns_zero() {
let (off, tgt, msk) = linear_dataflow(4);
let source = [0b0001u32]; let sink = [0b0100u32]; let result = dataflow_hit_cpu_ref(4, &off, &tgt, &msk, &source, &sink);
assert_eq!(result, 0);
}
#[test]
fn empty_source_returns_zero() {
let (off, tgt, msk) = linear_dataflow(4);
let source = [0u32];
let sink = [0b0010u32];
let result = dataflow_hit_cpu_ref(4, &off, &tgt, &msk, &source, &sink);
assert_eq!(result, 0);
}
#[test]
fn empty_sink_returns_zero() {
let (off, tgt, msk) = linear_dataflow(4);
let source = [0b0001u32];
let sink = [0u32];
let result = dataflow_hit_cpu_ref(4, &off, &tgt, &msk, &source, &sink);
assert_eq!(result, 0);
}
}