use ftr::Ftr;
use std::net::IpAddr;
#[tokio::test]
async fn test_ftr_convenience_methods() {
let ftr = Ftr::new();
let ip: IpAddr = "8.8.8.8".parse().unwrap();
let result = ftr.lookup_asn(ip).await;
if std::env::var("CI").is_ok() && result.is_err() {
eprintln!(
"Skipping test in CI due to network error: {:?}",
result.err()
);
return;
}
assert!(result.is_ok(), "ASN lookup failed: {:?}", result.err());
let asn_info = result.unwrap();
eprintln!("DEBUG: ASN lookup for 8.8.8.8 returned:");
eprintln!(" ASN: {}", asn_info.asn);
eprintln!(" Name: '{}'", asn_info.name);
eprintln!(" Prefix: '{}'", asn_info.prefix);
eprintln!(" Country: '{}'", asn_info.country_code);
eprintln!(" Registry: '{}'", asn_info.registry);
assert_eq!(asn_info.asn, 15169);
let name_upper = asn_info.name.to_uppercase();
let is_google_asn =
name_upper.contains("GOOGLE") || name_upper.contains("GOOGL") || asn_info.asn == 15169;
assert!(
is_google_asn,
"Expected Google ASN (15169) or recognizable name, got: '{}' (ASN: {})",
asn_info.name, asn_info.asn
);
let dns_ip: IpAddr = "8.8.8.8".parse().unwrap();
let result = ftr.lookup_rdns(dns_ip).await;
if let Ok(hostname) = result {
assert!(hostname.contains("dns.google") || hostname.contains("google"));
}
}
#[tokio::test]
async fn test_service_isolation() {
let ftr1 = Ftr::new();
let ftr2 = Ftr::new();
let ip: IpAddr = "1.1.1.1".parse().unwrap();
let result1 = ftr1.lookup_asn(ip).await;
let result2 = ftr2.lookup_asn(ip).await;
if std::env::var("CI").is_ok() && (result1.is_err() || result2.is_err()) {
eprintln!("Skipping test in CI due to network error");
return;
}
assert!(result1.is_ok(), "First lookup failed: {:?}", result1.err());
assert!(result2.is_ok(), "Second lookup failed: {:?}", result2.err());
assert_eq!(result1.unwrap().asn, result2.unwrap().asn);
}
#[tokio::test]
async fn test_cache_clearing() {
let ftr = Ftr::new();
let ip: IpAddr = "8.8.4.4".parse().unwrap();
let first_result = ftr.lookup_asn(ip).await;
if std::env::var("CI").is_ok() && first_result.is_err() {
eprintln!("Skipping cache test in CI due to network error");
return;
}
ftr.clear_all_caches().await;
let result = ftr.lookup_asn(ip).await;
if std::env::var("CI").is_ok() && result.is_err() {
eprintln!("Skipping cache test in CI due to network error after clear");
return;
}
assert!(
result.is_ok(),
"Lookup after cache clear failed: {:?}",
result.err()
);
}
#[tokio::test]
async fn test_direct_service_access() {
let ftr = Ftr::new();
let asn_service = &ftr.services.asn;
let ip: IpAddr = "1.1.1.1".parse().unwrap();
let result = asn_service.lookup(ip).await;
if std::env::var("CI").is_ok() && result.is_err() {
eprintln!(
"Skipping test in CI due to network error: {:?}",
result.err()
);
return;
}
assert!(result.is_ok(), "ASN lookup failed: {:?}", result.err());
let stats = asn_service.cache_stats().await;
assert!(!stats.is_empty); }
#[tokio::test]
async fn test_private_ip_handling() {
let ftr = Ftr::new();
let private_ip: IpAddr = "192.168.1.1".parse().unwrap();
let result = ftr.lookup_asn(private_ip).await;
assert!(result.is_ok());
let asn_info = result.unwrap();
assert_eq!(asn_info.asn, 0); assert_eq!(asn_info.name, "Private Network");
}