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")); } }