use super::runner::run_scenario;
use super::scenarios;
use super::tests::SERIAL;
fn ep_trace() -> Vec<String> {
let mut sc = scenarios::dflash("dflash_batched_ep", 2);
sc.cfg.ep = true;
let _g = SERIAL.lock().unwrap_or_else(|e| e.into_inner());
run_scenario(&sc)
}
#[test]
fn every_batched_verify_is_announced_before_and_judged_right_after() {
let trace = ep_trace();
let verifies: Vec<usize> = trace
.iter()
.enumerate()
.filter(|(_, l)| l.starts_with("decode_verify_batched("))
.map(|(i, _)| i)
.collect();
assert!(!verifies.is_empty(), "the scenario ran no batched verify");
for &i in &verifies {
assert!(
i >= 5,
"verify at line {i} has no room for its announcement"
);
let ks = trace[i]
.split("ks=[")
.nth(1)
.and_then(|r| r.split(']').next())
.expect("ks in the verify line");
let ks: Vec<usize> = ks.split(", ").map(|k| k.parse().unwrap()).collect();
let (n, k) = (ks.len(), ks[0]);
assert_eq!(
&trace[i - 5..i],
&[
"ep_broadcast_cmd_for_seq(seq=0, cmd=0xfffffff9)".to_string(),
format!("ep_broadcast_cmd({n:#x})"),
format!("ep_broadcast_cmd({k:#x})"),
format!("ep_broadcast_tokens(n={n})"),
format!("ep_broadcast_tokens(n={})", n * k),
],
"announcement before line {i}"
);
assert_eq!(
trace[i + 1],
format!("ep_broadcast_tokens(n={n})"),
"verdict after line {i}"
);
}
}
#[test]
fn a_single_rank_batched_verify_sends_nothing() {
let sc = scenarios::dflash("dflash_batched", 2);
let trace = {
let _g = SERIAL.lock().unwrap_or_else(|e| e.into_inner());
run_scenario(&sc)
};
assert!(
trace
.iter()
.any(|l| l.starts_with("decode_verify_batched("))
);
assert!(!trace.iter().any(|l| l.contains("cmd=0xfffffff9")));
}