dnssector 0.2.14

A very fast library to parse, validate, create and mangle DNS packets
Documentation
use dnssector;

mod tests {
    use hex;

    use super::dnssector::constants::*;
    use super::dnssector::synth::gen::{self, RR};

    #[test]
    fn test_gen_a() {
        assert!(RR::from_string("example.com. 3599 IN A 1.2.3.4").is_ok());
        assert!(RR::from_string("example.com. 3599 IN A 350.2.3.4").is_err());
        assert!(RR::from_string("example.com. 3599 IN A 1.2.3").is_err());
        assert!(RR::from_string("example.com. 3599 IN A 1.2.3..4").is_err());
        assert!(RR::from_string("example.com. 3599 IN A").is_err());
    }

    #[test]
    fn test_gen_aaaa() {
        assert!(RR::from_string("example.com. 3599 IN AAAA fe80::64a0:11ff:dcb6:4b4d").is_ok());
        assert!(RR::from_string("example.com. 3599 IN AAAA fe80:::64a0:11ff:dcb6:4b4d").is_err());
        assert!(RR::from_string("example.com. 3599 IN AAAA 1.2.3.4").is_err());
        assert!(RR::from_string("example.com. 3599 IN AAAA").is_err());
    }

    #[test]
    fn test_gen_ptr() {
        assert!(RR::from_string("4.3.2.1.in-addr.arpa. 3599 IN PTR host.example.com.").is_ok());
        assert!(RR::from_string("4.3.2.1 3599 IN PTR host.example.com.").is_ok());
        assert!(RR::from_string("4.3.2.1. 3599 IN PTR host.example.com.").is_err());
        assert!(RR::from_string("4.3.2.1.in-addr.arpa. 3599 IN PTR 1.2.3.4").is_ok());
        assert!(RR::from_string("4.3.2.1.in-addr.arpa. 3599 IN PTR 1.2.3.4.").is_err());
    }

    #[test]
    fn test_gen_soa() {
        assert!(RR::from_string(
            "example.com. 86399 IN SOA ns1.example.com. hostmaster.example.com. (289 21600 3600 \
             604800 3600)"
        )
        .is_ok());
    }

    #[test]
    fn test_gen_txt() {
        assert!(RR::from_string("example.com. 86399 IN TXT \"Sample text\"").is_ok());
        assert!(RR::from_string(
            "example.com. 86399 IN TXT \"Sample escaped \\000\\008\\128\\255 text\""
        )
        .is_ok());
        assert!(RR::from_string(
            "example.com. 86399 IN TXT \"Long text that has to be split into chunks: Lorem ipsum \
             dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut \
             labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation \
             ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in \
             reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \
             Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \
             mollit anim id est laborum.\""
        )
        .is_ok());
        assert!(RR::from_string("example.com. 86399 IN TXT \"\"").is_err());
        assert!(RR::from_string("example.com. 86399 IN TXT unquoted").is_err());
        assert!(RR::from_string("example.com. 86399 IN TXT").is_err());
    }

    #[test]
    fn test_gen_mx() {
        assert!(RR::from_string("example.com. 86399 IN MX 0 mx.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN MX 1000 mx.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN MX 1000000000 mx.example.com.").is_err());
        assert!(RR::from_string("example.com. 86399 IN MX 1000000000").is_err());
        assert!(RR::from_string("example.com. 86399 IN MX mx.example.com.").is_err());
        assert!(RR::from_string("example.com. 86399 IN MX").is_err());
    }

    #[test]
    fn test_gen_cname() {
        assert!(RR::from_string("example.com. 86399 IN CNAME www.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN CNAME www1.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN CNAME 1www.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN CNAME").is_err());
    }

    #[test]
    fn test_gen_ns() {
        assert!(RR::from_string("example.com. 86399 IN NS www.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN NS www1.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN NS 1www.example.com.").is_ok());
        assert!(RR::from_string("example.com. 86399 IN NS").is_err());
    }

    #[test]
    fn test_gen_ds() {
        assert!(RR::from_string(
            "fr. 10464 IN DS 35095 8 2 \
             23C6CAADC9927EE98061F2B52C9B8DA6B53F3F648F814A4A86A0FAF9843E2C4E A"
        )
        .is_err());
        assert!(RR::from_string(
            "fr. 10464 IN DS 35095 A 2 \
             23C6CAADC9927EE98061F2B52C9B8DA6B53F3F648F814A4A86A0FAF9843E2C4E"
        )
        .is_err());
        assert!(RR::from_string(
            "fr. 10464 IN DS 35095 8 2 \
             Z23C6CAADC9927EE98061F2B52C9B8DA6B53F3F648F814A4A86A0FAF843E2C4E"
        )
        .is_err());
        let rr = RR::from_string(
            "fr. 10464 IN DS 35095 8 2 \
             23C6CAADC9927EE98061F2B52C9B8DA6B53F3F648F814A4A86A0FAF9843E2C4E",
        );
        assert!(rr.is_ok());
        let rr = rr.unwrap();
        let rdata = rr.rdata();
        assert_eq!(rdata.len(), 36);
        assert_eq!(&rdata[0..2], [137, 23]);
        assert_eq!(rdata[2], 8);
        assert_eq!(rdata[3], 2);
        assert_eq!(
            &rdata[4..],
            hex::decode("23C6CAADC9927EE98061F2B52C9B8DA6B53F3F648F814A4A86A0FAF9843E2C4E")
                .unwrap()
                .as_slice()
        );
    }

    #[test]
    fn test_gen_question() {
        RR::new_question(
            b"example.com",
            Type::from_string("A").unwrap(),
            Class::from_string("IN").unwrap(),
        )
        .unwrap();
        let parsed_packet = gen::query(
            b"example.com",
            Type::from_string("A").unwrap(),
            Class::from_string("IN").unwrap(),
        )
        .unwrap();
        let packet = parsed_packet.into_packet();
        let expected: [u8; 29] = [
            0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 101, 120, 97, 109, 112, 108, 101, 3, 99, 111,
            109, 0, 0, 1, 0, 1,
        ];
        assert_eq!(&packet[2..], &expected[2..]);
    }
}