use fatt::resolver::DnsResolver;
use tempfile::tempdir;
#[test]
fn test_resolver_creation() -> anyhow::Result<()> {
let _temp_dir = tempdir()?;
let resolver = DnsResolver::new_for_testing()?;
assert!(resolver.is_test_resolver());
_temp_dir.close()?;
Ok(())
}
#[tokio::test]
async fn test_resolver_lookup() -> anyhow::Result<()> {
let resolver = DnsResolver::new_for_testing()?;
let first_result = resolver.lookup("example.com").await?;
let second_result = resolver.lookup("test.example.org").await?;
assert!(first_result.is_some());
assert!(second_result.is_some());
if let Some(ip) = &first_result {
assert!(!ip.is_empty(), "First lookup returned empty IP");
assert_eq!(ip, "192.0.2.1"); }
if let Some(ip) = &second_result {
assert!(!ip.is_empty(), "Second lookup returned empty IP");
assert_eq!(ip, "192.0.2.1");
}
Ok(())
}
#[tokio::test]
async fn test_resolver_concurrency() -> anyhow::Result<()> {
let resolver = DnsResolver::new_for_testing()?;
let futures = vec![
resolver.lookup("domain1.com"),
resolver.lookup("domain2.com"),
resolver.lookup("domain3.com"),
resolver.lookup("domain4.com"),
resolver.lookup("domain5.com"),
];
let results = futures::future::join_all(futures).await;
for result in results {
assert!(result.is_ok());
let ips = result?;
assert!(ips.is_some());
}
Ok(())
}
#[tokio::test]
async fn test_resolver_cache() -> anyhow::Result<()> {
let _temp_dir = tempdir()?;
let resolver = DnsResolver::new_for_testing()?;
let domain = "cached-example.com";
let first_result = resolver.lookup(domain).await?;
let second_result = resolver.lookup(domain).await?;
assert!(first_result.is_some());
assert!(second_result.is_some());
if let Some(ip) = &first_result {
assert!(!ip.is_empty(), "First lookup returned empty IP");
}
if let Some(ip) = &second_result {
assert!(!ip.is_empty(), "Second lookup returned empty IP");
}
assert_eq!(first_result, second_result);
Ok(())
}