Skip to content

Commit 271a6c3

Browse files
committed
Add tests for flash storage
1 parent b06a63d commit 271a6c3

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
@@ -512,3 +512,212 @@ impl<
512512
}
513513
}
514514

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

0 commit comments

Comments
 (0)