#![allow(unused_variables)]
use std::{cell::RefCell, cmp::min};
use usb_device::bus::UsbBusAllocator;
use usbd_dfu::class::*;
const TESTMEMSIZE: usize = 64 * 1024;
pub struct TestMem {
memory: RefCell<[u8; TESTMEMSIZE]>,
buffer: [u8; 1024],
overrides: TestMemOverride,
}
struct TestMemOverride {
read: Option<
fn(&mut TestMem, address: u32, length: usize) -> core::result::Result<&[u8], DFUMemError>,
>,
erase: Option<fn(&mut TestMem, address: u32) -> Result<(), DFUMemError>>,
program: Option<
fn(&mut TestMem, address: u32, length: usize) -> core::result::Result<(), DFUMemError>,
>,
manifestation: Option<fn(&mut TestMem) -> Result<(), DFUManifestationError>>,
}
impl TestMem {
fn new(overrides: Option<TestMemOverride>) -> Self {
let tmo = overrides.unwrap_or(TestMemOverride {
read: None,
erase: None,
program: None,
manifestation: None,
});
Self {
memory: RefCell::new(Self::init_buf()),
buffer: [0; 1024],
overrides: tmo,
}
}
fn init_buf() -> [u8; TESTMEMSIZE] {
let mut buf = [0u8; TESTMEMSIZE];
for (i, v) in buf.iter_mut().enumerate() {
if i & 1 == 1 {
*v = ((i >> 9) & 0xff) as u8;
} else {
*v = ((i >> 1) & 0xff) as u8;
}
}
buf
}
fn erase(&mut self, block: usize) {
let mut buf = self.memory.borrow_mut();
buf[block..block + 1024].fill(0xff);
}
fn read_to_buf(&mut self, block: usize) -> usize {
let len = min(self.buffer.len(), TESTMEMSIZE - block);
let mem = self.memory.borrow();
self.buffer[..len].copy_from_slice(&mem[block..block + len]);
len
}
fn write_from_buf(&mut self, block: usize, srclen: usize) -> usize {
let len = min(srclen, TESTMEMSIZE - block);
let mut mem = self.memory.borrow_mut();
for (i, m) in mem[block..block + len].iter_mut().enumerate() {
*m &= self.buffer[i];
}
len
}
fn verify_with_buf(&self, block: usize, srclen: usize) -> bool {
let len = min(srclen, TESTMEMSIZE - block);
let mem = self.memory.borrow();
for (i, m) in mem[block..block + len].iter().enumerate() {
if *m != self.buffer[i] {
return false;
}
}
true
}
}
const TESTMEM_BASE: u32 = 0x0200_0000;
impl DFUMemIO for TestMem {
const INITIAL_ADDRESS_POINTER: u32 = TESTMEM_BASE;
const MANIFESTATION_TOLERANT: bool = false;
const PROGRAM_TIME_MS: u32 = 50;
const ERASE_TIME_MS: u32 = 0x1ff;
const FULL_ERASE_TIME_MS: u32 = 0x2_0304;
const MEM_INFO_STRING: &'static str = "@Flash/0x02000000/16*1Ka,48*1Kg";
const HAS_DOWNLOAD: bool = true;
const HAS_UPLOAD: bool = true;
const DETACH_TIMEOUT: u16 = 0x1122;
const TRANSFER_SIZE: u16 = 128;
fn read(&mut self, address: u32, length: usize) -> core::result::Result<&[u8], DFUMemError> {
if self.overrides.read.is_some() {
return self.overrides.read.unwrap()(self, address, length);
}
if address < TESTMEM_BASE {
return Err(DFUMemError::Address);
}
let from = (address - TESTMEM_BASE) as usize;
if from >= TESTMEMSIZE {
return Ok(&[]);
}
let len = self.read_to_buf(from);
Ok(&self.buffer[..min(length, len)])
}
fn erase(&mut self, address: u32) -> core::result::Result<(), DFUMemError> {
if self.overrides.erase.is_some() {
return self.overrides.erase.unwrap()(self, address);
}
if address < TESTMEM_BASE {
return Err(DFUMemError::Address);
}
let from = address - TESTMEM_BASE;
if from & 0x3ff != 0 {
return Ok(());
}
if from >= TESTMEMSIZE as u32 {
return Err(DFUMemError::Address);
}
self.erase(from as usize);
Ok(())
}
fn erase_all(&mut self) -> Result<(), DFUMemError> {
for block in (0..TESTMEMSIZE).step_by(1024) {
self.erase(block);
}
Ok(())
}
fn store_write_buffer(&mut self, src: &[u8]) -> core::result::Result<(), ()> {
self.buffer[..src.len()].clone_from_slice(src);
Ok(())
}
fn program(&mut self, address: u32, length: usize) -> core::result::Result<(), DFUMemError> {
if self.overrides.program.is_some() {
return self.overrides.program.unwrap()(self, address, length);
}
if address < TESTMEM_BASE {
return Err(DFUMemError::Address);
}
let dst = (address - TESTMEM_BASE) as usize;
if dst >= TESTMEMSIZE {
return Err(DFUMemError::Address);
}
let len = self.write_from_buf(dst, length);
if len != length {
return Err(DFUMemError::Prog);
}
if !self.verify_with_buf(dst, length) {
return Err(DFUMemError::Verify);
}
Ok(())
}
fn manifestation(&mut self) -> Result<(), DFUManifestationError> {
if self.overrides.manifestation.is_some() {
return self.overrides.manifestation.unwrap()(self);
}
panic!("emulate device reset");
}
}
mod mockusb;
use mockusb::*;
struct MkDFU {}
impl ClsMaker<TestBus, DFUClass<TestBus, TestMem>> for MkDFU {
fn create<'a>(&mut self, alloc: &'a UsbBusAllocator<TestBus>) -> DFUClass<TestBus, TestMem> {
DFUClass::new(&alloc, TestMem::new(None))
}
}
#[test]
fn test_get_configuration() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0x80, 0x6, 0, 2, 0, 0, 0x80, 0], None, &mut buf).expect("len");
assert_eq!(len, 27);
let device = &buf[..9];
let interf = &buf[9..18];
let config = &buf[18..len];
assert_eq!(device[0], 9);
assert_eq!(
interf,
&[
9, 4, 0, 0, 0, 0xfe, 1, 2, 4
]
);
assert_eq!(
config,
&[
9, 0x21,
0b1011, 0x22, 0x11, 128, 0, 0x1a, 1, ]
);
len = transact(&mut dfu, &[0x80, 0x6, 0, 3, 0, 0, 0x80, 0], None, &mut buf).expect("len");
assert_eq!(len, 4);
assert_eq!(&buf[0..4], &[len as u8, 3u8, 9, 4]);
len = transact(&mut dfu, &[0x80, 0x6, 4, 3, 9, 4, 0x80, 0], None, &mut buf).expect("len");
assert_eq!(len, 2 + TestMem::MEM_INFO_STRING.len() * 2);
assert_eq!(&buf[0..2], &[len as u8, 3u8]);
let u16v: Vec<_> = buf[2..len]
.chunks(2)
.map(|v| (v[0] as u16) | ((v[1] as u16) << 8))
.collect();
let istr = String::from_utf16(&u16v).unwrap();
assert_eq!(istr, TestMem::MEM_INFO_STRING);
len = transact(&mut dfu, &[0x80, 0x6, 4, 3, 0, 0, 0x80, 0], None, &mut buf).expect("len");
assert_eq!(len, 2 + TestMem::MEM_INFO_STRING.len() * 2);
assert_eq!(&buf[0..2], &[len as u8, 3u8]);
let u16v: Vec<_> = buf[2..len]
.chunks(2)
.map(|v| (v[0] as u16) | ((v[1] as u16) << 8))
.collect();
let istr = String::from_utf16(&u16v).unwrap();
assert_eq!(istr, TestMem::MEM_INFO_STRING);
transact(&mut dfu, &[0x80, 0x6, 4, 3, 1, 0, 0x80, 0], None, &mut buf).expect_err("stall");
});
}
#[test]
fn test_set_address_pointer() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let new_addr: u32 = 0x2000_0000;
assert_ne!(new_addr, dfu.get_address_pointer());
assert_eq!(dfu.get_address_pointer(), TestMem::INITIAL_ADDRESS_POINTER);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let b = new_addr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x21, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
assert_eq!(dfu.get_address_pointer(), TestMem::INITIAL_ADDRESS_POINTER);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 4, 0]); assert_eq!(dfu.get_address_pointer(), new_addr);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]); });
}
#[test]
fn test_upload() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[0, 0, 1, 0, 2, 0, 3, 0, 4, 0]);
assert_eq!(&buf[120..128], &[60, 0, 61, 0, 62, 0, 63, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 9, 0]);
len = transact(&mut dfu, &[0xa1, 0x2, 7, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[64, 1, 65, 1, 66, 1, 67, 1, 68, 1]);
assert_eq!(&buf[120..128], &[124, 1, 125, 1, 126, 1, 127, 1]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 9, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]); });
}
#[test]
fn test_erase() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let blkaddr: u32 = TestMem::INITIAL_ADDRESS_POINTER + 1024;
let et = TestMem::ERASE_TIME_MS.to_le_bytes();
assert_ne!(blkaddr, dfu.get_address_pointer());
assert_ne!(0, TestMem::ERASE_TIME_MS);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let b = blkaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x41, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, et[0], et[1], et[2], 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x2, 9, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[192, 1, 193, 1, 194, 1, 195, 1, 196, 1]);
assert_eq!(&buf[120..128], &[252, 1, 253, 1, 254, 1, 255, 1]);
len = transact(&mut dfu, &[0xa1, 0x2, 10, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[0xff; 10]);
assert_eq!(&buf[120..128], &[0xff; 8]);
len = transact(&mut dfu, &[0xa1, 0x2, 15, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[0xff; 10]);
assert_eq!(&buf[120..128], &[0xff; 8]);
len = transact(&mut dfu, &[0xa1, 0x2, 18, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[0, 4, 1, 4, 2, 4, 3, 4, 4, 4]);
assert_eq!(&buf[120..128], &[60, 4, 61, 4, 62, 4, 63, 4]);
});
}
#[test]
fn test_erase_all() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let et = TestMem::FULL_ERASE_TIME_MS.to_le_bytes();
assert_ne!(0, TestMem::FULL_ERASE_TIME_MS);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 1, 0],
Some(&[0x41]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, et[0], et[1], et[2], 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
let mut blk = 2; loop {
len = transact(
&mut dfu,
&[
0xa1,
0x2,
(blk & 0xff) as u8,
(blk >> 8) as u8,
0,
0,
128,
0,
],
None,
&mut buf,
)
.expect("len");
if len == 0 {
break;
}
dbg!(len);
dbg!(&buf[0..len]);
assert_eq!(len, 128);
assert_eq!(&buf[0..len], &[0xffu8; 128]);
blk += 1;
assert!(blk < 0xffff);
}
assert_eq!(blk - 2, TESTMEMSIZE / 128);
});
}
#[test]
fn test_upload_last() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..10], &[0, 0, 1, 0, 2, 0, 3, 0, 4, 0]);
assert_eq!(&buf[120..128], &[60, 0, 61, 0, 62, 0, 63, 0]);
len = transact(
&mut dfu,
&[0xa1, 0x2, 0x01, 0x2, 0, 0, 128, 0],
None,
&mut buf,
)
.expect("len");
assert_eq!(len, 128);
assert_eq!(
&buf[0..10],
&[192, 127, 193, 127, 194, 127, 195, 127, 196, 127]
);
assert_eq!(&buf[120..128], &[252, 127, 253, 127, 254, 127, 255, 127]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 9, 0]);
len = transact(
&mut dfu,
&[0xa1, 0x2, 0x02, 0x2, 0, 0, 128, 0],
None,
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]); });
}
#[test]
fn test_upload_err_bad_address() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let invalid_addr: u32 = TestMem::INITIAL_ADDRESS_POINTER - 0x1_0000;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let b = invalid_addr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x21, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
assert_eq!(dfu.get_address_pointer(), TestMem::INITIAL_ADDRESS_POINTER);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 4, 0]); assert_eq!(dfu.get_address_pointer(), invalid_addr);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
let e = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf)
.expect_err("stall");
assert_eq!(e, EPErr::Stalled);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[8, 0, 0, 0, 10, 0]); });
}
#[test]
fn test_download_to_upload_err() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let xaddr: u32 = TestMem::INITIAL_ADDRESS_POINTER;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let b = xaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x21, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
let e = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf)
.expect_err("stall");
assert_eq!(e, EPErr::Stalled);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[15, 0, 0, 0, 10, 0]); });
}
#[test]
fn test_download_program0_with_tail() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x5, 0, 0, 0, 0, 1, 0], None, &mut buf).expect("len");
assert_eq!(len, 1);
assert_eq!(buf[0], 3);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 3, 0, 0, 0, 64, 0],
Some(&[0x00; 64]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x5, 0, 0, 0, 0, 1, 0], None, &mut buf).expect("len");
assert_eq!(len, 1);
assert_eq!(buf[0], 3);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..128], &[0; 128]);
len = transact(&mut dfu, &[0xa1, 0x2, 3, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..64], &[0; 64]);
assert_eq!(&buf[64..72], &[96, 0, 97, 0, 98, 0, 99, 0]);
assert_eq!(&buf[120..128], &[124, 0, 125, 0, 126, 0, 127, 0]);
len = transact(&mut dfu, &[0xa1, 0x2, 4, 0, 0, 0, 64, 0], None, &mut buf).expect("len");
assert_eq!(len, 64);
assert_eq!(&buf[0..10], &[128, 0, 129, 0, 130, 0, 131, 0, 132, 0]);
assert_eq!(&buf[56..64], &[156, 0, 157, 0, 158, 0, 159, 0]);
});
}
#[test]
fn test_download_program_err_verify_and_to_idle() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0x55; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[7, 0, 0, 0, 10, 0]);
len = transact(&mut dfu, &[0x21, 0x4, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]); });
}
#[test]
fn test_erase_and_program() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let blkaddr: u32 = TestMem::INITIAL_ADDRESS_POINTER;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let b = blkaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x41, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 255, 1, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0x55; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..128], &[0x55; 128]);
len = transact(&mut dfu, &[0xa1, 0x2, 3, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..128], &[0xff; 128]);
});
}
#[test]
#[should_panic(expected = "emulate device reset")]
fn test_manifestation() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x1, 3, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 1, 0, 0, 7, 0]);
unreachable!("device must reset");
});
}
struct MkDFUMTret {}
impl ClsMaker<TestBus, DFUClass<TestBus, TestMem>> for MkDFUMTret {
fn create<'a>(&mut self, alloc: &'a UsbBusAllocator<TestBus>) -> DFUClass<TestBus, TestMem> {
fn manifestation(tm: &mut TestMem) -> Result<(), DFUManifestationError> {
Ok(())
}
let overrides = TestMemOverride {
read: None,
erase: None,
program: None,
manifestation: Some(manifestation),
};
DFUClass::new(&alloc, TestMem::new(Some(overrides)))
}
}
#[test]
fn test_manifestation_no_reset() {
with_usb(&mut MkDFUMTret {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x1, 3, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 1, 0, 0, 7, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 8, 0]);
let e =
transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect_err("stall");
assert_eq!(e, EPErr::Stalled);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 8, 0]); });
}
struct MkDFUMTerr {}
impl ClsMaker<TestBus, DFUClass<TestBus, TestMem>> for MkDFUMTerr {
fn create<'a>(&mut self, alloc: &'a UsbBusAllocator<TestBus>) -> DFUClass<TestBus, TestMem> {
fn manifestation(tm: &mut TestMem) -> Result<(), DFUManifestationError> {
Err(DFUManifestationError::NotDone)
}
let overrides = TestMemOverride {
read: None,
erase: None,
program: None,
manifestation: Some(manifestation),
};
DFUClass::new(&alloc, TestMem::new(Some(overrides)))
}
}
#[test]
fn test_manifestation_err_not_done() {
with_usb(&mut MkDFUMTerr {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x1, 3, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 1, 0, 0, 7, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[9, 0, 0, 0, 10, 0]); });
}
struct MkDFUEraseerr {}
impl ClsMaker<TestBus, DFUClass<TestBus, TestMem>> for MkDFUEraseerr {
fn create<'a>(&mut self, alloc: &'a UsbBusAllocator<TestBus>) -> DFUClass<TestBus, TestMem> {
fn erase(tm: &mut TestMem, address: u32) -> core::result::Result<(), DFUMemError> {
Err(DFUMemError::CheckErased)
}
let overrides = TestMemOverride {
read: None,
erase: Some(erase),
program: None,
manifestation: None,
};
DFUClass::new(&alloc, TestMem::new(Some(overrides)))
}
}
#[test]
fn test_erase_err_verfail() {
with_usb(&mut MkDFUEraseerr {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let blkaddr: u32 = TestMem::INITIAL_ADDRESS_POINTER;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let b = blkaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x41, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 255, 1, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[5, 0, 0, 0, 10, 0]); });
}
struct MkDFUProgerr {}
impl ClsMaker<TestBus, DFUClass<TestBus, TestMem>> for MkDFUProgerr {
fn create<'a>(&mut self, alloc: &'a UsbBusAllocator<TestBus>) -> DFUClass<TestBus, TestMem> {
fn program(tm: &mut TestMem, address: u32, length: usize) -> Result<(), DFUMemError> {
if address > TestMem::INITIAL_ADDRESS_POINTER {
Err(DFUMemError::Write)
} else {
Err(DFUMemError::Prog)
}
}
let overrides = TestMemOverride {
read: None,
erase: None,
program: Some(program),
manifestation: None,
};
DFUClass::new(&alloc, TestMem::new(Some(overrides)))
}
}
#[test]
fn test_program_err_prog_write() {
with_usb(&mut MkDFUProgerr {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0x55; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[6, 0, 0, 0, 10, 0]);
len = transact(&mut dfu, &[0x21, 0x4, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(
&mut dfu,
&[0x21, 0x1, 3, 0, 0, 0, 128, 0],
Some(&[0x55; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[3, 0, 0, 0, 10, 0]); });
}
struct MkDFUReadErr {}
impl ClsMaker<TestBus, DFUClass<TestBus, TestMem>> for MkDFUReadErr {
fn create<'a>(&mut self, alloc: &'a UsbBusAllocator<TestBus>) -> DFUClass<TestBus, TestMem> {
fn read(
tm: &mut TestMem,
address: u32,
length: usize,
) -> core::result::Result<&[u8], DFUMemError> {
if address > TestMem::INITIAL_ADDRESS_POINTER {
Err(DFUMemError::ErrVendor)
} else {
Err(DFUMemError::Address)
}
}
let overrides = TestMemOverride {
read: Some(read),
erase: None,
program: None,
manifestation: None,
};
DFUClass::new(&alloc, TestMem::new(Some(overrides)))
}
}
#[test]
fn test_read_err_addr_vend() {
with_usb(&mut MkDFUReadErr {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let mut e;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
e = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf)
.expect_err("stall");
assert_eq!(e, EPErr::Stalled);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[8, 0, 0, 0, 10, 0]);
len = transact(&mut dfu, &[0x21, 0x4, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
e = transact(&mut dfu, &[0xa1, 0x2, 3, 0, 0, 0, 128, 0], None, &mut buf)
.expect_err("stall");
assert_eq!(e, EPErr::Stalled);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[11, 0, 0, 0, 10, 0]); });
}
#[test]
fn test_download_program_short() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
assert!(16 < TestMem::TRANSFER_SIZE);
let mut blkaddr: u32 = TestMem::INITIAL_ADDRESS_POINTER;
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let mut b = blkaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x41, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 255, 1, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 128, 0],
Some(&[0x55; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
blkaddr = TestMem::INITIAL_ADDRESS_POINTER + 128;
b = blkaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x21, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 2, 0, 0, 0, 16, 0],
Some(&[0xaa; 16]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
blkaddr = TestMem::INITIAL_ADDRESS_POINTER;
b = blkaddr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x21, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(&mut dfu, &[0x21, 0x6, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x2, 2, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
assert_eq!(&buf[0..128], &[0x55; 128]);
len = transact(&mut dfu, &[0xa1, 0x2, 3, 0, 0, 0, 128, 0], None, &mut buf).expect("len");
assert_eq!(len, 128);
let mut refblock = [0xffu8; 128];
refblock[0..16].fill(0xaa);
assert_eq!(&buf[0..128], &refblock);
});
}
#[test]
fn test_status_err_small_buffer() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let e =
transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 5, 0], None, &mut buf).expect_err("stall");
assert_eq!(e, EPErr::Stalled);
});
}
#[test]
fn test_state_err_small_buffer() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let e =
transact(&mut dfu, &[0xa1, 0x5, 0, 0, 0, 0, 0, 0], None, &mut buf).expect_err("stall");
assert_eq!(e, EPErr::Stalled);
});
}
#[test]
fn test_commands_err_small_buffer() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let e =
transact(&mut dfu, &[0xa1, 0x2, 0, 0, 0, 0, 2, 0], None, &mut buf).expect_err("stall");
assert_eq!(e, EPErr::Stalled);
});
}
#[test]
fn test_err_addr_overflow() {
with_usb(&mut MkDFU {}, |mut dfu, transact| {
let mut buf = [0u8; 256];
let mut len;
let invalid_addr: u32 = 0xffff_fff0;
let b = invalid_addr.to_le_bytes();
len = transact(
&mut dfu,
&[0x21, 0x1, 0, 0, 0, 0, 5, 0],
Some(&[0x21, b[0], b[1], b[2], b[3]]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 4, 0]); assert_eq!(dfu.get_address_pointer(), invalid_addr);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 5, 0]);
len = transact(
&mut dfu,
&[0x21, 0x1, 3, 0, 0, 0, 128, 0],
Some(&[0x55; 128]),
&mut buf,
)
.expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 50, 0, 0, 4, 0]);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[8, 0, 0, 0, 10, 0]);
len = transact(&mut dfu, &[0x21, 0x4, 0, 0, 0, 0, 0, 0], None, &mut buf).expect("len");
assert_eq!(len, 0);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[0, 0, 0, 0, 2, 0]);
let e = transact(&mut dfu, &[0xa1, 0x2, 3, 0, 0, 0, 128, 0], None, &mut buf)
.expect_err("stall");
assert_eq!(e, EPErr::Stalled);
len = transact(&mut dfu, &[0xa1, 0x3, 0, 0, 0, 0, 6, 0], None, &mut buf).expect("len");
assert_eq!(len, 6);
assert_eq!(&buf[0..6], &[8, 0, 0, 0, 10, 0]); });
}