From eeb415b3aeb7ad5e685c3bab1a412619f5e56082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Sun, 8 Mar 2020 15:57:48 +0100 Subject: [PATCH] tests: use the registry to make sure it finds the correct type --- lib/dnsbox-base/src/records/tests/mod.rs | 37 ++++++++++++++---------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/dnsbox-base/src/records/tests/mod.rs b/lib/dnsbox-base/src/records/tests/mod.rs index 7500c02..41a93b4 100644 --- a/lib/dnsbox-base/src/records/tests/mod.rs +++ b/lib/dnsbox-base/src/records/tests/mod.rs @@ -1,10 +1,10 @@ mod powerdns_tests; -use crate::common_types::classes; +use crate::common_types::{classes, Type}; use crate::errors::*; -use crate::records::structs; +use crate::records::{structs, registry}; use crate::ser::packet::DnsPacketData; -use crate::ser::{packet, text, StaticRRData}; +use crate::ser::{packet, text, StaticRRData, RRData}; use bytes::{Buf, Bytes}; use failure::ResultExt; use std::fmt; @@ -20,15 +20,22 @@ where Ok(result) } -fn rrdata_parse(data: &str) -> Result +fn rrdata_parse_type(q: Type, data: &str) -> Result> +{ + let mut ctx = text::DnsTextContext::new_root_origin(); + ctx.set_zone_class(classes::IN); + ctx.set_record_type(q); + ctx.set_last_ttl(3600); + text::parse_with(data, |data| registry::parse_rr_data(&ctx, data)) +} + +fn rrdata_parse_struct(data: &str) -> Result where T: StaticRRData, { - let mut ctx = text::DnsTextContext::new(); - ctx.set_zone_class(classes::IN); - ctx.set_record_type(T::TYPE); - ctx.set_last_ttl(3600); - text::parse_with(data, |data| T::dns_parse_rr_data(&ctx, data)) + // make sure registry parses the correct type + let result = rrdata_parse_type(T::TYPE, data)?.as_box_any(); + Ok(*result.downcast::().expect("registry decoded different type")) } fn check(txt: &str, data: &'static [u8]) -> Result<()> @@ -36,7 +43,7 @@ where T: StaticRRData + fmt::Debug + PartialEq, { let d1: T = rrdata_de(data).context("couldn't parse binary record")?; - let d2: T = rrdata_parse(txt).context("couldn't parse text record")?; + let d2: T = rrdata_parse_struct(txt).context("couldn't parse text record")?; failure::ensure!(d1 == d2, "decoded data not equal: {:?} != {:?}", d1, d2); Ok(()) } @@ -46,7 +53,7 @@ where T: StaticRRData + fmt::Debug + PartialEq, { let d1: T = rrdata_de(data).context("couldn't parse binary record")?; - let d2: T = rrdata_parse(txt).context("couldn't parse text record")?; + let d2: T = rrdata_parse_struct(txt).context("couldn't parse text record")?; failure::ensure!(d1 == d2, "decoded data not equal: {:?} != {:?}", d1, d2); let d1_text = d1.text().unwrap(); @@ -100,7 +107,7 @@ where s.push('a'); } s.push('"'); - rrdata_parse::(&s).unwrap_err(); + rrdata_parse_struct::(&s).unwrap_err(); } } @@ -154,8 +161,8 @@ fn test_nsec3() { .unwrap(); // invalid base32 texts - rrdata_parse::("1 2 300 - v").unwrap_err(); - rrdata_parse::("1 2 300 - vv").unwrap_err(); + rrdata_parse_struct::("1 2 300 - v").unwrap_err(); + rrdata_parse_struct::("1 2 300 - vv").unwrap_err(); // invalid (empty) next-hashed values packet::deserialize_with( @@ -170,7 +177,7 @@ fn test_nsec3param() { check::("1 2 300 -", b"\x01\x02\x01\x2c\x00").unwrap(); check::("1 2 300 ab", b"\x01\x02\x01\x2c\x01\xab").unwrap(); // `salt` hex string must not contain spaces - rrdata_parse::("1 2 300 a b").unwrap_err(); + rrdata_parse_struct::("1 2 300 a b").unwrap_err(); } #[test]