1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2024 Google LLC
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker
15*cf78ab8cSAndroid Build Coastguard Worker use capture::pcap;
16*cf78ab8cSAndroid Build Coastguard Worker use std::io::Cursor;
17*cf78ab8cSAndroid Build Coastguard Worker use std::net::{IpAddr, Ipv6Addr};
18*cf78ab8cSAndroid Build Coastguard Worker use std::str::FromStr;
19*cf78ab8cSAndroid Build Coastguard Worker use tokio::io::BufReader;
20*cf78ab8cSAndroid Build Coastguard Worker
ipv6_from_str(addr: &str) -> Result<IpAddr, std::io::Error>21*cf78ab8cSAndroid Build Coastguard Worker fn ipv6_from_str(addr: &str) -> Result<IpAddr, std::io::Error> {
22*cf78ab8cSAndroid Build Coastguard Worker match Ipv6Addr::from_str(addr) {
23*cf78ab8cSAndroid Build Coastguard Worker Ok(addr) => Ok(addr.into()),
24*cf78ab8cSAndroid Build Coastguard Worker Err(err) => Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, err.to_string())),
25*cf78ab8cSAndroid Build Coastguard Worker }
26*cf78ab8cSAndroid Build Coastguard Worker }
27*cf78ab8cSAndroid Build Coastguard Worker
28*cf78ab8cSAndroid Build Coastguard Worker #[tokio::test]
dns_manager() -> Result<(), std::io::Error>29*cf78ab8cSAndroid Build Coastguard Worker async fn dns_manager() -> Result<(), std::io::Error> {
30*cf78ab8cSAndroid Build Coastguard Worker const DATA: &[u8] = include_bytes!("../../capture/data/dns.cap");
31*cf78ab8cSAndroid Build Coastguard Worker
32*cf78ab8cSAndroid Build Coastguard Worker let mut reader = BufReader::new(Cursor::new(DATA));
33*cf78ab8cSAndroid Build Coastguard Worker let header = pcap::read_file_header(&mut reader).await?;
34*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(header.linktype, pcap::LinkType::Ethernet.into());
35*cf78ab8cSAndroid Build Coastguard Worker let mut dns_manager = http_proxy::DnsManager::new();
36*cf78ab8cSAndroid Build Coastguard Worker loop {
37*cf78ab8cSAndroid Build Coastguard Worker match pcap::read_record(&mut reader).await {
38*cf78ab8cSAndroid Build Coastguard Worker Ok((_hdr, record)) => {
39*cf78ab8cSAndroid Build Coastguard Worker dns_manager.add_from_ethernet_slice(&record);
40*cf78ab8cSAndroid Build Coastguard Worker }
41*cf78ab8cSAndroid Build Coastguard Worker Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => {
42*cf78ab8cSAndroid Build Coastguard Worker break;
43*cf78ab8cSAndroid Build Coastguard Worker }
44*cf78ab8cSAndroid Build Coastguard Worker Err(e) => {
45*cf78ab8cSAndroid Build Coastguard Worker println!("Error: {:?}", e);
46*cf78ab8cSAndroid Build Coastguard Worker assert!(false);
47*cf78ab8cSAndroid Build Coastguard Worker }
48*cf78ab8cSAndroid Build Coastguard Worker }
49*cf78ab8cSAndroid Build Coastguard Worker }
50*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(dns_manager.len(), 4);
51*cf78ab8cSAndroid Build Coastguard Worker
52*cf78ab8cSAndroid Build Coastguard Worker // 0xf0d4 AAAA www.netbsd.org AAAA
53*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(
54*cf78ab8cSAndroid Build Coastguard Worker dns_manager.get(&ipv6_from_str("2001:4f8:4:7:2e0:81ff:fe52:9a6b")?),
55*cf78ab8cSAndroid Build Coastguard Worker Some("www.netbsd.org".into())
56*cf78ab8cSAndroid Build Coastguard Worker );
57*cf78ab8cSAndroid Build Coastguard Worker
58*cf78ab8cSAndroid Build Coastguard Worker Ok(())
59*cf78ab8cSAndroid Build Coastguard Worker }
60