use huginn_net_http::packet_parser::{
detect_datalink_format, parse_packet, DatalinkFormat, IpPacket,
};
use pnet::packet::Packet;
#[test]
fn test_detect_null_datalink() {
let null_packet = vec![
0x1e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, ];
let format = detect_datalink_format(&null_packet);
assert_eq!(format, Some(DatalinkFormat::Null));
}
#[test]
fn test_detect_raw_ipv4() {
let raw_ipv4 = vec![
0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x7c, 0xb0, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, 0x01, 0x02, ];
let format = detect_datalink_format(&raw_ipv4);
assert_eq!(format, Some(DatalinkFormat::RawIp));
}
#[test]
fn test_detect_raw_ipv6() {
let raw_ipv6 = vec![
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02,
];
let format = detect_datalink_format(&raw_ipv6);
assert_eq!(format, Some(DatalinkFormat::RawIp));
}
#[test]
fn test_detect_ethernet_ipv4() {
let ethernet_ipv4 = vec![
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x7c, 0xb0, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, 0x01, 0x02, ];
let format = detect_datalink_format(ðernet_ipv4);
assert_eq!(format, Some(DatalinkFormat::Ethernet));
}
#[test]
fn test_detect_ethernet_ipv6() {
let ethernet_ipv6 = vec![
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02,
];
let format = detect_datalink_format(ðernet_ipv6);
assert_eq!(format, Some(DatalinkFormat::Ethernet));
}
#[test]
fn test_parse_ethernet_ipv4() {
let ethernet_ipv4 = vec![
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x7c, 0xb0, 0xc0, 0xa8, 0x01, 0x01, 0xc0, 0xa8, 0x01, 0x02, ];
match parse_packet(ðernet_ipv4) {
IpPacket::Ipv4(ipv4) => {
assert_eq!(ipv4.get_version(), 4); assert_eq!(ipv4.get_header_length(), 5); }
_ => panic!("Expected IPv4 packet"),
}
}
#[test]
fn test_parse_raw_ipv6() {
let raw_ipv6 = vec![
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02,
];
match parse_packet(&raw_ipv6) {
IpPacket::Ipv6(ipv6) => {
assert_eq!(ipv6.get_version(), 6); assert_eq!(ipv6.packet().len(), 40); }
_ => panic!("Expected IPv6 packet"),
}
}
#[test]
fn test_parse_null_datalink_ipv6() {
let null_ipv6 = vec![
0x1e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, ];
match parse_packet(&null_ipv6) {
IpPacket::Ipv6(ipv6) => {
assert_eq!(ipv6.get_version(), 6); assert_eq!(ipv6.packet().len(), 40); }
_ => panic!("Expected NULL datalink IPv6 packet"),
}
}