use zenkey::grammar::VERSION_CHUNK;
use zenoh::key_expr::format::kedefine;
use zenoh::key_expr::keyexpr;
kedefine!(
pub ke_liveliness: "${remaining:**}/@adv/${entity:*}/${zid:*}/${eid:*}/${meta:**}",
);
const ADV: &str = "/@adv/pub/9040a1aede048880bc9d045548d4d0a1/uhlc/_";
#[test]
fn adv_token_parses_on_a_data_key() {
let key = format!("zensight/{VERSION_CHUNK}/h-9706b31ddad3/telemetry/netring/tls/pq_ratio");
let token = format!("{key}{ADV}");
let parsed = ke_liveliness::parse(keyexpr::new(token.as_str()).unwrap()).unwrap_or_else(|_| {
panic!(
"zenoh-ext cannot parse the @adv token for {key}.\n\
If the version chunk became verbatim again, this is why that is not \
allowed: publisher detection dies silently and every subscriber's log \
fills with 'malformed liveliness token key expression'. \
See grammar::VERSION_CHUNK."
)
});
assert_eq!(parsed.remaining().unwrap().as_str(), key);
assert_eq!(parsed.zid().as_str(), "9040a1aede048880bc9d045548d4d0a1");
}
#[test]
fn a_verbatim_version_chunk_would_break_it_again() {
let good =
format!("zensight/{VERSION_CHUNK}/h-9706b31ddad3/telemetry/netring/tls/pq_ratio{ADV}");
let bad = format!("zensight/@v1/h-9706b31ddad3/telemetry/netring/tls/pq_ratio{ADV}");
assert!(ke_liveliness::parse(keyexpr::new(good.as_str()).unwrap()).is_ok());
assert!(
ke_liveliness::parse(keyexpr::new(bad.as_str()).unwrap()).is_err(),
"`**` is supposed to be unable to cross a verbatim chunk — that Zenoh rule \
is what D2/D4 rely on, and what the version chunk must therefore avoid"
);
}
#[test]
fn the_version_chunk_is_wildcard_reachable() {
assert!(
!VERSION_CHUNK.starts_with('@'),
"the version chunk must not be verbatim — see grammar::VERSION_CHUNK"
);
let star = keyexpr::new("zensight/*/h-9706b31ddad3/**").unwrap();
let key = format!("zensight/{VERSION_CHUNK}/h-9706b31ddad3/telemetry/sysinfo/cpu/usage");
assert!(
star.intersects(keyexpr::new(key.as_str()).unwrap()),
"a `*` must be able to match the version chunk"
);
}