use zenoh_keyexpr::keyexpr;
fn ke(s: &str) -> &keyexpr {
keyexpr::new(s).unwrap_or_else(|e| panic!("illegal key {s}: {e}"))
}
fn inter(a: &str, b: &str) -> bool {
ke(a).intersects(ke(b))
}
fn incl(rule: &str, key: &str) -> bool {
ke(rule).includes(ke(key))
}
const EXAMPLES: &[&str] = &[
"zensight/v1/h-3fa9c2d41b7e/telemetry/sysinfo/cpu/usage",
"zensight/v1/h-3fa9c2d41b7e/telemetry/snmp/router01/system/sys_uptime",
"zensight/v1/h-3fa9c2d41b7e/state/netring/health",
"zensight/v1/h-3fa9c2d41b7e/state/netlink/alert/9f2c81ab04d7e3f1",
"zensight/v1/h-3fa9c2d41b7e/state/netring/evidence/names/10-0-0-7",
"zensight/v1/h-3fa9c2d41b7e/events/netring/capture/01jgxqz4yqk8v6txw3m9f2a7cd",
"zensight/v1/h-3fa9c2d41b7e/@rpc/netlink/sockets",
"zensight/v1/h-3fa9c2d41b7e/@media/parallax/cam0/video/h264/high",
"zensight/v1/h-3fa9c2d41b7e/@blob/store/sha256/ab12cd34ef56",
"zensight/v1/@catalog/state/entity/h-3fa9c2d41b7e",
"zensight/v1/@catalog/state/alias/h-9d02aa17c44f",
"zensight/v1/@catalog/state/pdns/93-184-216-34",
"zensight/v1/h-3fa9c2d41b7e/state/netlink/alive",
"zensight/v1/@catalog/state/alive",
"zensight/v1/@catalog/state/claim/a0b1c2d3e4f5",
];
#[test]
fn example_set_is_legal_and_canon() {
for k in EXAMPLES {
assert_eq!(ke(k).as_str(), *k, "not canon: {k}");
}
}
#[test]
fn d1_version_isolation() {
for k in EXAMPLES {
let v2 = k.replace("zensight/v1/", "zensight/v2/");
assert!(
!inter("zensight/v1/**", &v2),
"a v1 selector must not see the v2 key {v2}"
);
assert!(
!inter("zensight/v2/**", k),
"a v2 selector must not see the v1 key {k}"
);
}
assert!(!inter(
"zensight/v1/*/telemetry/**",
"zensight/v2/h-3fa9c2d41b7e/telemetry/sysinfo/cpu/usage"
));
assert!(!inter(
"zensight/*/@/**",
"zensight/v1/h-3fa9c2d41b7e/state/netring/health"
));
assert!(!inter(
"zensight/_meta/**",
"zensight/v1/@catalog/state/entity/h-3fa9c2d41b7e"
));
assert!(
inter(
"zensight/**",
"zensight/v1/h-3fa9c2d41b7e/telemetry/sysinfo/cpu/usage"
),
"with a plain version chunk, an un-versioned firehose DOES see v1 \
(the retired legacy keyspace was the only such consumer)"
);
}
#[test]
fn d2_firehose_is_data_only() {
let fire = "zensight/v1/h-3fa9c2d41b7e/**";
for k in EXAMPLES.iter().filter(|k| k.contains("/h-3fa9c2d41b7e/")) {
let is_plane = k.contains("/@rpc/") || k.contains("/@media/") || k.contains("/@blob/");
assert_eq!(inter(fire, k), !is_plane, "{k}");
}
let sidecar = "zensight/v1/h-3fa9c2d41b7e/state/netring/health/@adv/pub/a0b1/42/m";
assert!(!inter(fire, sidecar));
}
#[test]
fn d3_class_disjointness() {
let classes = [
"zensight/v1/*/telemetry/**",
"zensight/v1/*/state/**",
"zensight/v1/*/events/**",
];
for (i, a) in classes.iter().enumerate() {
for (j, b) in classes.iter().enumerate() {
assert_eq!(inter(a, b), i == j);
}
}
}
#[test]
fn d4_service_exclusion() {
assert!(!inter(
"zensight/v1/*/state/**",
"zensight/v1/@catalog/state/entity/x"
));
assert!(!inter(
"zensight/v1/*/state/*/alive",
"zensight/v1/@catalog/state/alive"
));
assert!(!inter(
"zensight/v1/*/@rpc/**",
"zensight/v1/@catalog/@rpc/names"
));
}
#[test]
fn d5_targeted_and_fleet_rpc() {
assert!(inter(
"zensight/v1/*/@rpc/netlink/sockets",
"zensight/v1/h-3fa9c2d41b7e/@rpc/netlink/sockets"
));
assert!(!inter(
"zensight/v1/h-3fa9c2d41b7e/@rpc/netlink/sockets",
"zensight/v1/h-aaaaaaaaaaaa/@rpc/netlink/sockets"
));
}
#[test]
fn d6_acl_inclusion_per_plane() {
let host = "zensight/v1/h-3fa9c2d41b7e";
assert!(incl(
&format!("{host}/**"),
&format!("{host}/state/netlink/alert/9f2c81ab04d7e3f1")
));
assert!(incl(
&format!("{host}/**"),
&format!("{host}/state/netlink/alive")
));
assert!(!incl(
&format!("{host}/**"),
&format!("{host}/@rpc/netlink/sockets")
));
assert!(!incl(
&format!("{host}/**"),
&format!("{host}/@media/parallax/cam0/video/h264/high")
));
assert!(!incl(
&format!("{host}/**"),
&format!("{host}/@blob/store/sha256/ab12cd34ef56")
));
assert!(!incl(
&format!("{host}/**"),
&format!("{host}/state/x/y/@adv/pub/a/1/m")
));
assert!(incl(
&format!("{host}/@rpc/**"),
&format!("{host}/@rpc/netlink/sockets")
));
assert!(incl(
&format!("{host}/@media/**"),
&format!("{host}/@media/parallax/cam0/video/h264/high")
));
assert!(incl(
&format!("{host}/@blob/**"),
&format!("{host}/@blob/store/sha256/ab12cd34ef56")
));
assert!(incl(
&format!("{host}/**/@adv/**"),
&format!("{host}/state/x/y/@adv/pub/a/1/m")
));
assert!(incl(
"zensight/v1/*/@rpc/**",
"zensight/v1/h-3fa9c2d41b7e/@rpc/netlink/sockets"
));
assert!(!incl(
"zensight/v1/*/@rpc/**",
"zensight/v1/@catalog/@rpc/names"
));
assert!(incl("zensight/v1/**", "zensight/v1/*/state/**"));
assert!(!incl("zensight/v1/**", "zensight/**"));
}
#[test]
fn selector_precision() {
assert!(inter(
"zensight/v1/*/state/*/alert/*",
"zensight/v1/h-3fa9c2d41b7e/state/netlink/alert/9f2c81ab04d7e3f1"
));
assert!(!inter(
"zensight/v1/*/state/*/alert/*",
"zensight/v1/h-3fa9c2d41b7e/state/netring/health"
));
assert!(inter(
"zensight/v1/*/state/*/evidence/**",
"zensight/v1/h-3fa9c2d41b7e/state/netring/evidence/names/10-0-0-7"
));
assert!(!inter(
"zensight/v1/h-3fa9c2d41b7e/@media/parallax/cam0/video/h264/high",
"zensight/v1/h-3fa9c2d41b7e/@media/parallax/cam1/video/h264/high"
));
assert!(!inter(
"zensight/v1/h-3fa9c2d41b7e/@media/parallax/cam0/video/h264/high",
"zensight/v1/h-3fa9c2d41b7e/@media/parallax/cam0/video/h264/low"
));
assert!(!inter(
"zensight/v1/*/@rpc/netlink/sockets",
"zensight/v1/h-3fa9c2d41b7e/@rpc/netlink/sockets2"
));
}
#[test]
fn builders_match_examples() {
use zenkey::grammar::{self, Class, Origin, Producer};
use zenkey::origin::HostId;
let host = Origin::Host(HostId::parse("h-3fa9c2d41b7e").unwrap());
let netlink = Producer::new("netlink").unwrap();
let built = grammar::data_key(
&host,
Class::State,
Some(&netlink),
&["alert", "9f2c81ab04d7e3f1"],
)
.unwrap();
assert_eq!(
grammar::with_base("zensight", &built),
"zensight/v1/h-3fa9c2d41b7e/state/netlink/alert/9f2c81ab04d7e3f1"
);
ke(&grammar::with_base("zensight", &built));
}