# 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 '''