use netmap_rs::fallback::{create_fallback_channel, FallbackRxRing, FallbackTxRing};
use netmap_rs::prelude::Error; use std::thread;
use std::time::Duration;
#[test]
fn test_fallback_ring() {
let (tx_ring, rx_ring) = create_fallback_channel(32);
tx_ring.send(b"test").unwrap();
let frame = rx_ring.recv().unwrap();
assert_eq!(frame.payload(), b"test");
for i in 0..32 {
tx_ring.send(&[i as u8]).unwrap(); }
match tx_ring.send(b"overflow") {
Err(Error::WouldBlock) => { }
Err(e) => panic!("Expected WouldBlock, got {:?}", e),
Ok(_) => panic!("Expected WouldBlock, but send succeeded"),
}
}
#[test]
fn test_threaded_fallback() {
let (tx_ring, rx_ring): (FallbackTxRing, FallbackRxRing) = create_fallback_channel(32);
let num_packets = 10;
let tx_handle = thread::spawn(move || {
for i in 0..num_packets {
loop {
match tx_ring.send(&[i as u8]) {
Ok(_) => break,
Err(Error::WouldBlock) => thread::sleep(Duration::from_millis(1)), Err(e) => panic!("Send error: {:?}", e),
}
}
thread::sleep(Duration::from_millis(5)); }
});
let rx_handle = thread::spawn(move || {
let mut received_packets = Vec::new();
for _ in 0..num_packets {
loop {
if let Some(frame) = rx_ring.recv() {
received_packets.push(frame.payload().to_vec());
break;
}
thread::sleep(Duration::from_millis(1)); }
}
assert_eq!(received_packets.len(), num_packets);
for i in 0..num_packets {
assert_eq!(received_packets[i], vec![i as u8]);
}
});
tx_handle.join().unwrap();
rx_handle.join().unwrap();
}