Rough implementation of lfsr_format/mount/unmount

This work already indicates we need more data-related helper
functions. We shouldn't need this many function calls to do "simple"
operations such as fetch the superconfig if it exists.
This commit is contained in:
Christopher Haster
2023-04-22 14:06:29 -05:00
parent 5d68d7eccd
commit 70a3a2b16e
5 changed files with 730 additions and 211 deletions
+157 -137
View File
@@ -1,151 +1,171 @@
# simple formatting test
# simple format test
[cases.test_superblocks_format]
code = '''
lfs_t lfs;
lfs_format(&lfs, cfg) => 0;
lfsr_format(&lfs, cfg) => 0;
'''
# mount/unmount
# simple mount/unmount test
[cases.test_superblocks_mount]
code = '''
lfs_t lfs;
lfs_format(&lfs, cfg) => 0;
lfs_mount(&lfs, cfg) => 0;
lfs_unmount(&lfs) => 0;
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 = 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;
'''
## 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;
#'''