From c43bef87f91e69206fc479a6f92d8cd6be5b9ec0 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 9 May 2024 06:59:54 +0000 Subject: [PATCH] recursor_test: backfill a CNAME test there are more cname tests to add, but they would fail without code change :) --- .../integration-tests/tests/recursor_tests.rs | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/integration-tests/tests/recursor_tests.rs b/tests/integration-tests/tests/recursor_tests.rs index 00ab005b..1523620c 100644 --- a/tests/integration-tests/tests/recursor_tests.rs +++ b/tests/integration-tests/tests/recursor_tests.rs @@ -94,6 +94,7 @@ const ZONE_EXAMPLE_COM: &str = r#" example.com. A 10.0.100.1 www.example.com. A 10.0.100.1 +cname.sub.example.com. CNAME www.example.com. "#; type HardcodedNameServer = NameServer; @@ -130,7 +131,7 @@ impl DnsHandle for HardcodedDnsHandle { let response_futures: Vec<_> = request.queries().iter().map(move |query| { let query = query.clone(); stream::once(async move { - println!("HardcodedDnsHandle: fielding query"); + println!("HardcodedDnsHandle: fielding query: {:?} {:?}", query.name(), query.query_type()); let mut response = Message::new(); response.add_query(query.clone()); response.set_message_type(MessageType::Response); @@ -371,3 +372,29 @@ fn test_recurse() { assert_eq!(&*lookup.records().to_vec(), &[expected_record]); } + +/// If `example.com.` is a NS and `sub.example.com.` doesn't exist, then `cname.sub.example.com.` +/// triggers a different codepath than `cname.example.com.`. The recursor tries to query the +/// latter as a NS (and receives a CNAME); the former is queried directly as a CNAME. +#[test] +fn test_cname_below_nonexistent_parent() { + logger("DEBUG"); + + let query = Query::query(Name::from_str("cname.sub.example.com.").unwrap(), RecordType::CNAME); + let expected_record = cname_record( + Name::from_str("cname.sub.example.com.").unwrap(), + Name::from_str("www.example.com.").unwrap(), + ); + + 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_record]); +}