sim: add unsupported caps to device creation

Update `make_device` to return a slice of unsupported caps for a test.
This allows skipping tests in devices that are known to be non working
under some build configuration.

The device constructor was updated to return a `Result`, so that the
specific reason for skipping can be returned as a `String`.

Signed-off-by: Fabio Utzig <utzig@apache.org>
This commit is contained in:
Fabio Utzig 2019-11-28 10:24:09 -03:00 committed by Fabio Utzig
parent f5480c74e9
commit 114a64768b
2 changed files with 23 additions and 17 deletions

View File

@ -84,8 +84,14 @@ impl ImagesBuilder {
/// Construct a new image builder for the given device. Returns
/// Some(builder) if is possible to test this configuration, or None if
/// not possible (for example, if there aren't enough image slots).
pub fn new(device: DeviceName, align: usize, erased_val: u8) -> Option<Self> {
let (flash, areadesc) = Self::make_device(device, align, erased_val);
pub fn new(device: DeviceName, align: usize, erased_val: u8) -> Result<Self, String> {
let (flash, areadesc, unsupported_caps) = Self::make_device(device, align, erased_val);
for cap in unsupported_caps {
if cap.present() {
return Err(format!("unsupported {:?}", cap));
}
}
let num_images = Caps::get_num_images();
@ -100,7 +106,7 @@ impl ImagesBuilder {
};
let (primary_base, primary_len, primary_dev_id) = match areadesc.find(id0) {
Some(info) => info,
None => return None,
None => return Err("insufficient partitions".to_string()),
};
let id1 = match image {
0 => FlashId::Image1,
@ -109,7 +115,7 @@ impl ImagesBuilder {
};
let (secondary_base, secondary_len, secondary_dev_id) = match areadesc.find(id1) {
Some(info) => info,
None => return None,
None => return Err("insufficient partitions".to_string()),
};
let offset_from_end = c::boot_magic_sz() + c::boot_max_align() * 4;
@ -135,7 +141,7 @@ impl ImagesBuilder {
slots.push([primary, secondary]);
}
Some(ImagesBuilder {
Ok(ImagesBuilder {
flash: flash,
areadesc: areadesc,
slots: slots,
@ -149,8 +155,8 @@ impl ImagesBuilder {
for &align in test_alignments() {
for &erased_val in &[0, 0xff] {
match Self::new(dev, align, erased_val) {
Some(run) => f(run),
None => warn!("Skipping {:?}, insufficient partitions", dev),
Ok(run) => f(run),
Err(msg) => warn!("Skipping {}: {}", dev, msg),
}
}
}
@ -227,7 +233,7 @@ impl ImagesBuilder {
}
/// Build the Flash and area descriptor for a given device.
pub fn make_device(device: DeviceName, align: usize, erased_val: u8) -> (SimMultiFlash, AreaDesc) {
pub fn make_device(device: DeviceName, align: usize, erased_val: u8) -> (SimMultiFlash, AreaDesc, &'static [Caps]) {
match device {
DeviceName::Stm32f4 => {
// STM style flash. Large sectors, with a large scratch area.
@ -244,7 +250,7 @@ impl ImagesBuilder {
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
(flash, areadesc)
(flash, areadesc, &[Caps::SwapUsingMove])
}
DeviceName::K64f => {
// NXP style flash. Small sectors, one small sector for scratch.
@ -259,7 +265,7 @@ impl ImagesBuilder {
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
(flash, areadesc)
(flash, areadesc, &[])
}
DeviceName::K64fBig => {
// Simulating an STM style flash on top of an NXP style flash. Underlying flash device
@ -275,7 +281,7 @@ impl ImagesBuilder {
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
(flash, areadesc)
(flash, areadesc, &[Caps::SwapUsingMove])
}
DeviceName::Nrf52840 => {
// Simulating the flash on the nrf52840 with partitions set up so that the scratch size
@ -291,7 +297,7 @@ impl ImagesBuilder {
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
(flash, areadesc)
(flash, areadesc, &[])
}
DeviceName::Nrf52840SpiFlash => {
// Simulate nrf52840 with external SPI flash. The external SPI flash
@ -310,7 +316,7 @@ impl ImagesBuilder {
let mut flash = SimMultiFlash::new();
flash.insert(0, dev0);
flash.insert(1, dev1);
(flash, areadesc)
(flash, areadesc, &[Caps::SwapUsingMove])
}
DeviceName::K64fMulti => {
// NXP style flash, but larger, to support multiple images.
@ -327,7 +333,7 @@ impl ImagesBuilder {
let mut flash = SimMultiFlash::new();
flash.insert(dev_id, dev);
(flash, areadesc)
(flash, areadesc, &[])
}
}
}

View File

@ -173,9 +173,9 @@ impl RunStatus {
warn!("Running on device {} with alignment {}", device, align);
let run = match ImagesBuilder::new(device, align, erased_val) {
Some(builder) => builder,
None => {
warn!("Skipping device with insuffienct partitions");
Ok(builder) => builder,
Err(msg) => {
warn!("Skipping {}: {}", device, msg);
return;
}
};