From c6a3e1de09ef4fdaa278c5c42f239d237ad5b08e Mon Sep 17 00:00:00 2001 From: Ephy Date: Wed, 29 Nov 2023 03:20:06 -0300 Subject: [PATCH 01/15] add integration test section 6.2.1 - 6.2.2 --- tests/integration_test.rs | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 tests/integration_test.rs diff --git a/tests/integration_test.rs b/tests/integration_test.rs new file mode 100644 index 00000000..3cc81768 --- /dev/null +++ b/tests/integration_test.rs @@ -0,0 +1,53 @@ +use std::{net::IpAddr, str::FromStr}; + +use dns_rust::{async_resolver::{config::ResolverConfig, AsyncResolver, resolver_error::ResolverError}, message::{resource_record::ResourceRecord, rdata::Rdata}}; + + + +// TODO: Change params type to intoDomainName +async fn query_response(domain_name: &str, qtype: &str) -> Result, ResolverError>{ + + let config = ResolverConfig::default(); + let mut resolver = AsyncResolver::new(config); + + let response = resolver.lookup(domain_name, "UDP", qtype).await; + + response +} + +/// 6.2.1 Query test Qtype = A +#[tokio::test] +async fn query_a_type() { + let response = query_response("example.com", "A").await; + + if let Ok(rrs) = response { + assert_eq!(rrs.iter().count(), 1); + let rdata = rrs[0].get_rdata(); + if let Rdata::A(ip) = rdata { + assert_eq!(ip.get_address(), IpAddr::from_str("93.184.216.34").unwrap()); + } else { + panic!("Error parsing response"); + } + } else { + panic!("No response") + } +} + +/// 6.2.2 Query normal Qtype = * +#[tokio::test] +async fn query_all_type() { + let response = query_response("example.com", "ANY").await; + if let Ok(rrs) = response { + assert_eq!(rrs.iter().count(), 2); + } else { + panic!("No response") + } +} + +// TODO: 6.2.3 Query normal Qtype = MX + +// TODO: 6.2.4 Query normal Qtype = NS + +// TODO: 6.2.5 Dominio mal escrito Qtype = A + + From 7c936b5790bed38ff668dcda44712da24c383945 Mon Sep 17 00:00:00 2001 From: Ephy Date: Wed, 29 Nov 2023 03:25:28 -0300 Subject: [PATCH 02/15] update query response --- tests/integration_test.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 3cc81768..02605362 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -10,7 +10,11 @@ async fn query_response(domain_name: &str, qtype: &str) -> Result Date: Wed, 29 Nov 2023 15:56:56 -0300 Subject: [PATCH 03/15] change docker compose --- docker-compose.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 40a2abde..9cdb0099 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,7 @@ version: "4" services: - resolver: - build: . - image: dns-rust:latest - ports: - - "58396:58396" - network_mode: "dns" - client: - container_name: client + dns_rust: + container_name: dns_rust build: . image: dns-rust:latest test: From c34a30a69c74d308c77941fdb0b8e32b0264a28e Mon Sep 17 00:00:00 2001 From: Ephyy Date: Wed, 29 Nov 2023 15:57:20 -0300 Subject: [PATCH 04/15] update main client --- src/main.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index c2d4ec63..a68ffc04 100644 --- a/src/main.rs +++ b/src/main.rs @@ -99,9 +99,11 @@ pub async fn main() { let conn = ClientTCPConnection::new(addr.unwrap(), Duration::from_secs(10)); let mut client = Client::new(conn); - let mut _response = client.query(DomainName::new_from_string(client_args.host_name.clone()), client_args.qtype.as_str(), client_args.qclass.as_str()); + let response = client.query(DomainName::new_from_string(client_args.host_name.clone()), client_args.qtype.as_str(), client_args.qclass.as_str()); - //response.print_dns_message() + if let Ok(mut resp) = response { + resp.print_dns_message() + } } Commands::Resolver(resolver_args) => { From dd4c117ab5797beb0d51b0041e7e9778e10d9d45 Mon Sep 17 00:00:00 2001 From: Ephy Date: Mon, 4 Dec 2023 02:15:01 -0300 Subject: [PATCH 05/15] add ns query integration tests --- tests/integration_test.rs | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 02605362..7be8cc40 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -1,6 +1,6 @@ use std::{net::IpAddr, str::FromStr}; -use dns_rust::{async_resolver::{config::ResolverConfig, AsyncResolver, resolver_error::ResolverError}, message::{resource_record::ResourceRecord, rdata::Rdata}}; +use dns_rust::{async_resolver::{config::ResolverConfig, AsyncResolver, resolver_error::ResolverError}, message::{resource_record::ResourceRecord, rdata::Rdata}, domain_name::DomainName}; @@ -30,7 +30,7 @@ async fn query_a_type() { if let Rdata::A(ip) = rdata { assert_eq!(ip.get_address(), IpAddr::from_str("93.184.216.34").unwrap()); } else { - panic!("Error parsing response"); + panic!("No ip address"); } } else { panic!("No response") @@ -42,7 +42,7 @@ async fn query_a_type() { async fn query_all_type() { let response = query_response("example.com", "ANY").await; if let Ok(rrs) = response { - assert_eq!(rrs.iter().count(), 2); + assert_eq!(rrs.len(), 2); } else { panic!("No response") } @@ -50,7 +50,34 @@ async fn query_all_type() { // TODO: 6.2.3 Query normal Qtype = MX + // TODO: 6.2.4 Query normal Qtype = NS +#[tokio::test] +async fn query_ns_type() { + let response = query_response("example.com", "NS").await; + if let Ok(rrs) = response { + assert_eq!(rrs.len(), 2); + + if let Rdata::NS(ns1) = rrs[0].get_rdata() { + assert_eq!( + ns1.get_nsdname(), + DomainName::new_from_str("a.iana-servers.net")) + } else { + panic!("First record is not type NS"); + } + + if let Rdata::NS(ns) = rrs[1].get_rdata() { + assert_eq!( + ns.get_nsdname(), + DomainName::new_from_str("b.iana-servers.net")) + } else { + panic!("Second record is not type NS"); + } + + } else { + panic!("No response received") + } +} // TODO: 6.2.5 Dominio mal escrito Qtype = A From e84828d57a545082cfe7843b4c8dcf3bdb56abdc Mon Sep 17 00:00:00 2001 From: Ephyy Date: Mon, 4 Dec 2023 16:27:09 -0300 Subject: [PATCH 06/15] add no resource and mistyped name integration test --- tests/integration_test.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 7be8cc40..79c617a0 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -48,10 +48,13 @@ async fn query_all_type() { } } -// TODO: 6.2.3 Query normal Qtype = MX +// TODO: 6.2.3 Query Qtype = MX +async fn query_mx_type() { + unimplemented!(); +} -// TODO: 6.2.4 Query normal Qtype = NS +// 6.2.4 Query Qtype = NS #[tokio::test] async fn query_ns_type() { let response = query_response("example.com", "NS").await; @@ -79,6 +82,19 @@ async fn query_ns_type() { } } -// TODO: 6.2.5 Dominio mal escrito Qtype = A +/// 6.2.5 Mistyped host name Qtype = A +#[tokio::test] +async fn mistyped_host_name() { + let response = query_response("exampllee.com", "A").await; + assert!(response.is_err()); +} + +/// No record test +#[tokio::test] +async fn no_resource_available() { + let response = query_response("example.com", "CNAME").await; + assert!(response.is_err()); +} + From b56e489b13cbefa2040abef0d895f71bec3be259 Mon Sep 17 00:00:00 2001 From: Ephyy Date: Mon, 4 Dec 2023 16:32:46 -0300 Subject: [PATCH 07/15] add mx query integration test --- tests/integration_test.rs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 79c617a0..d7cb9cb1 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -48,9 +48,30 @@ async fn query_all_type() { } } -// TODO: 6.2.3 Query Qtype = MX +/// 6.2.3 Query Qtype = MX +#[tokio::test] async fn query_mx_type() { - unimplemented!(); + let response = query_response("example.com", "MX").await; + + if let Ok(rrs) = response { + assert_eq!(rrs.len(), 1); + + if let Rdata::MX(mxdata) = rrs[0].get_rdata() { + assert_eq!( + mxdata.get_exchange(), + DomainName::new_from_str("")); + + assert_eq!( + mxdata.get_preference(), + 0 + ) + } else { + panic!("Record is not MX type"); + } + + } else { + panic!("No response received") + } } @@ -66,7 +87,7 @@ async fn query_ns_type() { ns1.get_nsdname(), DomainName::new_from_str("a.iana-servers.net")) } else { - panic!("First record is not type NS"); + panic!("First record is not NS"); } if let Rdata::NS(ns) = rrs[1].get_rdata() { @@ -74,7 +95,7 @@ async fn query_ns_type() { ns.get_nsdname(), DomainName::new_from_str("b.iana-servers.net")) } else { - panic!("Second record is not type NS"); + panic!("Second record is not NS"); } } else { From 66c04f8c8cb6dbc601d4bfc58a0f47a409f3568e Mon Sep 17 00:00:00 2001 From: Ephy Date: Thu, 14 Dec 2023 02:33:44 -0300 Subject: [PATCH 08/15] test: update integration_test.rs --- tests/integration_test.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index d7cb9cb1..b8423e21 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -41,6 +41,7 @@ async fn query_a_type() { #[tokio::test] async fn query_all_type() { let response = query_response("example.com", "ANY").await; + if let Ok(rrs) = response { assert_eq!(rrs.len(), 2); } else { From 4d302afe3cfa9577bd518be558f54faae8ad9dc4 Mon Sep 17 00:00:00 2001 From: Ephy Date: Thu, 14 Dec 2023 02:34:48 -0300 Subject: [PATCH 09/15] test: add inner lookup cache test cases --- src/async_resolver.rs | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/async_resolver.rs b/src/async_resolver.rs index 4d3fbc6f..f03522b6 100644 --- a/src/async_resolver.rs +++ b/src/async_resolver.rs @@ -524,9 +524,9 @@ mod async_resolver_test { } } - /// Test lookup cache + /// Test inner lookup cache #[tokio::test] - async fn lookup_cache() { + async fn inner_lookup_cache_available() { let mut resolver = AsyncResolver::new(ResolverConfig::default()); resolver.cache.set_max_size(1); @@ -537,7 +537,40 @@ mod async_resolver_test { resolver.cache.add(domain_name, resource_record); - let _response = resolver.lookup("example.com", "UDP", "A","IN").await; + let domain_name = DomainName::new_from_string("example.com".to_string()); + let response = resolver.inner_lookup(domain_name, Qtype::A, Qclass::IN).await; + + if let Ok(msg) = response { + assert_eq!(msg.get_header().get_aa(), false); + } else { + panic!("No response from cache"); + } + } + + /// Test inner lookup without cache + #[tokio::test] + async fn inner_lookup_with_no_cache() { + let mut config = ResolverConfig::default(); + config.set_cache_enabled(false); + + let mut resolver = AsyncResolver::new(config); + resolver.cache.set_max_size(1); + + let domain_name = DomainName::new_from_string("example.com".to_string()); + let a_rdata = ARdata::new_from_addr(IpAddr::from_str("93.184.216.34").unwrap()); + let a_rdata = Rdata::A(a_rdata); + let resource_record = ResourceRecord::new(a_rdata); + + resolver.cache.add(domain_name, resource_record); + + let domain_name = DomainName::new_from_string("example.com".to_string()); + let response = resolver.inner_lookup(domain_name, Qtype::A, Qclass::IN).await; + + if let Ok(msg) = response { + assert_eq!(msg.get_header().get_aa(), false); + } else { + panic!("No response from nameserver"); + } } /// Test cache data @@ -546,7 +579,7 @@ mod async_resolver_test { let mut resolver = AsyncResolver::new(ResolverConfig::default()); resolver.cache.set_max_size(1); assert_eq!(resolver.cache.is_empty(), true); - let _response = resolver.lookup("example.com", "UDP", "A","IN").await; + let _response = resolver.lookup("example.com", "UDP", "A", "IN").await; assert_eq!(resolver.cache.is_cached(DomainName::new_from_str("example.com"), Rtype::A), true); // TODO: Test special cases from RFC From 761f72218dafe35c3b425cae8a2b142af6f802ba Mon Sep 17 00:00:00 2001 From: Ephyy Date: Mon, 18 Dec 2023 20:27:18 -0300 Subject: [PATCH 10/15] test: update integration_test.rs --- tests/integration_test.rs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index b8423e21..3a3e1f1a 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -5,14 +5,14 @@ use dns_rust::{async_resolver::{config::ResolverConfig, AsyncResolver, resolver_ // TODO: Change params type to intoDomainName -async fn query_response(domain_name: &str, qtype: &str) -> Result, ResolverError>{ +async fn query_response(domain_name: &str, protocol: &str, qtype: &str) -> Result, ResolverError>{ let config = ResolverConfig::default(); let mut resolver = AsyncResolver::new(config); let response = resolver.lookup( domain_name, - "UDP", + protocol, qtype, "IN").await; @@ -22,7 +22,7 @@ async fn query_response(domain_name: &str, qtype: &str) -> Result Date: Mon, 18 Dec 2023 20:30:46 -0300 Subject: [PATCH 11/15] test: update integration_test.rs warning --- tests/integration_test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 3a3e1f1a..62a07172 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -41,7 +41,7 @@ async fn query_a_type() { #[tokio::test] #[should_panic] async fn query_all_type() { - let response = query_response("example.com", "TCP", "ANY").await; + let __response = query_response("example.com", "TCP", "ANY").await; } /// 6.2.3 Query Qtype = MX From 5e8fc093d34adb594eb2f68994037c59686c2d5d Mon Sep 17 00:00:00 2001 From: Ephyy Date: Mon, 18 Dec 2023 20:40:05 -0300 Subject: [PATCH 12/15] test: update integration_test.rs, qtype=any test --- tests/integration_test.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 62a07172..fad5dd26 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -39,9 +39,11 @@ async fn query_a_type() { /// 6.2.2 Query normal Qtype = * #[tokio::test] -#[should_panic] async fn query_all_type() { - let __response = query_response("example.com", "TCP", "ANY").await; + let udp_response = query_response("example.com", "UDP", "ANY").await; + let tcp_response = query_response("example.com", "TCP", "ANY").await; + assert!(udp_response.is_err()); + assert!(tcp_response.is_err()); } /// 6.2.3 Query Qtype = MX From ffd818dc63d73df42fe5ee4f5dcd0fe05fb87a79 Mon Sep 17 00:00:00 2001 From: Ephyy Date: Wed, 20 Dec 2023 11:35:18 -0300 Subject: [PATCH 13/15] update question.rs, remove print --- src/message/question.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/message/question.rs b/src/message/question.rs index 8f5473b9..32d1d32a 100644 --- a/src/message/question.rs +++ b/src/message/question.rs @@ -76,7 +76,6 @@ impl Question { let (qname, bytes_without_name) = domain_name_result.unwrap(); - println!("{}", bytes_without_name.len()); if bytes_without_name.len() < 4 { return Err("Format Error"); } From 734a0956170014b8ece19b43f857b35e3636fd5d Mon Sep 17 00:00:00 2001 From: Ephy Date: Tue, 9 Jan 2024 23:48:22 -0300 Subject: [PATCH 14/15] test: update integration_test.rs --- tests/integration_test.rs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index fad5dd26..774928a3 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -32,9 +32,7 @@ async fn query_a_type() { } else { panic!("No ip address"); } - } else { - panic!("No response") - } + } } /// 6.2.2 Query normal Qtype = * @@ -66,9 +64,6 @@ async fn query_mx_type() { } else { panic!("Record is not MX type"); } - - } else { - panic!("No response received") } } @@ -95,9 +90,6 @@ async fn query_ns_type() { } else { panic!("Second record is not NS"); } - - } else { - panic!("No response received") } } @@ -112,6 +104,7 @@ async fn mistyped_host_name() { #[tokio::test] async fn no_resource_available() { let response = query_response("example.com", "UDP", "CNAME").await; + println!("{:?}", response); assert!(response.is_err()); } From 52a27c5526575605547676e2400c41a1acbc89cf Mon Sep 17 00:00:00 2001 From: Ephy Date: Wed, 10 Jan 2024 01:06:26 -0300 Subject: [PATCH 15/15] test: update integration_test.rs --- tests/integration_test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 774928a3..1f587b56 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -37,7 +37,7 @@ async fn query_a_type() { /// 6.2.2 Query normal Qtype = * #[tokio::test] -async fn query_all_type() { +async fn query_any_type() { let udp_response = query_response("example.com", "UDP", "ANY").await; let tcp_response = query_response("example.com", "TCP", "ANY").await; assert!(udp_response.is_err());