Skip to content

Commit 67d4299

Browse files
committed
add: DNS update examples were added on mod message_test
1 parent 6b675c5 commit 67d4299

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed

src/message.rs

+191
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,11 @@ pub fn create_server_failure_response_from_query(
10491049

10501050
#[cfg(test)]
10511051
mod message_test {
1052+
use std::net::{IpAddr, Ipv4Addr};
1053+
use std::time::Duration;
1054+
use crate::client::Client;
1055+
use crate::client::client_connection::ClientConnection;
1056+
use crate::client::udp_connection::ClientUDPConnection;
10521057
use super::*;
10531058
use crate::domain_name::DomainName;
10541059
use crate::message::header::Header;
@@ -1059,6 +1064,7 @@ mod message_test {
10591064
use crate::message::resource_record::ResourceRecord;
10601065
use crate::message::DnsMessage;
10611066
use crate::message::Rclass;
1067+
use crate::message::rdata::soa_rdata::SoaRdata;
10621068
use crate::message::Rrtype;
10631069

10641070
#[test]
@@ -1821,4 +1827,189 @@ mod message_test {
18211827
}
18221828
}
18231829

1830+
1831+
// DNS update examples --------------------------------------------
1832+
/*
1833+
2.5.1 - Add To An RRset
1834+
1835+
RRs are added to the Update Section whose NAME, TYPE, TTL, RDLENGTH
1836+
and RDATA are those being added, and CLASS is the same as the zone
1837+
class. Any duplicate RRs will be silently ignored by the primary
1838+
master.
1839+
*/
1840+
#[ignore]
1841+
#[tokio::test]
1842+
async fn add_to_an_rrset() {
1843+
let zname = DomainName::new_from_str("example.com");
1844+
let zclass = Rclass::IN;
1845+
1846+
let mut prerequisite = vec![];
1847+
let mut update = vec![];
1848+
let additional :Vec<ResourceRecord> = vec![];
1849+
1850+
// prerequisite--------------------------------
1851+
let prerequisite_rdata = Rdata::SOA(SoaRdata::new_empty());
1852+
1853+
let mut prerequisite_rr = ResourceRecord::new(prerequisite_rdata);
1854+
prerequisite_rr.set_name(zname);
1855+
prerequisite_rr.set_rclass(Rclass::ANY);
1856+
prerequisite.push(prerequisite_rr);
1857+
1858+
// update---------------------------------------
1859+
let update_rdata = Rdata::A(ARdata::new_from_addr(IpAddr::V4(Ipv4Addr::new(192, 168, 1, 200))));
1860+
let mut update_rr = ResourceRecord::new(update_rdata);
1861+
update_rr.set_name(DomainName::new_from_str("test.example.com"));
1862+
update_rr.set_ttl(3600);
1863+
update_rr.set_rclass(zclass);
1864+
update.push(update_rr);
1865+
1866+
// sending-------------------------------------
1867+
let addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
1868+
let conn = ClientUDPConnection::new_default(addr, Duration::from_secs(10));
1869+
1870+
let mess = DnsMessage::update_message("example.com", "IN", prerequisite, update, additional);
1871+
let mut client = Client::new(conn);
1872+
client.set_dns_query(mess);
1873+
let response = client.send_query().await;
1874+
}
1875+
1876+
/*
1877+
2.5.2 - Delete An RRset
1878+
1879+
One RR is added to the Update Section whose NAME and TYPE are those
1880+
of the RRset to be deleted. TTL must be specified as zero (0) and is
1881+
otherwise not used by the primary master. CLASS must be specified as
1882+
ANY. RDLENGTH must be zero (0) and RDATA must therefore be empty.
1883+
If no such RRset exists, then this Update RR will be silently ignored
1884+
by the primary master.
1885+
*/
1886+
#[ignore]
1887+
#[tokio::test]
1888+
async fn delete_an_rrset() {
1889+
let zname = DomainName::new_from_str("example.com");
1890+
let zclass = Rclass::IN;
1891+
1892+
let mut prerequisite = vec![];
1893+
let mut update = vec![];
1894+
let additional :Vec<ResourceRecord> = vec![];
1895+
1896+
// prerequisite--------------------------------
1897+
let prerequisite_rdata = Rdata::SOA(SoaRdata::new_empty());
1898+
1899+
let mut prerequisite_rr = ResourceRecord::new(prerequisite_rdata);
1900+
prerequisite_rr.set_name(zname);
1901+
prerequisite_rr.set_rclass(Rclass::ANY);
1902+
prerequisite.push(prerequisite_rr);
1903+
1904+
// update---------------------------------------
1905+
let update_rdata = Rdata::A(ARdata::new_empty());
1906+
let mut update_rr = ResourceRecord::new(update_rdata);
1907+
update_rr.set_name(DomainName::new_from_str("test.example.com"));
1908+
update_rr.set_ttl(0);
1909+
update_rr.set_rclass(Rclass::ANY);
1910+
update.push(update_rr);
1911+
1912+
// sending-------------------------------------
1913+
let addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
1914+
let conn = ClientUDPConnection::new_default(addr, Duration::from_secs(10));
1915+
1916+
let mess = DnsMessage::update_message("example.com", "IN", prerequisite, update, additional);
1917+
let mut client = Client::new(conn);
1918+
client.set_dns_query(mess);
1919+
let response = client.send_query().await;
1920+
}
1921+
1922+
/*
1923+
2.5.3 - Delete All RRsets From A Name
1924+
1925+
One RR is added to the Update Section whose NAME is that of the name
1926+
to be cleansed of RRsets. TYPE must be specified as ANY. TTL must
1927+
be specified as zero (0) and is otherwise not used by the primary
1928+
master. CLASS must be specified as ANY. RDLENGTH must be zero (0)
1929+
and RDATA must therefore be empty. If no such RRsets exist, then
1930+
this Update RR will be silently ignored by the primary master.
1931+
*/
1932+
#[ignore]
1933+
#[tokio::test]
1934+
async fn delete_all_rrset_from_name() {
1935+
let zname = DomainName::new_from_str("example.com");
1936+
let zclass = Rclass::IN;
1937+
1938+
let mut prerequisite = vec![];
1939+
let mut update = vec![];
1940+
let additional :Vec<ResourceRecord> = vec![];
1941+
1942+
// prerequisite--------------------------------
1943+
let prerequisite_rdata = Rdata::SOA(SoaRdata::new_empty());
1944+
1945+
let mut prerequisite_rr = ResourceRecord::new(prerequisite_rdata);
1946+
prerequisite_rr.set_name(zname);
1947+
prerequisite_rr.set_rclass(Rclass::ANY);
1948+
prerequisite.push(prerequisite_rr);
1949+
1950+
// update---------------------------------------
1951+
let update_rdata = Rdata::A(ARdata::new_empty());
1952+
let mut update_rr = ResourceRecord::new(update_rdata);
1953+
update_rr.set_name(DomainName::new_from_str("test.example.com"));
1954+
update_rr.set_ttl(0);
1955+
update_rr.set_rclass(Rclass::ANY);
1956+
update_rr.set_type_code(Rrtype::ANY);
1957+
update.push(update_rr);
1958+
1959+
// sending-------------------------------------
1960+
let addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
1961+
let conn = ClientUDPConnection::new_default(addr, Duration::from_secs(10));
1962+
1963+
let mess = DnsMessage::update_message("example.com", "IN", prerequisite, update, additional);
1964+
let mut client = Client::new(conn);
1965+
client.set_dns_query(mess);
1966+
let response = client.send_query().await;
1967+
}
1968+
1969+
/*
1970+
2.5.4 - Delete An RR From An RRset
1971+
1972+
RRs to be deleted are added to the Update Section. The NAME, TYPE,
1973+
RDLENGTH and RDATA must match the RR being deleted. TTL must be
1974+
specified as zero (0) and will otherwise be ignored by the primary
1975+
master. CLASS must be specified as NONE to distinguish this from an
1976+
RR addition. If no such RRs exist, then this Update RR will be
1977+
silently ignored by the primary master.
1978+
*/
1979+
#[ignore]
1980+
#[tokio::test]
1981+
async fn delete_an_rr_from_rrset() {
1982+
let zname = DomainName::new_from_str("example.com");
1983+
let zclass = Rclass::IN;
1984+
1985+
let mut prerequisite = vec![];
1986+
let mut update = vec![];
1987+
let additional :Vec<ResourceRecord> = vec![];
1988+
1989+
// prerequisite--------------------------------
1990+
let prerequisite_rdata = Rdata::SOA(SoaRdata::new_empty());
1991+
1992+
let mut prerequisite_rr = ResourceRecord::new(prerequisite_rdata);
1993+
prerequisite_rr.set_name(zname);
1994+
prerequisite_rr.set_rclass(Rclass::ANY);
1995+
prerequisite.push(prerequisite_rr);
1996+
1997+
// update---------------------------------------
1998+
let update_rdata = Rdata::A(ARdata::new_from_addr(IpAddr::V4(Ipv4Addr::new(192, 168, 1, 200))));
1999+
let mut update_rr = ResourceRecord::new(update_rdata);
2000+
update_rr.set_name(DomainName::new_from_str("test.example.com"));
2001+
update_rr.set_ttl(0);
2002+
update_rr.set_rclass(Rclass::NONE);
2003+
update.push(update_rr);
2004+
2005+
// sending-------------------------------------
2006+
let addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
2007+
let conn = ClientUDPConnection::new_default(addr, Duration::from_secs(10));
2008+
2009+
let mess = DnsMessage::update_message("example.com", "IN", prerequisite, update, additional);
2010+
let mut client = Client::new(conn);
2011+
client.set_dns_query(mess);
2012+
let response = client.send_query().await;
2013+
}
2014+
18242015
}

0 commit comments

Comments
 (0)