#![cfg(kani)]
use elicitation::verification::types::{
MacAddr, MacLocal, MacMulticast, MacUnicast, MacUniversal, is_local, is_multicast, is_unicast,
is_universal,
};
#[kani::proof]
fn verify_unicast_detection() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] & 0xFE;
assert!(is_unicast(&octets));
assert!(!is_multicast(&octets));
let mac = MacAddr::new(octets);
assert!(mac.is_unicast());
assert!(!mac.is_multicast());
let unicast = MacUnicast::new(octets);
assert!(unicast.is_ok());
}
#[kani::proof]
fn verify_multicast_detection() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] | 0x01;
assert!(is_multicast(&octets));
assert!(!is_unicast(&octets));
let mac = MacAddr::new(octets);
assert!(mac.is_multicast());
assert!(!mac.is_unicast());
let multicast = MacMulticast::new(octets);
assert!(multicast.is_ok());
}
#[kani::proof]
fn verify_unicast_rejects_multicast() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] | 0x01;
let unicast = MacUnicast::new(octets);
assert!(unicast.is_err());
}
#[kani::proof]
fn verify_multicast_rejects_unicast() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] & 0xFE;
let multicast = MacMulticast::new(octets);
assert!(multicast.is_err());
}
#[kani::proof]
fn verify_universal_detection() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] & 0xFD;
assert!(is_universal(&octets));
assert!(!is_local(&octets));
let mac = MacAddr::new(octets);
assert!(mac.is_universal());
assert!(!mac.is_local());
let universal = MacUniversal::new(octets);
assert!(universal.is_ok());
}
#[kani::proof]
fn verify_local_detection() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] | 0x02;
assert!(is_local(&octets));
assert!(!is_universal(&octets));
let mac = MacAddr::new(octets);
assert!(mac.is_local());
assert!(!mac.is_universal());
let local = MacLocal::new(octets);
assert!(local.is_ok());
}
#[kani::proof]
fn verify_universal_rejects_local() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] | 0x02;
let universal = MacUniversal::new(octets);
assert!(universal.is_err());
}
#[kani::proof]
fn verify_local_rejects_universal() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] & 0xFD;
let local = MacLocal::new(octets);
assert!(local.is_err());
}
#[kani::proof]
fn verify_broadcast_is_multicast() {
let octets = [0xFF; 6];
let mac = MacAddr::new(octets);
assert!(mac.is_broadcast());
assert!(mac.is_multicast());
assert!(mac.is_local());
}
#[kani::proof]
fn verify_null_is_unicast() {
let octets = [0x00; 6];
let mac = MacAddr::new(octets);
assert!(mac.is_null());
assert!(mac.is_unicast());
assert!(mac.is_universal());
}
#[kani::proof]
fn verify_unicast_universal() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] & 0xFC;
let mac = MacAddr::new(octets);
assert!(mac.is_unicast());
assert!(mac.is_universal());
}
#[kani::proof]
fn verify_unicast_local() {
let mut octets: [u8; 6] = kani::any();
octets[0] = (octets[0] & 0xFC) | 0x02;
let mac = MacAddr::new(octets);
assert!(mac.is_unicast());
assert!(mac.is_local());
}
#[kani::proof]
fn verify_multicast_universal() {
let mut octets: [u8; 6] = kani::any();
octets[0] = (octets[0] & 0xFC) | 0x01;
let mac = MacAddr::new(octets);
assert!(mac.is_multicast());
assert!(mac.is_universal());
}
#[kani::proof]
fn verify_multicast_local() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] | 0x03;
let mac = MacAddr::new(octets);
assert!(mac.is_multicast());
assert!(mac.is_local());
}
#[kani::proof]
fn verify_macaddr_roundtrip() {
let octets: [u8; 6] = kani::any();
let mac = MacAddr::new(octets);
let extracted = mac.octets();
assert_eq!(octets, extracted);
}
#[kani::proof]
fn verify_unicast_roundtrip() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] & 0xFE;
let unicast = MacUnicast::new(octets).unwrap();
let extracted = unicast.octets();
assert_eq!(octets, extracted);
}
#[kani::proof]
fn verify_multicast_roundtrip() {
let mut octets: [u8; 6] = kani::any();
octets[0] = octets[0] | 0x01;
let multicast = MacMulticast::new(octets).unwrap();
let extracted = multicast.octets();
assert_eq!(octets, extracted);
}