systemd-resolved-rs 0.1.1

A compatibility-oriented reimplementation of systemd-resolved
#[cfg(all(test, feature = "idna-name"))]
mod test_29_idna_questions {
    use super::*;
    use crate::wire::LocalRecord;

    fn resolver_for(server: SocketAddr) -> Resolver {
        Resolver::new(Config {
            upstreams: vec![server],
            fallback_upstreams: Vec::new(),
            cache: false,
            attempts: 1,
            query_timeout: Duration::from_secs(1),
            read_etc_hosts: false,
            read_static_records: false,
            dnssec: ValidationMode::No,
            ..Config::default()
        })
    }

    fn serve_one(expected_name: &'static str) -> (SocketAddr, thread::JoinHandle<()>) {
        let socket = UdpSocket::bind("127.0.0.1:0").expect("mock DNS bind");
        socket
            .set_read_timeout(Some(Duration::from_secs(3)))
            .expect("mock DNS timeout");
        let address = socket.local_addr().expect("mock DNS address");
        let worker = thread::spawn(move || {
            let mut buffer = [0; 2048];
            let (length, peer) = socket.recv_from(&mut buffer).expect("mock DNS query");
            let query = &buffer[..length];
            assert_eq!(
                first_question(query).expect("question").name.text(),
                expected_name
            );
            let response = local_response(
                query,
                &[LocalRecord::A(Ipv4Addr::new(192, 0, 2, 29))],
                30,
            )
            .expect("mock A response");
            socket.send_to(&response, peer).expect("mock DNS response");
        });
        (address, worker)
    }

    #[test]
    fn hostname_lookup_uses_idna_for_classic_dns() {
        let (server, worker) = serve_one("xn--bcher-kva.example");
        let lookup = resolver_for(server)
            .lookup_name_on_link_with_request_flags(
                "bücher.example",
                2,
                None,
                crate::dbus_resolve1_abi::flags::SD_RESOLVED_NO_SEARCH,
            )
            .expect("IDNA hostname lookup");
        assert_eq!(lookup.canonical_name, "xn--bcher-kva.example");
        assert_eq!(
            lookup.addresses,
            vec![IpAddr::V4(Ipv4Addr::new(192, 0, 2, 29))]
        );
        worker.join().expect("mock DNS worker");
    }

    #[test]
    fn explicit_record_lookup_preserves_utf8_question() {
        let (server, worker) = serve_one(r"b\195\188cher.example");
        resolver_for(server)
            .resolve_record("bücher.example", TYPE_A)
            .expect("UTF-8 record lookup");
        worker.join().expect("mock DNS worker");
    }
}