@@ -616,3 +616,211 @@ impl<
616
616
Ok ( ( ) )
617
617
}
618
618
}
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