r-lanlib 0.11.0

A library crate for performing network scanning operations on any local area network (LAN)
Documentation
use std::str::FromStr;
use std::sync::Arc;

use crate::wire::mocks::MockPacketSender;

use super::*;

#[test]
fn new() {
    let source_ip = Ipv4Addr::from_str("192.168.1.1").unwrap();
    let source_mac = MacAddr::default();
    let source_port = 54321;
    let sender: Arc<Mutex<dyn Sender>> =
        Arc::new(Mutex::new(MockPacketSender::new()));

    let heart_beat = HeartBeat::builder()
        .source_mac(source_mac)
        .source_ipv4(source_ip)
        .source_port(source_port)
        .packet_sender(sender)
        .build()
        .unwrap();

    assert_eq!(heart_beat.source_mac, source_mac);
    assert_eq!(heart_beat.source_ipv4, source_ip);
    assert_eq!(heart_beat.source_port, source_port);
}

#[test]
fn sends_heartbeat_packets() {
    let source_ip = Ipv4Addr::from_str("192.168.1.1").unwrap();
    let source_mac = MacAddr::default();
    let source_port = 54321;

    let mut packet_sender = MockPacketSender::new();

    let heartbeat_packet = HeartbeatPacketBuilder::default()
        .source_ip(source_ip)
        .source_mac(source_mac)
        .source_port(source_port)
        .build()
        .unwrap();

    let expected_packet = heartbeat_packet.to_raw();

    packet_sender
        .expect_send()
        .withf(move |p| p == expected_packet)
        .returning(|_| Ok(()));

    let sender = Arc::new(Mutex::new(packet_sender));

    let heart_beat = HeartBeat::builder()
        .source_mac(source_mac)
        .source_ipv4(source_ip)
        .source_port(source_port)
        .packet_sender(sender)
        .build()
        .unwrap();

    heart_beat.beat().unwrap();
}

#[test]
fn sends_heartbeat_packets_in_thread() {
    let source_ip = Ipv4Addr::from_str("192.168.1.1").unwrap();
    let source_mac = MacAddr::default();
    let source_port = 54321;

    let mut packet_sender = MockPacketSender::new();

    let heartbeat_packet = HeartbeatPacketBuilder::default()
        .source_ip(source_ip)
        .source_mac(source_mac)
        .source_port(source_port)
        .build()
        .unwrap();

    let expected_packet = heartbeat_packet.to_raw();

    packet_sender
        .expect_send()
        .withf(move |p| p == expected_packet)
        .returning(|_| Ok(()));

    let sender = Arc::new(Mutex::new(packet_sender));

    let heart_beat = HeartBeat::builder()
        .source_mac(source_mac)
        .source_ipv4(source_ip)
        .source_port(source_port)
        .packet_sender(sender)
        .build()
        .unwrap();

    let (stop_tx, stop_rx) = mpsc::channel();

    let handle = heart_beat.start_in_thread(stop_rx).unwrap();

    thread::sleep(Duration::from_millis(2000));

    stop_tx.send(()).unwrap();

    handle.join().unwrap().unwrap();
}