mod offline;
use tempfile::TempDir;
use pcap::{Capture, Linktype};
use crate::{capture_from_test_file, Packets};
#[test]
fn read_packet_with_full_data() {
let mut capture = capture_from_test_file("packet_snaplen_65535.pcap");
assert_eq!(capture.next_packet().unwrap().len(), 98);
}
#[test]
fn read_packet_with_truncated_data() {
let mut capture = capture_from_test_file("packet_snaplen_20.pcap");
assert_eq!(capture.next_packet().unwrap().len(), 20);
}
#[test]
fn capture_dead_savefile() {
let mut packets = Packets::new();
packets.push(1460408319, 1234, 1, 1, &[1]);
packets.push(1460408320, 4321, 1, 1, &[2]);
let dir = TempDir::new().unwrap();
let tmpfile = dir.path().join("test.pcap");
let cap = Capture::dead(Linktype(1)).unwrap();
let mut save = cap.savefile(&tmpfile).unwrap();
packets.foreach(|p| save.write(p));
drop(save);
let mut cap = Capture::from_file(&tmpfile).unwrap();
packets.verify(&mut cap);
}
#[test]
#[cfg(libpcap_1_7_2)]
fn capture_dead_savefile_append() {
let mut packets1 = Packets::new();
packets1.push(1460408319, 1234, 1, 1, &[1]);
packets1.push(1460408320, 4321, 1, 1, &[2]);
let mut packets2 = Packets::new();
packets2.push(1460408321, 2345, 1, 1, &[3]);
packets2.push(1460408322, 5432, 1, 1, &[4]);
let packets = &packets1 + &packets2;
let dir = TempDir::new().unwrap();
let tmpfile = dir.path().join("test.pcap");
let cap = Capture::dead(Linktype(1)).unwrap();
let mut save = cap.savefile(&tmpfile).unwrap();
packets1.foreach(|p| save.write(p));
drop(save);
let cap = Capture::dead(Linktype(1)).unwrap();
let mut save = cap.savefile_append(&tmpfile).unwrap();
packets2.foreach(|p| save.write(p));
drop(save);
let mut cap = Capture::from_file(&tmpfile).unwrap();
packets.verify(&mut cap);
}
#[test]
fn test_linktype() {
let capture = capture_from_test_file("packet_snaplen_65535.pcap");
let linktype = capture.get_datalink();
assert!(linktype.get_name().is_ok());
assert_eq!(linktype.get_name().unwrap(), String::from("EN10MB"));
assert!(linktype.get_description().is_ok());
}
#[test]
fn test_error() {
let mut capture = capture_from_test_file("packet_snaplen_65535.pcap");
assert!(capture.stats().err().is_some());
}
#[test]
fn test_compile() {
let mut capture = capture_from_test_file("packet_snaplen_65535.pcap");
let packet = capture.next_packet().unwrap();
let bpf_capture = Capture::dead(Linktype::ETHERNET).unwrap();
let program = bpf_capture.compile("dst host 8.8.8.8", false).unwrap();
let instructions = program.get_instructions();
assert!(!instructions.is_empty());
assert!(program.filter(packet.data));
let program = bpf_capture.compile("src host 8.8.8.8", false).unwrap();
let instructions = program.get_instructions();
assert!(!instructions.is_empty());
assert!(!program.filter(packet.data));
}
#[test]
fn test_compile_optimized() {
let bpf_capture = Capture::dead(Linktype::ETHERNET).unwrap();
let program_str = "ip and ip and tcp";
let program_unopt = bpf_capture.compile(program_str, false).unwrap();
let instr_unopt = program_unopt.get_instructions();
let program_opt = bpf_capture.compile(program_str, true).unwrap();
let instr_opt = program_opt.get_instructions();
assert!(instr_opt.len() < instr_unopt.len());
}
#[test]
fn test_compile_error() {
let bpf_capture = Capture::dead(Linktype::ETHERNET).unwrap();
let program_str = "this is a terrible program";
let result = bpf_capture.compile(program_str, false);
assert!(result.is_err());
let result = bpf_capture.compile(program_str, true);
assert!(result.is_err());
}
#[test]
fn test_filter() {
let mut capture = capture_from_test_file("packet_snaplen_65535.pcap");
capture.filter("dst host 8.8.8.8", false).unwrap();
let result = capture.next_packet();
assert!(result.is_ok());
}
#[test]
fn read_packet_via_pcap_loop() {
let mut packets = 0;
let mut capture = capture_from_test_file("packet_snaplen_65535.pcap");
capture
.for_each(None, |_| {
packets += 1;
})
.unwrap();
assert_eq!(packets, 1);
}
#[test]
#[should_panic]
fn panic_in_pcap_loop() {
let mut capture = capture_from_test_file("packet_snaplen_65535.pcap");
capture.for_each(None, |_| panic!()).unwrap();
}