Skip to content

Commit f954fd2

Browse files
committed
Add tests for flash storage
1 parent ff8c00c commit f954fd2

File tree

1 file changed

+208
-0
lines changed

1 file changed

+208
-0
lines changed

src/nor_flash.rs

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,3 +616,211 @@ impl<
616616
Ok(())
617617
}
618618
}
619+
620+
#[cfg(test)]
621+
mod test {
622+
use super::*;
623+
624+
const TEST_SIZE: usize = 64;
625+
const TEST_WORD: usize = 4;
626+
const TEST_PAGE: usize = 16;
627+
type TestFlash = MockFlash<TEST_SIZE, TEST_WORD, TEST_WORD, TEST_PAGE>;
628+
629+
const fn gen_test_data<const N: usize>() -> [u8; N] {
630+
let mut data = [0u8; N];
631+
let mut i = 0;
632+
633+
while i < N {
634+
data[i] = i as u8;
635+
i += 1;
636+
}
637+
638+
data
639+
}
640+
641+
const TEST_DATA: [u8; 64] = gen_test_data();
642+
643+
fn gen_ranges(aligned: Option<bool>) -> impl Iterator<Item = (usize, usize)> {
644+
(0..TEST_SIZE).flat_map(move |off| {
645+
(0..=TEST_SIZE - off)
646+
.filter(move |len| {
647+
aligned
648+
.map(|aligned| aligned == (off % TEST_WORD == 0 && len % TEST_WORD == 0))
649+
.unwrap_or(true)
650+
})
651+
.map(move |len| (off, len))
652+
})
653+
}
654+
655+
#[test]
656+
fn aligned_test_ranges() {
657+
let mut ranges = gen_ranges(true.into());
658+
659+
assert_eq!(ranges.next(), Some((0, 0)));
660+
assert_eq!(ranges.next(), Some((0, 4)));
661+
assert_eq!(ranges.next(), Some((0, 8)));
662+
for _ in 0..13 {
663+
ranges.next();
664+
}
665+
assert_eq!(ranges.next(), Some((0, 64)));
666+
assert_eq!(ranges.next(), Some((4, 0)));
667+
assert_eq!(ranges.next(), Some((4, 4)));
668+
for _ in 0..13 {
669+
ranges.next();
670+
}
671+
assert_eq!(ranges.next(), Some((4, 60)));
672+
assert_eq!(ranges.next(), Some((8, 0)));
673+
for _ in 0..13 {
674+
ranges.next();
675+
}
676+
assert_eq!(ranges.next(), Some((8, 56)));
677+
assert_eq!(ranges.next(), Some((12, 0)));
678+
for _ in 0..12 {
679+
ranges.next();
680+
}
681+
assert_eq!(ranges.next(), Some((12, 52)));
682+
assert_eq!(ranges.next(), Some((16, 0)));
683+
for _ in 0..11 {
684+
ranges.next();
685+
}
686+
assert_eq!(ranges.next(), Some((16, 48)));
687+
assert_eq!(ranges.next(), Some((20, 0)));
688+
}
689+
690+
#[test]
691+
fn not_aligned_test_ranges() {
692+
let mut ranges = gen_ranges(false.into());
693+
694+
assert_eq!(ranges.next(), Some((0, 1)));
695+
assert_eq!(ranges.next(), Some((0, 2)));
696+
assert_eq!(ranges.next(), Some((0, 3)));
697+
assert_eq!(ranges.next(), Some((0, 5)));
698+
for _ in 0..43 {
699+
ranges.next();
700+
}
701+
assert_eq!(ranges.next(), Some((0, 63)));
702+
assert_eq!(ranges.next(), Some((1, 0)));
703+
}
704+
705+
#[test]
706+
fn aligned_read_raw() {
707+
let mut flash = TestFlash::default();
708+
flash[..TEST_DATA.len()].copy_from_slice(&TEST_DATA);
709+
let mut buffer = [0; TEST_SIZE];
710+
711+
for (off, len) in gen_ranges(true.into()) {
712+
assert_eq!(flash.read(off as u32, &mut buffer[..len]), Ok(()));
713+
assert_eq!(buffer[..len], TEST_DATA[off..][..len]);
714+
}
715+
}
716+
717+
#[test]
718+
fn not_aligned_read_raw() {
719+
let mut flash = TestFlash::default();
720+
let mut buffer = [0; TEST_SIZE];
721+
722+
for (off, len) in gen_ranges(false.into()) {
723+
assert_eq!(
724+
flash.read(off as u32, &mut buffer[..len]),
725+
Err(NorFlashErrorKind::NotAligned)
726+
);
727+
}
728+
}
729+
730+
#[test]
731+
fn aligned_read_rmw() {
732+
let mut flash = TestFlash::default();
733+
flash[..TEST_DATA.len()].copy_from_slice(&TEST_DATA);
734+
let mut buffer = [0; TEST_SIZE];
735+
736+
let mut flash_buffer = [0; TEST_PAGE];
737+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
738+
739+
for (off, len) in gen_ranges(true.into()) {
740+
assert_eq!(flash.read(off as u32, &mut buffer[..len]), Ok(()));
741+
assert_eq!(buffer[..len], TEST_DATA[off..][..len]);
742+
}
743+
}
744+
745+
#[test]
746+
fn not_aligned_read_rmw() {
747+
let mut flash = TestFlash::default();
748+
flash[..TEST_DATA.len()].copy_from_slice(&TEST_DATA);
749+
let mut buffer = [0; TEST_SIZE];
750+
751+
let mut flash_buffer = [0; TEST_PAGE];
752+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
753+
754+
for (off, len) in gen_ranges(false.into()) {
755+
assert_eq!(flash.read(off as u32, &mut buffer[..len]), Ok(()));
756+
assert_eq!(buffer[..len], TEST_DATA[off..][..len]);
757+
}
758+
}
759+
760+
#[test]
761+
fn aligned_write_raw() {
762+
let mut flash = TestFlash::default();
763+
764+
for (off, len) in gen_ranges(true.into()) {
765+
assert_eq!(flash.erase(0, TEST_SIZE as u32), Ok(()));
766+
assert_eq!(flash.write(off as u32, &TEST_DATA[..len]), Ok(()));
767+
assert_eq!(flash[off..][..len], TEST_DATA[..len]);
768+
}
769+
}
770+
771+
#[test]
772+
fn not_aligned_write_raw() {
773+
let mut flash = TestFlash::default();
774+
775+
for (off, len) in gen_ranges(false.into()) {
776+
assert_eq!(
777+
flash.write(off as u32, &TEST_DATA[..len]),
778+
Err(NorFlashErrorKind::NotAligned)
779+
);
780+
}
781+
}
782+
783+
#[test]
784+
fn not_aligned_erase_raw() {
785+
let mut flash = TestFlash::default();
786+
787+
for (off, len) in [
788+
(1usize, TEST_PAGE),
789+
(0, TEST_PAGE - 1),
790+
(TEST_PAGE, TEST_PAGE + 1),
791+
] {
792+
assert_eq!(
793+
flash.erase(off as u32, (off + len) as u32),
794+
Err(NorFlashErrorKind::NotAligned)
795+
);
796+
}
797+
}
798+
799+
#[test]
800+
fn aligned_write_rmw() {
801+
let mut flash = TestFlash::default();
802+
let mut flash_buffer = [0u8; TEST_PAGE];
803+
804+
for (off, len) in gen_ranges(true.into()) {
805+
{
806+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
807+
assert_eq!(flash.write(off as u32, &TEST_DATA[..len]), Ok(()));
808+
}
809+
assert_eq!(flash[off..][..len], TEST_DATA[..len]);
810+
}
811+
}
812+
813+
#[test]
814+
fn not_aligned_write_rmw() {
815+
let mut flash = TestFlash::default();
816+
let mut flash_buffer = [0u8; TEST_PAGE];
817+
818+
for (off, len) in gen_ranges(false.into()) {
819+
{
820+
let mut flash = RmwNorFlashStorage::new(&mut flash, &mut flash_buffer);
821+
assert_eq!(flash.write(off as u32, &TEST_DATA[..len]), Ok(()));
822+
}
823+
assert_eq!(flash[off..][..len], TEST_DATA[..len]);
824+
}
825+
}
826+
}

0 commit comments

Comments
 (0)