diff --git a/tests/integration-tests/tests/recursor_tests.rs b/tests/integration-tests/tests/recursor_tests.rs index 9291d2b0..b69f362e 100644 --- a/tests/integration-tests/tests/recursor_tests.rs +++ b/tests/integration-tests/tests/recursor_tests.rs @@ -39,6 +39,7 @@ use hickory_server::store::in_memory::InMemoryAuthority; const NS_ROOT: IpAddr = IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1)); const NS_TLDS: IpAddr = IpAddr::V4(Ipv4Addr::new(10, 0, 0, 2)); const NS_IANA: IpAddr = IpAddr::V4(Ipv4Addr::new(10, 0, 0, 3)); +const NS_ORG: IpAddr = IpAddr::V4(Ipv4Addr::new(10, 0, 0, 4)); const ZONE_ROOT: &str = r#" @@ -56,6 +57,9 @@ com NS a.gtld-servers.net. a.gtld-servers.net A 10.0.0.2 net NS a.gtld-servers.net. + +org NS b0.org.afilias-nst.org. +b0.org.afilias-nst.org. A 10.0.0.4 "#; const ZONE_TLDS: &str = r#" @@ -68,6 +72,7 @@ const ZONE_TLDS: &str = r#" com. TXT my-text-record example.com. NS a.iana-servers.net. +example.org. NS a.iana-servers.net. iana-servers.net. NS a.iana-servers.net. a.iana-servers.net. A 10.0.0.3 "#; @@ -96,6 +101,24 @@ example.com. A 10.0.100.1 www.example.com. A 10.0.100.1 cname.sub.example.com. CNAME www.example.com. cname.example.com. CNAME www.example.com. +org-cname.example.com. CNAME example.org. +"#; + +const ZONE_ORG: &str = r#" +@ IN SOA a0.org.afilias-nst.info. hostmaster.donuts.email. 20 7200 600 3600000 60 + +example.org. NS a.iana-servers.net. +"#; + +const ZONE_EXAMPLE_ORG: &str = r#" +@ IN SOA a.iana-servers.net. noc.dns.icann.org. ( + 20 ; SERIAL + 7200 ; REFRESH + 600 ; RETRY + 3600000; EXPIRE + 60) ; MINIMUM + +example.org. A 10.0.100.2 "#; type HardcodedNameServer = NameServer; @@ -201,6 +224,10 @@ fn make_catalog_for(nameserver: SocketAddr) -> Catalog { s if s == SocketAddr::new(NS_IANA, 53) => vec![ ("iana-servers.net.", ZONE_IANA), ("example.com.", ZONE_EXAMPLE_COM), + ("example.org.", ZONE_EXAMPLE_ORG), + ], + s if s == SocketAddr::new(NS_ORG, 53) => vec![ + ("org.", ZONE_ORG), ], ns => panic!("unexpected nameserver {:?}", ns), }; @@ -456,3 +483,33 @@ fn test_cname_queried_as_v4() { assert_eq!(&*lookup.records().to_vec(), &expected_records); } + +/// Follow a CNAME from one zone to another, but where the target is still served by the same NS. +#[test] +fn test_cname_to_other_zone() { + logger("DEBUG"); + + let query = Query::query(Name::from_str("org-cname.example.com.").unwrap(), RecordType::A); + let expected_records = [ + cname_record( + Name::from_str("org-cname.example.com.").unwrap(), + Name::from_str("example.org.").unwrap(), + ), + v4_record( + Name::from_str("example.org.").unwrap(), + Ipv4Addr::new(10, 0, 100, 2), + ), + ]; + + let roots = NameServerPool::from_nameservers( + Default::default(), + vec![mock_nameserver(NS_ROOT)], + vec![], + ); + let recursor = Recursor::new_with_pool(roots, 1024, 1048576).unwrap(); + + let now = Instant::now(); + let lookup = block_on(recursor.resolve(query, now)).unwrap(); + + assert_eq!(&*lookup.records().to_vec(), &expected_records); +}