| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- # simple shrink
- [cases.test_shrink_simple]
- defines.BLOCK_COUNT = [10, 15, 20]
- defines.AFTER_BLOCK_COUNT = [5, 10, 15, 19]
-
- if = "AFTER_BLOCK_COUNT <= BLOCK_COUNT"
- code = '''
- #ifdef LFS_SHRINKNONRELOCATING
- lfs_t lfs;
- lfs_format(&lfs, cfg) => 0;
- lfs_mount(&lfs, cfg) => 0;
- lfs_fs_grow(&lfs, AFTER_BLOCK_COUNT) => 0;
- lfs_unmount(&lfs);
- if (BLOCK_COUNT != AFTER_BLOCK_COUNT) {
- lfs_mount(&lfs, cfg) => LFS_ERR_INVAL;
- }
- lfs_t lfs2 = lfs;
- struct lfs_config cfg2 = *cfg;
- cfg2.block_count = AFTER_BLOCK_COUNT;
- lfs2.cfg = &cfg2;
- lfs_mount(&lfs2, &cfg2) => 0;
- lfs_unmount(&lfs2) => 0;
- #endif
- '''
- # shrinking full
- [cases.test_shrink_full]
- defines.BLOCK_COUNT = [10, 15, 20]
- defines.AFTER_BLOCK_COUNT = [5, 7, 10, 12, 15, 17, 20]
- defines.FILES_COUNT = [7, 8, 9, 10]
- if = "AFTER_BLOCK_COUNT <= BLOCK_COUNT && FILES_COUNT + 2 < BLOCK_COUNT"
- code = '''
- #ifdef LFS_SHRINKNONRELOCATING
- lfs_t lfs;
- lfs_format(&lfs, cfg) => 0;
- // create FILES_COUNT files of BLOCK_SIZE - 50 bytes (to avoid inlining)
- lfs_mount(&lfs, cfg) => 0;
- for (int i = 0; i < FILES_COUNT + 1; i++) {
- lfs_file_t file;
- char path[1024];
- sprintf(path, "file_%03d", i);
- lfs_file_open(&lfs, &file, path,
- LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
- char wbuffer[BLOCK_SIZE];
- memset(wbuffer, 'b', BLOCK_SIZE);
- // Ensure one block is taken per file, but that files are not inlined.
- lfs_size_t size = BLOCK_SIZE - 0x40;
- sprintf(wbuffer, "Hi %03d", i);
- lfs_file_write(&lfs, &file, wbuffer, size) => size;
- lfs_file_close(&lfs, &file) => 0;
- }
- int err = lfs_fs_grow(&lfs, AFTER_BLOCK_COUNT);
- if (err == 0) {
- for (int i = 0; i < FILES_COUNT + 1; i++) {
- lfs_file_t file;
- char path[1024];
- sprintf(path, "file_%03d", i);
- lfs_file_open(&lfs, &file, path,
- LFS_O_RDONLY ) => 0;
- lfs_size_t size = BLOCK_SIZE - 0x40;
- char wbuffer[size];
- char wbuffer_ref[size];
- // Ensure one block is taken per file, but that files are not inlined.
- memset(wbuffer_ref, 'b', size);
- sprintf(wbuffer_ref, "Hi %03d", i);
- lfs_file_read(&lfs, &file, wbuffer, BLOCK_SIZE) => size;
- lfs_file_close(&lfs, &file) => 0;
- for (lfs_size_t j = 0; j < size; j++) {
- wbuffer[j] => wbuffer_ref[j];
- }
- }
- } else {
- assert(err == LFS_ERR_NOTEMPTY);
- }
- lfs_unmount(&lfs) => 0;
- if (err == 0 ) {
- if ( AFTER_BLOCK_COUNT != BLOCK_COUNT ) {
- lfs_mount(&lfs, cfg) => LFS_ERR_INVAL;
- }
- lfs_t lfs2 = lfs;
- struct lfs_config cfg2 = *cfg;
- cfg2.block_count = AFTER_BLOCK_COUNT;
- lfs2.cfg = &cfg2;
- lfs_mount(&lfs2, &cfg2) => 0;
- for (int i = 0; i < FILES_COUNT + 1; i++) {
- lfs_file_t file;
- char path[1024];
- sprintf(path, "file_%03d", i);
- lfs_file_open(&lfs2, &file, path,
- LFS_O_RDONLY ) => 0;
- lfs_size_t size = BLOCK_SIZE - 0x40;
- char wbuffer[size];
- char wbuffer_ref[size];
- // Ensure one block is taken per file, but that files are not inlined.
- memset(wbuffer_ref, 'b', size);
- sprintf(wbuffer_ref, "Hi %03d", i);
- lfs_file_read(&lfs2, &file, wbuffer, BLOCK_SIZE) => size;
- lfs_file_close(&lfs2, &file) => 0;
- for (lfs_size_t j = 0; j < size; j++) {
- wbuffer[j] => wbuffer_ref[j];
- }
- }
- lfs_unmount(&lfs2);
- }
- #endif
- '''
|