use rust_xmpp::pep_diagnostics::{event_fields, item_fields};
use std::collections::BTreeMap;
fn item(xml: &str) -> BTreeMap<&'static str, String> {
let doc = roxmltree::Document::parse(xml).unwrap();
item_fields(doc.root_element()).into_iter().collect()
}
#[test]
fn nonempty_xml_can_be_an_empty_android_device_list() {
let fields = item(
"
",
);
assert_eq!(fields["device_protocol"], "legacy");
assert_eq!(fields["valid_device_count"], "0");
assert_eq!(fields["invalid_device_count"], "4");
assert!(!format!("{fields:?}").contains("bad-secret-id"));
}
#[test]
fn signed_integer_limits_and_duplicates_match_java_parser() {
let fields = item(
"
",
);
assert_eq!(fields["valid_device_count"], "4");
assert_eq!(fields["invalid_device_count"], "4");
}
#[test]
fn payloadless_notification_is_visible_without_identifiers() {
let doc = roxmltree::Document::parse(" ").unwrap();
let fields: BTreeMap<_, _> = event_fields(doc.root_element())
.unwrap()
.into_iter()
.collect();
assert_eq!(fields["node_kind"], "omemo-devices");
assert_eq!(fields["items_count"], "1");
assert_eq!(fields["content_present"], "false");
assert_eq!(fields["valid_device_count"], "0");
assert_eq!(fields["device_protocol"], "other");
let rendered = format!("{fields:?}");
for secret in ["private", "secret", "resource", "devicelist"] {
assert!(!rendered.contains(secret));
}
}
#[test]
fn only_first_direct_item_is_parsed_and_protocols_are_distinct() {
let doc = roxmltree::Document::parse(" ").unwrap();
let fields: BTreeMap<_, _> = event_fields(doc.root_element())
.unwrap()
.into_iter()
.collect();
assert_eq!(fields["device_protocol"], "omemo2");
assert_eq!(fields["items_count"], "2");
assert_eq!(fields["content_present"], "true");
assert_eq!(fields["valid_device_count"], "1");
}
#[test]
fn arbitrary_node_payload_and_wrong_namespace_do_not_leak() {
let doc = roxmltree::Document::parse("PRIVATE-KEY
").unwrap();
let fields: BTreeMap<_, _> = event_fields(doc.root_element())
.unwrap()
.into_iter()
.collect();
assert_eq!(fields["node_kind"], "other");
assert_eq!(fields["device_protocol"], "other");
assert_eq!(fields["content_present"], "true");
assert!(!format!("{fields:?}").contains("PRIVATE"));
for xml in [
"",
"",
"",
] {
let doc = roxmltree::Document::parse(xml).unwrap();
assert!(event_fields(doc.root_element()).is_none());
}
}
#[test]
fn avatar_classification_does_not_inspect_or_expose_avatar_data() {
for (node, expected) in [
("urn:xmpp:avatar:metadata", "avatar-metadata"),
("urn:xmpp:avatar:data", "avatar-data"),
] {
let xml = format!(
"- PRIVATE-IMAGE
"
);
let doc = roxmltree::Document::parse(&xml).unwrap();
let fields: BTreeMap<_, _> = event_fields(doc.root_element())
.unwrap()
.into_iter()
.collect();
assert_eq!(fields["node_kind"], expected);
assert!(!format!("{fields:?}").contains("PRIVATE"));
}
}