pi_dns_resolver 0.2.0

Provides related functions for asynchronous domain name resolution
use std::str::FromStr;
use std::time::Instant;
use std::net::{ToSocketAddrs, SocketAddr};

use crossbeam_channel::bounded;
use pi_dns_resolver::{DNSResolver, init_global_dns_resolve_service, join_dns_resolver, async_resolve_ip, local_domain};

#[test]
fn test_local_system_resolver() {
    let mut addrs_iter = "www.google.com:443".to_socket_addrs().unwrap();
    while let Some(address) = addrs_iter.next() {
        println!("address: {:?}", address);
    }
}

#[test]
fn test_async_resolve_ip() {
    init_global_dns_resolve_service();
    join_dns_resolver("sys", DNSResolver::with_system().unwrap());

    let (sender, receiver) = bounded(1);
    let sender_copy = sender.clone();
    if let Err(e) = async_resolve_ip(None,
                     "translate.googleapis.com",
                     move |result| {
                         match result {
                             Err(e) => panic!("{:?}", e),
                             Ok(addrs) => {
                                 assert!(addrs.len() > 0);
                                 let _ = sender_copy.send(());
                             },
                         }
                     }) {
        panic!("{:?}", e);
    }

    if let Err(e) = receiver.recv() {
        panic!("{:?}", e);
    }

    let sender_copy = sender.clone();
    if let Err(e) = async_resolve_ip(Some("sys"),
                                     "translate.googleapis.com",
                                     move  |result| {
                                         match result {
                                             Err(e) => panic!("{:?}", e),
                                             Ok(addrs) => {
                                                 assert!(addrs.len() > 0);
                                                 let _ = sender_copy.send(());
                                             },
                                         }
                                     }) {
        panic!("{:?}", e);
    }

    if let Err(e) = receiver.recv() {
        panic!("{:?}", e);
    }
}

#[test]
fn test_local_domain() {
    println!("local: {:?}", local_domain());
}

#[test]
fn test_with_local_hosts_conf() {
    let resolver = DNSResolver::with_local_hosts_conf().unwrap();
    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("www.qq.com") {
        assert!(addrs.is_empty());
    } else {
        panic!("lookup_ip www.qq.com failed");
    }
    println!("lookup_ip www.qq.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("translate.googleapis.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip translate.googleapis.com failed");
    }
    println!("lookup_ip translate.googleapis.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("test.17youx.cn") {
        assert!(addrs.len() == 1);
        assert_eq!(addrs[0], SocketAddr::from_str("127.0.0.1:0").unwrap());
    } else {
        panic!("lookup_ip test.17youx.cn failed");
    }
    println!("lookup_ip test.17youx.cn, time: {:?}", now.elapsed());
}

#[test]
fn test_with_system() {
    let resolver = DNSResolver::with_system().unwrap();
    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("www.qq.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip www.qq.com failed");
    }
    println!("lookup_ip www.qq.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("translate.googleapis.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip translate.googleapis.com failed");
    }
    println!("lookup_ip translate.googleapis.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("test.17youx.cn") {
        assert!(addrs.len() == 1);
        assert_eq!(addrs[0], SocketAddr::from_str("127.0.0.1:0").unwrap());
    } else {
        panic!("lookup_ip test.17youx.cn failed");
    }
    println!("lookup_ip test.17youx.cn, time: {:?}", now.elapsed());
}

#[test]
fn test_with_system_conf() {
    let resolver = DNSResolver::with_system_conf().unwrap();
    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("www.qq.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip www.qq.com failed");
    }
    println!("lookup_ip www.qq.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("translate.googleapis.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip translate.googleapis.com failed");
    }
    println!("lookup_ip translate.googleapis.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("test.17youx.cn") {
        assert!(addrs.len() == 1);
        assert_eq!(addrs[0], SocketAddr::from_str("127.0.0.1:0").unwrap());
    } else {
        panic!("lookup_ip test.17youx.cn failed");
    }
    println!("lookup_ip test.17youx.cn, time: {:?}", now.elapsed());
}

#[test]
fn test_with_google() {
    let resolver = DNSResolver::with_google().unwrap();
    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("www.qq.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip www.qq.com failed");
    }
    println!("lookup_ip www.qq.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("translate.googleapis.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip translate.googleapis.com failed");
    }
    println!("lookup_ip translate.googleapis.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("test.17youx.cn") {
        assert!(addrs.len() == 1);
        assert_eq!(addrs[0], SocketAddr::from_str("127.0.0.1:0").unwrap());
    } else {
        panic!("lookup_ip test.17youx.cn failed");
    }
    println!("lookup_ip test.17youx.cn, time: {:?}", now.elapsed());
}

#[test]
fn test_with_cloudflare() {
    let resolver = DNSResolver::with_cloudflare().unwrap();
    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("www.qq.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip www.qq.com failed");
    }
    println!("lookup_ip www.qq.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("translate.googleapis.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip translate.googleapis.com failed");
    }
    println!("lookup_ip translate.googleapis.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("test.17youx.cn") {
        assert!(addrs.len() == 1);
        assert_eq!(addrs[0], SocketAddr::from_str("127.0.0.1:0").unwrap());
    } else {
        panic!("lookup_ip test.17youx.cn failed");
    }
    println!("lookup_ip test.17youx.cn, time: {:?}", now.elapsed());
}

#[test]
fn test_with_quad9() {
    let resolver = DNSResolver::with_quad9().unwrap();
    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("www.qq.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip www.qq.com failed");
    }
    println!("lookup_ip www.qq.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("translate.googleapis.com") {
        assert!(addrs.len() > 0);
    } else {
        panic!("lookup_ip translate.googleapis.com failed");
    }
    println!("lookup_ip translate.googleapis.com, time: {:?}", now.elapsed());

    let now = Instant::now();
    if let Ok(addrs) = resolver.lookup_ip("test.17youx.cn") {
        assert!(addrs.len() == 1);
        assert_eq!(addrs[0], SocketAddr::from_str("127.0.0.1:0").unwrap());
    } else {
        panic!("lookup_ip test.17youx.cn failed");
    }
    println!("lookup_ip test.17youx.cn, time: {:?}", now.elapsed());
}