use ddex_parser::parser::security::SecurityConfig;
use ddex_parser::{error::ParseError, DDEXParser};
use std::io::Cursor;
#[test]
fn test_depth_limit_enforcement() {
let deep_xml = create_deep_xml(105);
let security_config = SecurityConfig::strict();
let mut parser = DDEXParser::with_config(security_config);
let cursor = Cursor::new(deep_xml.as_bytes());
let result = parser.parse(cursor);
match result {
Err(ParseError::DepthLimitExceeded { depth, limit }) => {
assert!(depth > limit);
assert_eq!(limit, 100); }
other => panic!("Expected DepthLimitExceeded error, got: {:?}", other),
}
}
#[test]
fn test_depth_limit_within_bounds() {
let xml = create_deep_xml(50);
let mut parser = DDEXParser::new();
let cursor = Cursor::new(xml.as_bytes());
match parser.parse(cursor) {
Err(ParseError::DepthLimitExceeded { .. }) => {
panic!("Should not fail with depth limit error for depth 50");
}
_ => {
}
}
}
#[test]
fn test_custom_depth_limit() {
let xml = create_deep_xml(15);
let mut security_config = SecurityConfig::strict();
security_config.max_element_depth = 10;
let mut parser = DDEXParser::with_config(security_config);
let cursor = Cursor::new(xml.as_bytes());
let result = parser.parse(cursor);
match result {
Err(ParseError::DepthLimitExceeded { depth, limit }) => {
assert!(depth > 10);
assert_eq!(limit, 10);
}
other => panic!("Expected DepthLimitExceeded error, got: {:?}", other),
}
}
#[test]
fn test_relaxed_depth_limit() {
let xml = create_deep_xml(150);
let security_config = SecurityConfig::relaxed(); let mut parser = DDEXParser::with_config(security_config);
let cursor = Cursor::new(xml.as_bytes());
match parser.parse(cursor) {
Err(ParseError::DepthLimitExceeded { .. }) => {
panic!("Should not fail with depth limit error for depth 150 with relaxed config");
}
_ => {
}
}
}
fn create_deep_xml(depth: usize) -> String {
let mut xml = String::from(
r#"<?xml version="1.0" encoding="UTF-8"?>
<ern:NewReleaseMessage xmlns:ern="http://ddex.net/xml/ern/43"
xmlns:avs="http://ddex.net/xml/avs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ern:MessageHeader>
<ern:MessageId>MSG001</ern:MessageId>
<ern:MessageSender>
<ern:PartyId>SENDER001</ern:PartyId>
</ern:MessageSender>
<ern:MessageRecipient>
<ern:PartyId>RECIPIENT001</ern:PartyId>
</ern:MessageRecipient>
</ern:MessageHeader>
<ern:ReleaseList>
<ern:Release>
<ern:ReleaseId>REL001</ern:ReleaseId>
<ern:ReleaseReference>R001</ern:ReleaseReference>
"#,
);
for i in 0..depth {
xml.push_str(&format!(" <ern:NestedElement{}>", i));
}
xml.push_str("<ern:Content>Deep content</ern:Content>");
for i in (0..depth).rev() {
xml.push_str(&format!("</ern:NestedElement{}>", i));
}
xml.push_str(
r#"
</ern:Release>
</ern:ReleaseList>
</ern:NewReleaseMessage>"#,
);
xml
}