use super::*;
fn header(qd: u16, an: u16, ns: u16, ar: u16) -> std::vec::Vec<u8> {
let mut h = std::vec![0u8; HEADER_SIZE];
h[4..6].copy_from_slice(&qd.to_be_bytes());
h[6..8].copy_from_slice(&an.to_be_bytes());
h[8..10].copy_from_slice(&ns.to_be_bytes());
h[10..12].copy_from_slice(&ar.to_be_bytes());
h
}
#[test]
fn malformed_question_surfaces_no_authority_or_additional() {
let mut msg = header(1, 0, 1, 1);
msg.push(0x05); let reader = MessageReader::try_parse(&msg).unwrap();
assert!(
reader.authority().next().is_none(),
"malformed question must surface no authority records"
);
assert!(
reader.additional().next().is_none(),
"malformed question must surface no additional records"
);
}
#[test]
fn malformed_answer_surfaces_no_additional() {
let mut msg = header(1, 1, 0, 1);
msg.extend_from_slice(&[0x00, 0x00, 0x01, 0x00, 0x01]);
msg.push(0x05);
let reader = MessageReader::try_parse(&msg).unwrap();
assert_eq!(
reader
.questions()
.filter(core::result::Result::is_ok)
.count(),
1,
"the well-formed question must still parse"
);
assert!(
reader.additional().next().is_none(),
"malformed answer must surface no additional records"
);
}
#[test]
fn well_formed_additional_is_still_surfaced() {
let mut msg = header(1, 0, 0, 1);
msg.extend_from_slice(&[0x00, 0x00, 0x01, 0x00, 0x01]);
msg.extend_from_slice(&[0x00]); msg.extend_from_slice(&1u16.to_be_bytes()); msg.extend_from_slice(&1u16.to_be_bytes()); msg.extend_from_slice(&120u32.to_be_bytes()); msg.extend_from_slice(&4u16.to_be_bytes()); msg.extend_from_slice(&[192, 168, 1, 10]); let reader = MessageReader::try_parse(&msg).unwrap();
let mut it = reader.additional();
let first = it
.next()
.expect("a valid additional record must be surfaced");
assert!(first.is_ok(), "the additional record must parse");
assert!(it.next().is_none(), "exactly one additional record");
}
#[test]
fn questions_iterator_yields_error_then_stops_on_truncated_question() {
let mut msg = header(1, 0, 0, 0);
msg.push(0x05);
let reader = MessageReader::try_parse(&msg).unwrap();
let mut questions = reader.questions();
assert!(
matches!(questions.next(), Some(Err(_))),
"a truncated question must surface a parse error"
);
assert!(questions.next().is_none());
}