#[path = "../../../os-pci-msix/src/lib.rs"] mod pci_msix; use pci_msix::{DoorbellWindow, Error, Message, VectorTable}; #[test] fn os_pci_msix_positive() { let window = DoorbellWindow::new(0x0802_0000, 0x0802_1000).unwrap(); let mut table = VectorTable::<2>::new(4).unwrap(); table.claim_masked(0).unwrap(); table.claim_masked(2).unwrap(); assert_eq!(table.snapshot().entries[0].unwrap().masked, true); let message = Message {address: 0x0802_0040, data: 48}; table.arm(0, message, window).unwrap(); assert_eq!(table.snapshot().entries[0].unwrap().message, Some(message)); assert_eq!(table.snapshot().entries[0].unwrap().masked, false); table.mask(0).unwrap(); table.release(0).unwrap(); table.release(2).unwrap(); assert_eq!(table.count(), 0); } #[test] fn os_pci_msix_negative() { let window = DoorbellWindow::new(0x0802_0000, 0x0802_1000).unwrap(); let mut table = VectorTable::<1>::new(2).unwrap(); table.claim_masked(0).unwrap(); let before = table.snapshot(); assert_eq!(table.claim_masked(0), Err(Error::DuplicateVector)); assert_eq!(table.claim_masked(2), Err(Error::InvalidVector)); assert_eq!(table.arm(0, Message {address: 0x0803_0000, data: 48}, window), Err(Error::InvalidMessage)); assert_eq!(table.arm(0, Message {address: 0x0802_0001, data: 48}, window), Err(Error::InvalidMessage)); assert_eq!(table.snapshot(), before); table.arm(0, Message {address: 0x0802_0040, data: 48}, window).unwrap(); let armed = table.snapshot(); assert_eq!(table.release(0), Err(Error::StillArmed)); assert_eq!(table.snapshot(), armed); table.mask(0).unwrap(); table.release(0).unwrap(); }