Skip to content

Commit db8da46

Browse files
committed
Add tests for flash storage
1 parent dab580d commit db8da46

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
@@ -610,3 +610,212 @@ impl<
610610
}
611611
}
612612

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

0 commit comments

Comments
 (0)