## simple format test #[cases.test_superblocks_format] #code = ''' # lfs_t lfs; # lfsr_format(&lfs, cfg) => 0; #''' # ## simple mount/unmount test #[cases.test_superblocks_mount] #code = ''' # lfs_t lfs; # lfsr_format(&lfs, cfg) => 0; # lfsr_mount(&lfs, cfg) => 0; # lfsr_unmount(&lfs) => 0; #''' # ## reentrant format #[cases.test_superblocks_reentrant_format] #reentrant = true #code = ''' # lfs_t lfs; # int err = lfsr_mount(&lfs, cfg); # if (err) { # lfsr_format(&lfs, cfg) => 0; # lfsr_mount(&lfs, cfg) => 0; # } # lfsr_unmount(&lfs) => 0; #''' # ## invalid mount #[cases.test_superblocks_invalid] #code = ''' # lfs_t lfs; # lfsr_mount(&lfs, cfg) => LFS_ERR_INVAL; #''' # ## superblock cycle detection #[cases.test_superblocks_cycle] #in = 'lfs.c' #code = ''' # // create a cycle # lfs_t lfs; # lfsr_format(&lfs, cfg) => 0; # lfsr_mount(&lfs, cfg) => 0; # uint8_t buf[LFSR_MPAIR_DSIZE]; # lfs_ssize_t d = lfsr_mpair_todisk(&lfs, # lfsr_mdir_mpair(&lfs.mroot), buf); # assert(d >= 0); # lfsr_mdir_commit(&lfs, &lfs.mroot, &(lfs_ssize_t){-1}, LFSR_ATTRS( # LFSR_ATTR(-1, MROOT, 0, buf, d))) => 0; # lfsr_unmount(&lfs) => 0; # # // now detect the cycle # lfsr_mount(&lfs, cfg) => LFS_ERR_CORRUPT; #''' # # # # # ### simple formatting test ##[cases.test_superblocks_format] ##code = ''' ## lfs_t lfs; ## lfs_format(&lfs, cfg) => 0; ##''' ## ### mount/unmount ##[cases.test_superblocks_mount] ##code = ''' ## lfs_t lfs; ## lfs_format(&lfs, cfg) => 0; ## lfs_mount(&lfs, cfg) => 0; ## lfs_unmount(&lfs) => 0; ##''' ## ### reentrant format ##[cases.test_superblocks_reentrant_format] ##reentrant = true ##code = ''' ## lfs_t lfs; ## int err = lfs_mount(&lfs, cfg); ## if (err) { ## lfs_format(&lfs, cfg) => 0; ## lfs_mount(&lfs, cfg) => 0; ## } ## lfs_unmount(&lfs) => 0; ##''' ## ### invalid mount ##[cases.test_superblocks_invalid_mount] ##code = ''' ## lfs_t lfs; ## lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT; ##''' ## ### expanding superblock ##[cases.test_superblocks_expand] ##defines.BLOCK_CYCLES = [32, 33, 1] ##defines.N = [10, 100, 1000] ##code = ''' ## lfs_t lfs; ## lfs_format(&lfs, cfg) => 0; ## lfs_mount(&lfs, cfg) => 0; ## for (int i = 0; i < N; i++) { ## lfs_file_t file; ## lfs_file_open(&lfs, &file, "dummy", ## LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; ## lfs_file_close(&lfs, &file) => 0; ## struct lfs_info info; ## lfs_stat(&lfs, "dummy", &info) => 0; ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_remove(&lfs, "dummy") => 0; ## } ## lfs_unmount(&lfs) => 0; ## ## // one last check after power-cycle ## lfs_mount(&lfs, cfg) => 0; ## lfs_file_t file; ## lfs_file_open(&lfs, &file, "dummy", ## LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; ## lfs_file_close(&lfs, &file) => 0; ## struct lfs_info info; ## lfs_stat(&lfs, "dummy", &info) => 0; ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_unmount(&lfs) => 0; ##''' ## ### expanding superblock with power cycle ##[cases.test_superblocks_expand_power_cycle] ##defines.BLOCK_CYCLES = [32, 33, 1] ##defines.N = [10, 100, 1000] ##code = ''' ## lfs_t lfs; ## lfs_format(&lfs, cfg) => 0; ## for (int i = 0; i < N; i++) { ## lfs_mount(&lfs, cfg) => 0; ## // remove lingering dummy? ## struct lfs_info info; ## int err = lfs_stat(&lfs, "dummy", &info); ## assert(err == 0 || (err == LFS_ERR_NOENT && i == 0)); ## if (!err) { ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_remove(&lfs, "dummy") => 0; ## } ## ## lfs_file_t file; ## lfs_file_open(&lfs, &file, "dummy", ## LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; ## lfs_file_close(&lfs, &file) => 0; ## lfs_stat(&lfs, "dummy", &info) => 0; ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_unmount(&lfs) => 0; ## } ## ## // one last check after power-cycle ## lfs_mount(&lfs, cfg) => 0; ## struct lfs_info info; ## lfs_stat(&lfs, "dummy", &info) => 0; ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_unmount(&lfs) => 0; ##''' ## ### reentrant expanding superblock ##[cases.test_superblocks_reentrant_expand] ##defines.BLOCK_CYCLES = [2, 1] ##defines.N = 24 ##reentrant = true ##code = ''' ## lfs_t lfs; ## int err = lfs_mount(&lfs, cfg); ## if (err) { ## lfs_format(&lfs, cfg) => 0; ## lfs_mount(&lfs, cfg) => 0; ## } ## ## for (int i = 0; i < N; i++) { ## // remove lingering dummy? ## struct lfs_info info; ## err = lfs_stat(&lfs, "dummy", &info); ## assert(err == 0 || (err == LFS_ERR_NOENT && i == 0)); ## if (!err) { ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_remove(&lfs, "dummy") => 0; ## } ## ## lfs_file_t file; ## lfs_file_open(&lfs, &file, "dummy", ## LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; ## lfs_file_close(&lfs, &file) => 0; ## lfs_stat(&lfs, "dummy", &info) => 0; ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## } ## ## lfs_unmount(&lfs) => 0; ## ## // one last check after power-cycle ## lfs_mount(&lfs, cfg) => 0; ## struct lfs_info info; ## lfs_stat(&lfs, "dummy", &info) => 0; ## assert(strcmp(info.name, "dummy") == 0); ## assert(info.type == LFS_TYPE_REG); ## lfs_unmount(&lfs) => 0; ##'''