use std::net::Ipv4Addr;
use std::str::FromStr;
use socket_server_mocker::Instruction::{
ReceiveMessageWithMaxSize, SendMessageDependingOnLastReceivedMessage, StopExchange,
};
use socket_server_mocker::ServerMocker;
use trust_dns_client::client::{Client, SyncClient};
use trust_dns_client::op::DnsResponse;
use trust_dns_client::rr::rdata::A;
use trust_dns_client::rr::{DNSClass, Name, RData, Record, RecordType};
use trust_dns_client::udp::UdpClientConnection;
#[test]
fn test_dns_mock() {
let server = ServerMocker::udp().unwrap();
server
.add_mock_instructions(vec![
ReceiveMessageWithMaxSize(512),
SendMessageDependingOnLastReceivedMessage(|previous_message| {
let mut response = vec![
previous_message.as_ref().unwrap()[0],
previous_message.as_ref().unwrap()[1],
];
response.extend_from_slice(
b"\
\x81\x80\x00\x01\x00\x01\x00\x02\x00\x01\x03www\x07example\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\
\x00\x01\x08\xa4\x00\x04\x5d\xb8\xd8\x22\xc0\x10\x00\x02\x00\x01\x00\x01\x08\xa3\x00\x14\x01a\x0ciana-servers\x03net\
\x00\xc0\x10\x00\x02\x00\x01\x00\x01\x08\xa3\x00\x04\x01b\xc0?\x00\x00)\x10\x00\x00\x00\x00\x00\x00\x00",
);
Some(response)
}),
StopExchange,
])
.unwrap();
let conn = UdpClientConnection::new(server.socket_address()).unwrap();
let client = SyncClient::new(conn);
let name = Name::from_str("www.example.com.").unwrap();
let response: DnsResponse = client.query(&name, DNSClass::IN, RecordType::A).unwrap();
let answers: &[Record] = response.answers();
if let Some(RData::A(ref ip)) = answers[0].data() {
assert_eq!(*ip, A(Ipv4Addr::new(93, 184, 216, 34)));
} else {
panic!("unexpected result");
}
assert_eq!(
b"\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01\x03www\x07example\x03com\x00\x00\x01\x00\x01\x00\x00)\x04\xD0\x00\x00\x00\x00\x00\x00",
&server.pop_received_message().unwrap()[2..]
);
assert!(server.pop_server_error().is_none());
}