systemd-resolved-rs 0.1.1

A compatibility-oriented reimplementation of systemd-resolved
#[cfg(test)]
mod test_16_parallel_address_families {
    use super::*;
    use crate::wire::LocalRecord;

    #[test]
    fn unspecified_family_dispatches_a_and_aaaa_together() {
        let socket = UdpSocket::bind("127.0.0.1:0").expect("mock DNS bind");
        let server_address = socket.local_addr().expect("mock DNS address");
        socket
            .set_read_timeout(Some(Duration::from_secs(2)))
            .expect("mock DNS timeout");

        let server = thread::spawn(move || {
            let mut requests = Vec::new();
            for _ in 0..2 {
                let mut buffer = [0; 2048];
                let (length, peer) = socket.recv_from(&mut buffer).expect("parallel DNS query");
                requests.push((buffer[..length].to_vec(), peer));
            }

            for (query, peer) in requests {
                let question = first_question(&query).expect("DNS question");
                let records = match question.rr_type {
                    TYPE_A => vec![LocalRecord::A(Ipv4Addr::new(192, 0, 2, 40))],
                    TYPE_AAAA => vec![LocalRecord::Aaaa(Ipv6Addr::new(
                        0x2001, 0xdb8, 0, 0, 0, 0, 0, 40,
                    ))],
                    _ => panic!("unexpected address query type"),
                };
                let response = local_response(&query, &records, 30).expect("mock address response");
                let response =
                    edns::add_test_response_opt(&response, 0, false).expect("response OPT");
                socket
                    .send_to(&response, peer)
                    .expect("mock DNS response");
            }
        });

        let resolver = Resolver::new(Config {
            upstreams: vec![server_address],
            fallback_upstreams: Vec::new(),
            cache: false,
            attempts: 1,
            query_timeout: Duration::from_millis(500),
            read_etc_hosts: false,
            read_static_records: false,
            dnssec: ValidationMode::No,
            ..Config::default()
        });
        let lookup = resolver
            .lookup_name("parallel-family.example", 0)
            .expect("dual-family lookup");

        assert_eq!(
            lookup.addresses,
            vec![
                IpAddr::V4(Ipv4Addr::new(192, 0, 2, 40)),
                IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 40)),
            ]
        );
        server.join().expect("mock DNS thread");
    }
}