Skip to content

Commit 3474a1d

Browse files
committed
Add tests for flash storage
1 parent b2c1ff4 commit 3474a1d

File tree

1 file changed

+209
-0
lines changed

1 file changed

+209
-0
lines changed

src/nor_flash.rs

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,3 +493,212 @@ impl<
493493
}
494494
}
495495

496+
#[cfg(test)]
497+
mod test {
498+
use super::*;
499+
500+
const TEST_SIZE: usize = 64;
501+
const TEST_WORD: usize = 4;
502+
const TEST_PAGE: usize = 16;
503+
type TestFlash = MockFlash<TEST_SIZE, TEST_WORD, TEST_WORD, TEST_PAGE>;
504+
505+
const fn gen_test_data<const N: usize>() -> [u8; N] {
506+
let mut data = [0u8; N];
507+
let mut i = 0;
508+
509+
while i < N {
510+
data[i] = i as u8;
511+
i += 1;
512+
}
513+
514+
data
515+
}
516+
517+
const TEST_DATA: [u8; 64] = gen_test_data();
518+
519+
fn gen_ranges(aligned: Option<bool>) -> impl Iterator<Item = (usize, usize)> {
520+
(0..TEST_SIZE).flat_map(move |off| {
521+
(0..=TEST_SIZE - off)
522+
.filter(move |len| {
523+
aligned
524+
.map(|aligned| aligned == (off % TEST_WORD == 0 && len % TEST_WORD == 0))
525+
.unwrap_or(true)
526+
})
527+
.map(move |len| (off, len))
528+
})
529+
}
530+
531+
#[test]
532+
fn aligned_test_ranges() {
533+
let mut ranges = gen_ranges(true.into());
534+
535+
assert_eq!(ranges.next(), Some((0, 0)));
536+
assert_eq!(ranges.next(), Some((0, 4)));
537+
assert_eq!(ranges.next(), Some((0, 8)));
538+
for _ in 0..13 {
539+
ranges.next();
540+
}
541+
assert_eq!(ranges.next(), Some((0, 64)));
542+
assert_eq!(ranges.next(), Some((4, 0)));
543+
assert_eq!(ranges.next(), Some((4, 4)));
544+
for _ in 0..13 {
545+
ranges.next();
546+
}
547+
assert_eq!(ranges.next(), Some((4, 60)));
548+
assert_eq!(ranges.next(), Some((8, 0)));
549+
for _ in 0..13 {
550+
ranges.next();
551+
}
552+
assert_eq!(ranges.next(), Some((8, 56)));
553+
assert_eq!(ranges.next(), Some((12, 0)));
554+
for _ in 0..12 {
555+
ranges.next();
556+
}
557+
assert_eq!(ranges.next(), Some((12, 52)));
558+
assert_eq!(ranges.next(), Some((16, 0)));
559+
for _ in 0..11 {
560+
ranges.next();
561+
}
562+
assert_eq!(ranges.next(), Some((16, 48)));
563+
assert_eq!(ranges.next(), Some((20, 0)));
564+
}
565+
566+
#[test]
567+
fn not_aligned_test_ranges() {
568+
let mut ranges = gen_ranges(false.into());
569+
570+
assert_eq!(ranges.next(), Some((0, 1)));
571+
assert_eq!(ranges.next(), Some((0, 2)));
572+
assert_eq!(ranges.next(), Some((0, 3)));
573+
assert_eq!(ranges.next(), Some((0, 5)));
574+
for _ in 0..43 {
575+
ranges.next();
576+
}
577+
assert_eq!(ranges.next(), Some((0, 63)));
578+
assert_eq!(ranges.next(), Some((1, 0)));
579+
}
580+
581+
#[test]
582+
fn aligned_read_raw() {
583+
let mut flash = TestFlash::default();
584+
flash[..TEST_DATA.len()].copy_from_slice(&TEST_DATA);
585+
let mut buffer = [0; TEST_SIZE];
586+
587+
for (off, len) in gen_ranges(true.into()) {
588+
assert_eq!(flash.read(off as u32, &mut buffer[..len]), Ok(()));
589+
assert_eq!(buffer[..len], TEST_DATA[off..][..len]);
590+
}
591+
}
592+
593+
#[test]
594+
fn not_aligned_read_raw() {
595+
let mut flash = TestFlash::default();
596+
let mut buffer = [0; TEST_SIZE];
597+
598+
for (off, len) in gen_ranges(false.into()) {
599+
assert_eq!(
600+
flash.read(off as u32, &mut buffer[..len]),
601+
Err(NorFlashErrorKind::NotAligned)
602+
);
603+
}
604+
}
605+
606+
#[test]
607+
fn aligned_read_rmw() {
608+
let mut flash = TestFlash::default();
609+
flash[..TEST_DATA.len()].copy_from_slice(&TEST_DATA);
610+
let mut buffer = [0; TEST_SIZE];
611+
612+
let mut flash_buffer = [0; TEST_PAGE];
613+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
614+
615+
for (off, len) in gen_ranges(true.into()) {
616+
assert_eq!(flash.read(off as u32, &mut buffer[..len]), Ok(()));
617+
assert_eq!(buffer[..len], TEST_DATA[off..][..len]);
618+
}
619+
}
620+
621+
#[test]
622+
fn not_aligned_read_rmw() {
623+
let mut flash = TestFlash::default();
624+
flash[..TEST_DATA.len()].copy_from_slice(&TEST_DATA);
625+
let mut buffer = [0; TEST_SIZE];
626+
627+
let mut flash_buffer = [0; TEST_PAGE];
628+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
629+
630+
for (off, len) in gen_ranges(false.into()) {
631+
assert_eq!(flash.read(off as u32, &mut buffer[..len]), Ok(()));
632+
assert_eq!(buffer[..len], TEST_DATA[off..][..len]);
633+
}
634+
}
635+
636+
#[test]
637+
fn aligned_write_raw() {
638+
let mut flash = TestFlash::default();
639+
640+
for (off, len) in gen_ranges(true.into()) {
641+
assert_eq!(flash.erase(0, TEST_SIZE as u32), Ok(()));
642+
assert_eq!(flash.write(off as u32, &TEST_DATA[..len]), Ok(()));
643+
assert_eq!(flash[off..][..len], TEST_DATA[..len]);
644+
}
645+
}
646+
647+
#[test]
648+
fn not_aligned_write_raw() {
649+
let mut flash = TestFlash::default();
650+
651+
for (off, len) in gen_ranges(false.into()) {
652+
assert_eq!(
653+
flash.write(off as u32, &TEST_DATA[..len]),
654+
Err(NorFlashErrorKind::NotAligned)
655+
);
656+
}
657+
}
658+
659+
#[test]
660+
fn not_aligned_erase_raw() {
661+
let mut flash = TestFlash::default();
662+
663+
for (off, len) in [
664+
(1usize, TEST_PAGE),
665+
(0, TEST_PAGE - 1),
666+
(TEST_PAGE, TEST_PAGE + 1),
667+
] {
668+
assert_eq!(
669+
flash.erase(off as u32, (off + len) as u32),
670+
Err(NorFlashErrorKind::NotAligned)
671+
);
672+
}
673+
}
674+
675+
#[test]
676+
fn aligned_write_rmw() {
677+
let mut flash = TestFlash::default();
678+
let mut flash_buffer = [0u8; TEST_PAGE];
679+
680+
for (off, len) in gen_ranges(true.into()) {
681+
{
682+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
683+
println!("{off}.. #{len}");
684+
assert_eq!(flash.write(off as u32, &TEST_DATA[..len]), Ok(()));
685+
}
686+
assert_eq!(flash[off..][..len], TEST_DATA[..len]);
687+
}
688+
}
689+
690+
#[test]
691+
fn not_aligned_write_rmw() {
692+
let mut flash = TestFlash::default();
693+
let mut flash_buffer = [0u8; TEST_PAGE];
694+
695+
for (off, len) in gen_ranges(false.into()) {
696+
{
697+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
698+
println!("{off}.. #{len}");
699+
assert_eq!(flash.write(off as u32, &TEST_DATA[..len]), Ok(()));
700+
}
701+
assert_eq!(flash[off..][..len], TEST_DATA[..len]);
702+
}
703+
}
704+
}

0 commit comments

Comments
 (0)