1 // Copyright 2015-2018 Benjamin Fry <benjaminfry@me.com>
2 //
3 // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
4 // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5 // http://opensource.org/licenses/MIT>, at your option. This file may not be
6 // copied, modified, or distributed except according to those terms.
7 
8 #![cfg(feature = "dns-over-tls")]
9 
10 mod dns_over_native_tls;
11 mod dns_over_openssl;
12 mod dns_over_rustls;
13 
14 cfg_if! {
15     if #[cfg(feature = "dns-over-rustls")] {
16         pub(crate) use self::dns_over_rustls::new_tls_stream;
17         #[cfg(feature = "dns-over-https-rustls")]
18         pub(crate) use self::dns_over_rustls::CLIENT_CONFIG;
19     } else if #[cfg(feature = "dns-over-native-tls")] {
20         pub(crate) use self::dns_over_native_tls::new_tls_stream;
21     } else if #[cfg(feature = "dns-over-openssl")] {
22         pub(crate) use self::dns_over_openssl::new_tls_stream;
23     } else {
24         compile_error!("One of the dns-over-rustls, dns-over-native-tls, or dns-over-openssl must be enabled for dns-over-tls features");
25     }
26 }
27 
28 #[cfg(any(feature = "dns-over-native-tls", feature = "dns-over-rustls"))]
29 #[cfg(test)]
30 mod tests {
31     use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
32 
33     use tokio::runtime::Runtime;
34 
35     use crate::config::{ResolverConfig, ResolverOpts};
36     use crate::{TokioAsyncResolver, TokioHandle};
37 
tls_test(config: ResolverConfig)38     fn tls_test(config: ResolverConfig) {
39         //env_logger::try_init().ok();
40         let io_loop = Runtime::new().unwrap();
41 
42         let resolver = TokioAsyncResolver::new(config, ResolverOpts::default(), TokioHandle)
43             .expect("failed to create resolver");
44 
45         let response = io_loop
46             .block_on(resolver.lookup_ip("www.example.com."))
47             .expect("failed to run lookup");
48 
49         assert_eq!(response.iter().count(), 1);
50         for address in response.iter() {
51             if address.is_ipv4() {
52                 assert_eq!(address, IpAddr::V4(Ipv4Addr::new(93, 184, 216, 34)));
53             } else {
54                 assert_eq!(
55                     address,
56                     IpAddr::V6(Ipv6Addr::new(
57                         0x2606, 0x2800, 0x220, 0x1, 0x248, 0x1893, 0x25c8, 0x1946,
58                     ))
59                 );
60             }
61         }
62     }
63 
64     #[test]
65     #[cfg(not(windows))] // flakes on AppVeyor...
test_cloudflare_tls()66     fn test_cloudflare_tls() {
67         tls_test(ResolverConfig::cloudflare_tls())
68     }
69 
70     #[test]
71     #[cfg(not(windows))] // flakes on AppVeyor...
test_quad9_tls()72     fn test_quad9_tls() {
73         tls_test(ResolverConfig::quad9_tls())
74     }
75 }
76