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 tokio::io::{AsyncSeekExt, BufReader};
18*cf78ab8cSAndroid Build Coastguard Worker
timestamp(hdr: pcap::PacketHeader) -> f6419*cf78ab8cSAndroid Build Coastguard Worker fn timestamp(hdr: pcap::PacketHeader) -> f64 {
20*cf78ab8cSAndroid Build Coastguard Worker hdr.tv_sec as f64 + (hdr.tv_usec as f64 / 1_000_000.0)
21*cf78ab8cSAndroid Build Coastguard Worker }
22*cf78ab8cSAndroid Build Coastguard Worker
23*cf78ab8cSAndroid Build Coastguard Worker // Read a file with a known number of records.
24*cf78ab8cSAndroid Build Coastguard Worker //
25*cf78ab8cSAndroid Build Coastguard Worker // Test magic numbers, record len, and timestamp fields
26*cf78ab8cSAndroid Build Coastguard Worker #[tokio::test]
read_file() -> Result<(), std::io::Error>27*cf78ab8cSAndroid Build Coastguard Worker async fn read_file() -> Result<(), std::io::Error> {
28*cf78ab8cSAndroid Build Coastguard Worker const DATA: &[u8] = include_bytes!("../data/dns.cap");
29*cf78ab8cSAndroid Build Coastguard Worker const RECORDS: i32 = 38;
30*cf78ab8cSAndroid Build Coastguard Worker let mut reader = BufReader::new(Cursor::new(DATA));
31*cf78ab8cSAndroid Build Coastguard Worker let header = pcap::read_file_header(&mut reader).await?;
32*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(header.linktype, pcap::LinkType::Ethernet.into());
33*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(header.snaplen, u16::MAX as u32);
34*cf78ab8cSAndroid Build Coastguard Worker let mut records = 0;
35*cf78ab8cSAndroid Build Coastguard Worker loop {
36*cf78ab8cSAndroid Build Coastguard Worker match pcap::read_record(&mut reader).await {
37*cf78ab8cSAndroid Build Coastguard Worker Ok((hdr, _record)) => {
38*cf78ab8cSAndroid Build Coastguard Worker records += 1;
39*cf78ab8cSAndroid Build Coastguard Worker if records == 1 {
40*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(1112172466.496046000f64, timestamp(hdr));
41*cf78ab8cSAndroid Build Coastguard Worker } else if records == 38 {
42*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(1112172745.375359000f64, timestamp(hdr));
43*cf78ab8cSAndroid Build Coastguard Worker }
44*cf78ab8cSAndroid Build Coastguard Worker }
45*cf78ab8cSAndroid Build Coastguard Worker Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => {
46*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(records, RECORDS);
47*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(DATA.len() as u64, reader.stream_position().await?);
48*cf78ab8cSAndroid Build Coastguard Worker break;
49*cf78ab8cSAndroid Build Coastguard Worker }
50*cf78ab8cSAndroid Build Coastguard Worker _ => {
51*cf78ab8cSAndroid Build Coastguard Worker assert!(false, "Unexpected error");
52*cf78ab8cSAndroid Build Coastguard Worker }
53*cf78ab8cSAndroid Build Coastguard Worker }
54*cf78ab8cSAndroid Build Coastguard Worker }
55*cf78ab8cSAndroid Build Coastguard Worker
56*cf78ab8cSAndroid Build Coastguard Worker Ok(())
57*cf78ab8cSAndroid Build Coastguard Worker }
58