[[case]] # simple formatting test code = ''' lfs2_format(&lfs2, &cfg) => 0; ''' [[case]] # mount/unmount code = ''' lfs2_format(&lfs2, &cfg) => 0; lfs2_mount(&lfs2, &cfg) => 0; lfs2_unmount(&lfs2) => 0; ''' [[case]] # reentrant format reentrant = true code = ''' err = lfs2_mount(&lfs2, &cfg); if (err) { lfs2_format(&lfs2, &cfg) => 0; lfs2_mount(&lfs2, &cfg) => 0; } lfs2_unmount(&lfs2) => 0; ''' [[case]] # invalid mount code = ''' lfs2_mount(&lfs2, &cfg) => LFS2_ERR_CORRUPT; ''' [[case]] # expanding superblock define.LFS2_BLOCK_CYCLES = [32, 33, 1] define.N = [10, 100, 1000] code = ''' lfs2_format(&lfs2, &cfg) => 0; lfs2_mount(&lfs2, &cfg) => 0; for (int i = 0; i < N; i++) { lfs2_file_open(&lfs2, &file, "dummy", LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0; lfs2_file_close(&lfs2, &file) => 0; lfs2_stat(&lfs2, "dummy", &info) => 0; assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_remove(&lfs2, "dummy") => 0; } lfs2_unmount(&lfs2) => 0; // one last check after power-cycle lfs2_mount(&lfs2, &cfg) => 0; lfs2_file_open(&lfs2, &file, "dummy", LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0; lfs2_file_close(&lfs2, &file) => 0; lfs2_stat(&lfs2, "dummy", &info) => 0; assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_unmount(&lfs2) => 0; ''' [[case]] # expanding superblock with power cycle define.LFS2_BLOCK_CYCLES = [32, 33, 1] define.N = [10, 100, 1000] code = ''' lfs2_format(&lfs2, &cfg) => 0; for (int i = 0; i < N; i++) { lfs2_mount(&lfs2, &cfg) => 0; // remove lingering dummy? err = lfs2_stat(&lfs2, "dummy", &info); assert(err == 0 || (err == LFS2_ERR_NOENT && i == 0)); if (!err) { assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_remove(&lfs2, "dummy") => 0; } lfs2_file_open(&lfs2, &file, "dummy", LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0; lfs2_file_close(&lfs2, &file) => 0; lfs2_stat(&lfs2, "dummy", &info) => 0; assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_unmount(&lfs2) => 0; } // one last check after power-cycle lfs2_mount(&lfs2, &cfg) => 0; lfs2_stat(&lfs2, "dummy", &info) => 0; assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_unmount(&lfs2) => 0; ''' [[case]] # reentrant expanding superblock define.LFS2_BLOCK_CYCLES = [2, 1] define.N = 24 reentrant = true code = ''' err = lfs2_mount(&lfs2, &cfg); if (err) { lfs2_format(&lfs2, &cfg) => 0; lfs2_mount(&lfs2, &cfg) => 0; } for (int i = 0; i < N; i++) { // remove lingering dummy? err = lfs2_stat(&lfs2, "dummy", &info); assert(err == 0 || (err == LFS2_ERR_NOENT && i == 0)); if (!err) { assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_remove(&lfs2, "dummy") => 0; } lfs2_file_open(&lfs2, &file, "dummy", LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0; lfs2_file_close(&lfs2, &file) => 0; lfs2_stat(&lfs2, "dummy", &info) => 0; assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); } lfs2_unmount(&lfs2) => 0; // one last check after power-cycle lfs2_mount(&lfs2, &cfg) => 0; lfs2_stat(&lfs2, "dummy", &info) => 0; assert(strcmp(info.name, "dummy") == 0); assert(info.type == LFS2_TYPE_REG); lfs2_unmount(&lfs2) => 0; '''