Skip to content

Commit 0d67440

Browse files
committed
tests
1 parent e4c60d8 commit 0d67440

2 files changed

Lines changed: 127 additions & 1 deletion

File tree

lib/propolis/src/hw/nvme/bits.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ impl CompletionQueueEntry {
180180
/// A Dataset Management Range Definition as represented in memory.
181181
///
182182
/// See NVMe 1.0e Section 6.6 Figure 114: Dataset Management – Range Definition
183-
#[derive(Debug, Default, Copy, Clone, FromBytes)]
183+
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, FromBytes)]
184184
#[repr(C, packed(1))]
185185
pub struct DatasetManagementRangeDefinition {
186186
/// The context attributes specified for each range provides information about how the range
@@ -1230,5 +1230,6 @@ mod test {
12301230
assert_eq!(size_of::<IdentifyController>(), 4096);
12311231
assert_eq!(size_of::<LbaFormat>(), 4);
12321232
assert_eq!(size_of::<IdentifyNamespace>(), 4096);
1233+
assert_eq!(size_of::<DatasetManagementRangeDefinition>(), 16);
12331234
}
12341235
}

lib/propolis/src/hw/nvme/cmds.rs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,8 @@ impl From<block::Result> for Completion {
12061206
mod test {
12071207
use crate::accessors::MemAccessor;
12081208
use crate::common::*;
1209+
use crate::hw::nvme::bits::DatasetManagementRangeDefinition;
1210+
use crate::hw::nvme::cmds::DatasetManagementCmd;
12091211
use crate::vmm::mem::PhysMap;
12101212

12111213
use super::PrpIter;
@@ -1410,4 +1412,127 @@ mod test {
14101412
}
14111413
assert_eq!(iter.next(), None);
14121414
}
1415+
1416+
static RANGES: [DatasetManagementRangeDefinition; 3] = [
1417+
DatasetManagementRangeDefinition {
1418+
context_attributes: 0,
1419+
starting_lba: 0x1000,
1420+
number_logical_blocks: 0x10,
1421+
},
1422+
DatasetManagementRangeDefinition {
1423+
context_attributes: 0,
1424+
starting_lba: 0x2000,
1425+
number_logical_blocks: 0x20,
1426+
},
1427+
DatasetManagementRangeDefinition {
1428+
context_attributes: 0,
1429+
starting_lba: 0x3000,
1430+
number_logical_blocks: 0x30,
1431+
},
1432+
];
1433+
1434+
#[test]
1435+
fn test_dsmgmt_ranges() {
1436+
let (_pmap, acc_mem) = setup();
1437+
let memctx = acc_mem.access().unwrap();
1438+
1439+
let listaddr = 0x80000u64;
1440+
memctx.write_many(GuestAddr(listaddr), &RANGES);
1441+
1442+
let cmd = DatasetManagementCmd {
1443+
prp1: listaddr,
1444+
prp2: 0,
1445+
nr: RANGES.len() as u16,
1446+
ad: true,
1447+
_idw: false,
1448+
_idr: false,
1449+
};
1450+
1451+
let mut iter = cmd.ranges(&memctx);
1452+
for expected in &RANGES {
1453+
assert_eq!(
1454+
iter.next(),
1455+
Some(Ok(*expected)),
1456+
"bad range definition"
1457+
);
1458+
}
1459+
assert_eq!(iter.next(), None);
1460+
}
1461+
1462+
#[test]
1463+
fn test_dsmgmt_ranges_dual() {
1464+
let (_pmap, acc_mem) = setup();
1465+
let memctx = acc_mem.access().unwrap();
1466+
1467+
let listaddr1 = 0x80FF0u64;
1468+
let listaddr2 = 0x90000u64;
1469+
memctx.write_many(GuestAddr(listaddr1), &RANGES[0..1]);
1470+
memctx.write_many(GuestAddr(listaddr2), &RANGES[1..]);
1471+
1472+
let cmd = DatasetManagementCmd {
1473+
prp1: listaddr1,
1474+
prp2: listaddr2,
1475+
nr: RANGES.len() as u16,
1476+
ad: true,
1477+
_idw: false,
1478+
_idr: false,
1479+
};
1480+
1481+
let mut iter = cmd.ranges(&memctx);
1482+
for expected in &RANGES {
1483+
assert_eq!(
1484+
iter.next(),
1485+
Some(Ok(*expected)),
1486+
"bad range definition"
1487+
);
1488+
}
1489+
assert_eq!(iter.next(), None);
1490+
}
1491+
1492+
#[test]
1493+
fn test_dsmgmt_ranges_bad_dual() {
1494+
let (_pmap, acc_mem) = setup();
1495+
let memctx = acc_mem.access().unwrap();
1496+
1497+
let listaddr1 = 0x80FF8u64;
1498+
let listaddr2 = 0x90000u64;
1499+
memctx.write_many(GuestAddr(listaddr1), &RANGES[0..1]);
1500+
memctx.write_many(GuestAddr(listaddr2), &RANGES[1..]);
1501+
1502+
let cmd = DatasetManagementCmd {
1503+
prp1: listaddr1,
1504+
prp2: listaddr2,
1505+
nr: RANGES.len() as u16,
1506+
ad: true,
1507+
_idw: false,
1508+
_idr: false,
1509+
};
1510+
1511+
let mut iter = cmd.ranges(&memctx);
1512+
match iter.next() {
1513+
Some(Err(_)) => {}
1514+
other => panic!("expected alignment error, got {other:?}"),
1515+
}
1516+
}
1517+
1518+
#[test]
1519+
fn test_dsmgmt_ranges_bad_address() {
1520+
let (_pmap, acc_mem) = setup();
1521+
let memctx = acc_mem.access().unwrap();
1522+
1523+
let cmd = DatasetManagementCmd {
1524+
prp1: VM_SIZE as u64, // out of bounds
1525+
prp2: 0,
1526+
nr: 1,
1527+
ad: true,
1528+
_idw: false,
1529+
_idr: false,
1530+
};
1531+
1532+
let mut iter = cmd.ranges(&memctx);
1533+
match iter.next() {
1534+
Some(Err(_)) => {}
1535+
other => panic!("expected alignment error, got {other:?}"),
1536+
}
1537+
}
14131538
}

0 commit comments

Comments
 (0)