diff --git a/tests/test_alloc.toml b/tests/test_alloc.toml index 6927c0ce..363dbde8 100644 --- a/tests/test_alloc.toml +++ b/tests/test_alloc.toml @@ -806,722 +806,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - - -## allocator tests -## note for these to work there are a number constraints on the device geometry -#if = 'BLOCK_CYCLES == -1' -# -## parallel allocation test -#[cases.test_alloc_parallel] -#defines.FILES = 3 -#defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)' -#code = ''' -# const char *names[] = {"bacon", "eggs", "pancakes"}; -# lfs_file_t files[FILES]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "breakfast") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_open(&lfs, &files[n], path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# } -# for (int n = 0; n < FILES; n++) { -# size_t size = strlen(names[n]); -# for (lfs_size_t i = 0; i < SIZE; i += size) { -# lfs_file_write(&lfs, &files[n], names[n], size) => size; -# } -# } -# for (int n = 0; n < FILES; n++) { -# lfs_file_close(&lfs, &files[n]) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# size_t size = strlen(names[n]); -# for (lfs_size_t i = 0; i < SIZE; i += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, names[n], size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -## serial allocation test -#[cases.test_alloc_serial] -#defines.FILES = 3 -#defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)' -#code = ''' -# const char *names[] = {"bacon", "eggs", "pancakes"}; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "breakfast") => 0; -# lfs_unmount(&lfs) => 0; -# -# for (int n = 0; n < FILES; n++) { -# lfs_mount(&lfs, cfg) => 0; -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# size_t size = strlen(names[n]); -# uint8_t buffer[1024]; -# memcpy(buffer, names[n], size); -# for (int i = 0; i < SIZE; i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# } -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# size_t size = strlen(names[n]); -# for (int i = 0; i < SIZE; i += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, names[n], size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -## parallel allocation reuse test -#[cases.test_alloc_parallel_reuse] -#defines.FILES = 3 -#defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)' -#defines.CYCLES = [1, 10] -#code = ''' -# const char *names[] = {"bacon", "eggs", "pancakes"}; -# lfs_file_t files[FILES]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# for (int c = 0; c < CYCLES; c++) { -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "breakfast") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_open(&lfs, &files[n], path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# } -# for (int n = 0; n < FILES; n++) { -# size_t size = strlen(names[n]); -# for (int i = 0; i < SIZE; i += size) { -# lfs_file_write(&lfs, &files[n], names[n], size) => size; -# } -# } -# for (int n = 0; n < FILES; n++) { -# lfs_file_close(&lfs, &files[n]) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# size_t size = strlen(names[n]); -# for (int i = 0; i < SIZE; i += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, names[n], size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_remove(&lfs, "breakfast") => 0; -# lfs_unmount(&lfs) => 0; -# } -#''' -# -## serial allocation reuse test -#[cases.test_alloc_serial_reuse] -#defines.FILES = 3 -#defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)' -#defines.CYCLES = [1, 10] -#code = ''' -# const char *names[] = {"bacon", "eggs", "pancakes"}; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# for (int c = 0; c < CYCLES; c++) { -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "breakfast") => 0; -# lfs_unmount(&lfs) => 0; -# -# for (int n = 0; n < FILES; n++) { -# lfs_mount(&lfs, cfg) => 0; -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# size_t size = strlen(names[n]); -# uint8_t buffer[1024]; -# memcpy(buffer, names[n], size); -# for (int i = 0; i < SIZE; i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# } -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# size_t size = strlen(names[n]); -# for (int i = 0; i < SIZE; i += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, names[n], size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int n = 0; n < FILES; n++) { -# char path[1024]; -# sprintf(path, "breakfast/%s", names[n]); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_remove(&lfs, "breakfast") => 0; -# lfs_unmount(&lfs) => 0; -# } -#''' -# -## exhaustion test -#[cases.test_alloc_exhaustion] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# size_t size = strlen("exhaustion"); -# uint8_t buffer[1024]; -# memcpy(buffer, "exhaustion", size); -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_sync(&lfs, &file) => 0; -# -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# lfs_ssize_t res; -# while (true) { -# res = lfs_file_write(&lfs, &file, buffer, size); -# if (res < 0) { -# break; -# } -# -# res => size; -# } -# res => LFS_ERR_NOSPC; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_RDONLY); -# size = strlen("exhaustion"); -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "exhaustion", size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## exhaustion wraparound test -#[cases.test_alloc_exhaustion_wraparound] -#defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-4)) / 3)' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "padding", LFS_O_WRONLY | LFS_O_CREAT); -# size_t size = strlen("buffering"); -# uint8_t buffer[1024]; -# memcpy(buffer, "buffering", size); -# for (int i = 0; i < SIZE; i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_remove(&lfs, "padding") => 0; -# -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# size = strlen("exhaustion"); -# memcpy(buffer, "exhaustion", size); -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_sync(&lfs, &file) => 0; -# -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# lfs_ssize_t res; -# while (true) { -# res = lfs_file_write(&lfs, &file, buffer, size); -# if (res < 0) { -# break; -# } -# -# res => size; -# } -# res => LFS_ERR_NOSPC; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_RDONLY); -# size = strlen("exhaustion"); -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "exhaustion", size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_remove(&lfs, "exhaustion") => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## dir exhaustion test -#[cases.test_alloc_dir_exhaustion] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // find out max file size -# lfs_mkdir(&lfs, "exhaustiondir") => 0; -# size_t size = strlen("blahblahblahblah"); -# uint8_t buffer[1024]; -# memcpy(buffer, "blahblahblahblah", size); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# int count = 0; -# int err; -# while (true) { -# err = lfs_file_write(&lfs, &file, buffer, size); -# if (err < 0) { -# break; -# } -# -# count += 1; -# } -# err => LFS_ERR_NOSPC; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_remove(&lfs, "exhaustion") => 0; -# lfs_remove(&lfs, "exhaustiondir") => 0; -# -# // see if dir fits with max file size -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# for (int i = 0; i < count; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_mkdir(&lfs, "exhaustiondir") => 0; -# lfs_remove(&lfs, "exhaustiondir") => 0; -# lfs_remove(&lfs, "exhaustion") => 0; -# -# // see if dir fits with > max file size -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# for (int i = 0; i < count+1; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_mkdir(&lfs, "exhaustiondir") => LFS_ERR_NOSPC; -# -# lfs_remove(&lfs, "exhaustion") => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## what if we have a bad block during an allocation scan? -#[cases.test_alloc_bad_blocks] -#in = "lfs.c" -#defines.ERASE_CYCLES = 0xffffffff -#defines.BADBLOCK_BEHAVIOR = 'LFS_EMUBD_BADBLOCK_READERROR' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# // first fill to exhaustion to find available space -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "pacman", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "waka"); -# size_t size = strlen("waka"); -# lfs_size_t filesize = 0; -# while (true) { -# lfs_ssize_t res = lfs_file_write(&lfs, &file, buffer, size); -# assert(res == (lfs_ssize_t)size || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# break; -# } -# filesize += size; -# } -# lfs_file_close(&lfs, &file) => 0; -# // now fill all but a couple of blocks of the filesystem with data -# filesize -= 3*BLOCK_SIZE; -# lfs_file_open(&lfs, &file, "pacman", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# strcpy((char*)buffer, "waka"); -# size = strlen("waka"); -# for (lfs_size_t i = 0; i < filesize/size; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# // also save head of file so we can error during lookahead scan -# lfs_block_t fileblock = file.ctz.head; -# lfs_unmount(&lfs) => 0; -# -# // remount to force an alloc scan -# lfs_mount(&lfs, cfg) => 0; -# -# // but mark the head of our file as a "bad block", this is force our -# // scan to bail early -# lfs_emubd_setwear(cfg, fileblock, 0xffffffff) => 0; -# lfs_file_open(&lfs, &file, "ghost", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# strcpy((char*)buffer, "chomp"); -# size = strlen("chomp"); -# while (true) { -# lfs_ssize_t res = lfs_file_write(&lfs, &file, buffer, size); -# assert(res == (lfs_ssize_t)size || res == LFS_ERR_CORRUPT); -# if (res == LFS_ERR_CORRUPT) { -# break; -# } -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // now reverse the "bad block" and try to write the file again until we -# // run out of space -# lfs_emubd_setwear(cfg, fileblock, 0) => 0; -# lfs_file_open(&lfs, &file, "ghost", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# strcpy((char*)buffer, "chomp"); -# size = strlen("chomp"); -# while (true) { -# lfs_ssize_t res = lfs_file_write(&lfs, &file, buffer, size); -# assert(res == (lfs_ssize_t)size || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# break; -# } -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -# -# // check that the disk isn't hurt -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "pacman", LFS_O_RDONLY) => 0; -# strcpy((char*)buffer, "waka"); -# size = strlen("waka"); -# for (lfs_size_t i = 0; i < filesize/size; i++) { -# uint8_t rbuffer[4]; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -# -## Below, I don't like these tests. They're fragile and depend _heavily_ -## on the geometry of the block device. But they are valuable. Eventually they -## should be removed and replaced with generalized tests. -# -## chained dir exhaustion test -#[cases.test_alloc_chained_dir_exhaustion] -#if = 'BLOCK_SIZE == 512' -#defines.BLOCK_COUNT = 1024 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // find out max file size -# lfs_mkdir(&lfs, "exhaustiondir") => 0; -# for (int i = 0; i < 10; i++) { -# char path[1024]; -# sprintf(path, "dirwithanexhaustivelylongnameforpadding%d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# size_t size = strlen("blahblahblahblah"); -# uint8_t buffer[1024]; -# memcpy(buffer, "blahblahblahblah", size); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# int count = 0; -# int err; -# while (true) { -# err = lfs_file_write(&lfs, &file, buffer, size); -# if (err < 0) { -# break; -# } -# -# count += 1; -# } -# err => LFS_ERR_NOSPC; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_remove(&lfs, "exhaustion") => 0; -# lfs_remove(&lfs, "exhaustiondir") => 0; -# for (int i = 0; i < 10; i++) { -# char path[1024]; -# sprintf(path, "dirwithanexhaustivelylongnameforpadding%d", i); -# lfs_remove(&lfs, path) => 0; -# } -# -# // see that chained dir fails -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# for (int i = 0; i < count+1; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_sync(&lfs, &file) => 0; -# -# for (int i = 0; i < 10; i++) { -# char path[1024]; -# sprintf(path, "dirwithanexhaustivelylongnameforpadding%d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# -# lfs_mkdir(&lfs, "exhaustiondir") => LFS_ERR_NOSPC; -# -# // shorten file to try a second chained dir -# while (true) { -# err = lfs_mkdir(&lfs, "exhaustiondir"); -# if (err != LFS_ERR_NOSPC) { -# break; -# } -# -# lfs_ssize_t filesize = lfs_file_size(&lfs, &file); -# filesize > 0 => true; -# -# lfs_file_truncate(&lfs, &file, filesize - size) => 0; -# lfs_file_sync(&lfs, &file) => 0; -# } -# err => 0; -# -# lfs_mkdir(&lfs, "exhaustiondir2") => LFS_ERR_NOSPC; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## split dir test -#[cases.test_alloc_split_dir] -#if = 'BLOCK_SIZE == 512' -#defines.BLOCK_COUNT = 1024 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // create one block hole for half a directory -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "bump", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# for (lfs_size_t i = 0; i < cfg->block_size; i += 2) { -# uint8_t buffer[1024]; -# memcpy(&buffer[i], "hi", 2); -# } -# uint8_t buffer[1024]; -# lfs_file_write(&lfs, &file, buffer, cfg->block_size) => cfg->block_size; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "exhaustion", LFS_O_WRONLY | LFS_O_CREAT); -# size_t size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < (cfg->block_count-4)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // remount to force reset of lookahead -# lfs_unmount(&lfs) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // open hole -# lfs_remove(&lfs, "bump") => 0; -# -# lfs_mkdir(&lfs, "splitdir") => 0; -# lfs_file_open(&lfs, &file, "splitdir/bump", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# for (lfs_size_t i = 0; i < cfg->block_size; i += 2) { -# memcpy(&buffer[i], "hi", 2); -# } -# lfs_file_write(&lfs, &file, buffer, 2*cfg->block_size) => LFS_ERR_NOSPC; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -## outdated lookahead test -#[cases.test_alloc_outdated_lookahead] -#if = 'BLOCK_SIZE == 512' -#defines.BLOCK_COUNT = 1024 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // fill completely with two files -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "exhaustion1", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# size_t size = strlen("blahblahblahblah"); -# uint8_t buffer[1024]; -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2)/2)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "exhaustion2", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2+1)/2)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // remount to force reset of lookahead -# lfs_unmount(&lfs) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // rewrite one file -# lfs_file_open(&lfs, &file, "exhaustion1", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_sync(&lfs, &file) => 0; -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2)/2)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // rewrite second file, this requires lookahead does not -# // use old population -# lfs_file_open(&lfs, &file, "exhaustion2", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_sync(&lfs, &file) => 0; -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2+1)/2)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -## outdated lookahead and split dir test -#[cases.test_alloc_outdated_lookahead_split_dir] -#if = 'BLOCK_SIZE == 512' -#defines.BLOCK_COUNT = 1024 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // fill completely with two files -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "exhaustion1", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# size_t size = strlen("blahblahblahblah"); -# uint8_t buffer[1024]; -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2)/2)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "exhaustion2", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2+1)/2)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // remount to force reset of lookahead -# lfs_unmount(&lfs) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // rewrite one file with a hole of one block -# lfs_file_open(&lfs, &file, "exhaustion1", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_sync(&lfs, &file) => 0; -# size = strlen("blahblahblahblah"); -# memcpy(buffer, "blahblahblahblah", size); -# for (lfs_size_t i = 0; -# i < ((cfg->block_count-2)/2 - 1)*(cfg->block_size-8); -# i += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // try to allocate a directory, should fail! -# lfs_mkdir(&lfs, "split") => LFS_ERR_NOSPC; -# -# // file should not fail -# lfs_file_open(&lfs, &file, "notasplit", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "hi", 2) => 2; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_attrs.toml b/tests/test_attrs.toml index c4623358..95f19c77 100644 --- a/tests/test_attrs.toml +++ b/tests/test_attrs.toml @@ -5053,329 +5053,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - - - - - - - - - - -#[cases.test_attrs_get_set] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "hello") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "hello", strlen("hello")) => strlen("hello"); -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# uint8_t buffer[1024]; -# memset(buffer, 0, sizeof(buffer)); -# lfs_setattr(&lfs, "hello", 'A', "aaaa", 4) => 0; -# lfs_setattr(&lfs, "hello", 'B', "bbbbbb", 6) => 0; -# lfs_setattr(&lfs, "hello", 'C', "ccccc", 5) => 0; -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 6) => 6; -# lfs_getattr(&lfs, "hello", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "bbbbbb", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "hello", 'B', "", 0) => 0; -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 6) => 0; -# lfs_getattr(&lfs, "hello", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_removeattr(&lfs, "hello", 'B') => 0; -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 6) => LFS_ERR_NOATTR; -# lfs_getattr(&lfs, "hello", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "hello", 'B', "dddddd", 6) => 0; -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 6) => 6; -# lfs_getattr(&lfs, "hello", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "dddddd", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "hello", 'B', "eee", 3) => 0; -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 6) => 3; -# lfs_getattr(&lfs, "hello", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "eee\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "hello", 'A', buffer, LFS_ATTR_MAX+1) => LFS_ERR_NOSPC; -# lfs_setattr(&lfs, "hello", 'B', "fffffffff", 9) => 0; -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 6) => 9; -# lfs_getattr(&lfs, "hello", 'C', buffer+10, 5) => 5; -# -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# memset(buffer, 0, sizeof(buffer)); -# lfs_getattr(&lfs, "hello", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "hello", 'B', buffer+4, 9) => 9; -# lfs_getattr(&lfs, "hello", 'C', buffer+13, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "fffffffff", 9) => 0; -# memcmp(buffer+13, "ccccc", 5) => 0; -# -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, sizeof(buffer)) => strlen("hello"); -# memcmp(buffer, "hello", strlen("hello")) => 0; -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_attrs_get_set_root] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "hello") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "hello", strlen("hello")) => strlen("hello"); -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# uint8_t buffer[1024]; -# memset(buffer, 0, sizeof(buffer)); -# lfs_setattr(&lfs, "/", 'A', "aaaa", 4) => 0; -# lfs_setattr(&lfs, "/", 'B', "bbbbbb", 6) => 0; -# lfs_setattr(&lfs, "/", 'C', "ccccc", 5) => 0; -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 6) => 6; -# lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "bbbbbb", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "/", 'B', "", 0) => 0; -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 6) => 0; -# lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_removeattr(&lfs, "/", 'B') => 0; -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 6) => LFS_ERR_NOATTR; -# lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "/", 'B', "dddddd", 6) => 0; -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 6) => 6; -# lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "dddddd", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "/", 'B', "eee", 3) => 0; -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 6) => 3; -# lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "eee\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# lfs_setattr(&lfs, "/", 'A', buffer, LFS_ATTR_MAX+1) => LFS_ERR_NOSPC; -# lfs_setattr(&lfs, "/", 'B', "fffffffff", 9) => 0; -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 6) => 9; -# lfs_getattr(&lfs, "/", 'C', buffer+10, 5) => 5; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# memset(buffer, 0, sizeof(buffer)); -# lfs_getattr(&lfs, "/", 'A', buffer, 4) => 4; -# lfs_getattr(&lfs, "/", 'B', buffer+4, 9) => 9; -# lfs_getattr(&lfs, "/", 'C', buffer+13, 5) => 5; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "fffffffff", 9) => 0; -# memcmp(buffer+13, "ccccc", 5) => 0; -# -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, sizeof(buffer)) => strlen("hello"); -# memcmp(buffer, "hello", strlen("hello")) => 0; -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_attrs_get_set_file] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "hello") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "hello", strlen("hello")) => strlen("hello"); -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# uint8_t buffer[1024]; -# memset(buffer, 0, sizeof(buffer)); -# struct lfs_attr attrs1[] = { -# {'A', buffer, 4}, -# {'B', buffer+4, 6}, -# {'C', buffer+10, 5}, -# }; -# struct lfs_file_config cfg1 = {.attrs=attrs1, .attr_count=3}; -# -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_WRONLY, &cfg1) => 0; -# memcpy(buffer, "aaaa", 4); -# memcpy(buffer+4, "bbbbbb", 6); -# memcpy(buffer+10, "ccccc", 5); -# lfs_file_close(&lfs, &file) => 0; -# memset(buffer, 0, 15); -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDONLY, &cfg1) => 0; -# lfs_file_close(&lfs, &file) => 0; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "bbbbbb", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# attrs1[1].size = 0; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_WRONLY, &cfg1) => 0; -# lfs_file_close(&lfs, &file) => 0; -# memset(buffer, 0, 15); -# attrs1[1].size = 6; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDONLY, &cfg1) => 0; -# lfs_file_close(&lfs, &file) => 0; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# attrs1[1].size = 6; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_WRONLY, &cfg1) => 0; -# memcpy(buffer+4, "dddddd", 6); -# lfs_file_close(&lfs, &file) => 0; -# memset(buffer, 0, 15); -# attrs1[1].size = 6; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDONLY, &cfg1) => 0; -# lfs_file_close(&lfs, &file) => 0; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "dddddd", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# attrs1[1].size = 3; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_WRONLY, &cfg1) => 0; -# memcpy(buffer+4, "eee", 3); -# lfs_file_close(&lfs, &file) => 0; -# memset(buffer, 0, 15); -# attrs1[1].size = 6; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDONLY, &cfg1) => 0; -# lfs_file_close(&lfs, &file) => 0; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "eee\0\0\0", 6) => 0; -# memcmp(buffer+10, "ccccc", 5) => 0; -# -# attrs1[0].size = LFS_ATTR_MAX+1; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_WRONLY, &cfg1) -# => LFS_ERR_NOSPC; -# -# struct lfs_attr attrs2[] = { -# {'A', buffer, 4}, -# {'B', buffer+4, 9}, -# {'C', buffer+13, 5}, -# }; -# struct lfs_file_config cfg2 = {.attrs=attrs2, .attr_count=3}; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDWR, &cfg2) => 0; -# memcpy(buffer+4, "fffffffff", 9); -# lfs_file_close(&lfs, &file) => 0; -# attrs1[0].size = 4; -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDONLY, &cfg1) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# memset(buffer, 0, sizeof(buffer)); -# struct lfs_attr attrs3[] = { -# {'A', buffer, 4}, -# {'B', buffer+4, 9}, -# {'C', buffer+13, 5}, -# }; -# struct lfs_file_config cfg3 = {.attrs=attrs3, .attr_count=3}; -# -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_RDONLY, &cfg3) => 0; -# lfs_file_close(&lfs, &file) => 0; -# memcmp(buffer, "aaaa", 4) => 0; -# memcmp(buffer+4, "fffffffff", 9) => 0; -# memcmp(buffer+13, "ccccc", 5) => 0; -# -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, sizeof(buffer)) => strlen("hello"); -# memcmp(buffer, "hello", strlen("hello")) => 0; -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_attrs_deferred_file] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "hello") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "hello/hello", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "hello", strlen("hello")) => strlen("hello"); -# lfs_file_close(&lfs, &file); -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_setattr(&lfs, "hello/hello", 'B', "fffffffff", 9) => 0; -# lfs_setattr(&lfs, "hello/hello", 'C', "ccccc", 5) => 0; -# -# uint8_t buffer[1024]; -# memset(buffer, 0, sizeof(buffer)); -# struct lfs_attr attrs1[] = { -# {'B', "gggg", 4}, -# {'C', "", 0}, -# {'D', "hhhh", 4}, -# }; -# struct lfs_file_config cfg1 = {.attrs=attrs1, .attr_count=3}; -# -# lfs_file_opencfg(&lfs, &file, "hello/hello", LFS_O_WRONLY, &cfg1) => 0; -# -# lfs_getattr(&lfs, "hello/hello", 'B', buffer, 9) => 9; -# lfs_getattr(&lfs, "hello/hello", 'C', buffer+9, 9) => 5; -# lfs_getattr(&lfs, "hello/hello", 'D', buffer+18, 9) => LFS_ERR_NOATTR; -# memcmp(buffer, "fffffffff", 9) => 0; -# memcmp(buffer+9, "ccccc\0\0\0\0", 9) => 0; -# memcmp(buffer+18, "\0\0\0\0\0\0\0\0\0", 9) => 0; -# -# lfs_file_sync(&lfs, &file) => 0; -# lfs_getattr(&lfs, "hello/hello", 'B', buffer, 9) => 4; -# lfs_getattr(&lfs, "hello/hello", 'C', buffer+9, 9) => 0; -# lfs_getattr(&lfs, "hello/hello", 'D', buffer+18, 9) => 4; -# memcmp(buffer, "gggg\0\0\0\0\0", 9) => 0; -# memcmp(buffer+9, "\0\0\0\0\0\0\0\0\0", 9) => 0; -# memcmp(buffer+18, "hhhh\0\0\0\0\0", 9) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_badblocks.toml b/tests/test_badblocks.toml index 01f23a08..2a2c8036 100644 --- a/tests/test_badblocks.toml +++ b/tests/test_badblocks.toml @@ -5954,288 +5954,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - - - - - - - - - - - - - - - - - - - - - - - - - -## bad blocks with block cycles should be tested in test_relocations -#if = '(int32_t)BLOCK_CYCLES == -1' -# -#[cases.test_badblocks_single] -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.ERASE_CYCLES = 0xffffffff -#defines.ERASE_VALUE = [0x00, 0xff, -1] -#defines.BADBLOCK_BEHAVIOR = [ -# 'LFS_EMUBD_BADBLOCK_PROGERROR', -# 'LFS_EMUBD_BADBLOCK_ERASEERROR', -# 'LFS_EMUBD_BADBLOCK_READERROR', -# 'LFS_EMUBD_BADBLOCK_PROGNOOP', -# 'LFS_EMUBD_BADBLOCK_ERASENOOP', -#] -#defines.NAMEMULT = 64 -#defines.FILEMULT = 1 -#code = ''' -# for (lfs_block_t badblock = 2; badblock < BLOCK_COUNT; badblock++) { -# lfs_emubd_setwear(cfg, badblock-1, 0) => 0; -# lfs_emubd_setwear(cfg, badblock, 0xffffffff) => 0; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 1; i < 10; i++) { -# uint8_t buffer[1024]; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j] = '0'+i; -# } -# buffer[NAMEMULT] = '\0'; -# lfs_mkdir(&lfs, (char*)buffer) => 0; -# -# buffer[NAMEMULT] = '/'; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j+NAMEMULT+1] = '0'+i; -# } -# buffer[2*NAMEMULT+1] = '\0'; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, (char*)buffer, -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# lfs_size_t size = NAMEMULT; -# for (int j = 0; j < i*FILEMULT; j++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 1; i < 10; i++) { -# uint8_t buffer[1024]; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j] = '0'+i; -# } -# buffer[NAMEMULT] = '\0'; -# struct lfs_info info; -# lfs_stat(&lfs, (char*)buffer, &info) => 0; -# info.type => LFS_TYPE_DIR; -# -# buffer[NAMEMULT] = '/'; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j+NAMEMULT+1] = '0'+i; -# } -# buffer[2*NAMEMULT+1] = '\0'; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0; -# -# int size = NAMEMULT; -# for (int j = 0; j < i*FILEMULT; j++) { -# uint8_t rbuffer[1024]; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(buffer, rbuffer, size) => 0; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# } -#''' -# -#[cases.test_badblocks_region_corruption] # (causes cascading failures) -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.ERASE_CYCLES = 0xffffffff -#defines.ERASE_VALUE = [0x00, 0xff, -1] -#defines.BADBLOCK_BEHAVIOR = [ -# 'LFS_EMUBD_BADBLOCK_PROGERROR', -# 'LFS_EMUBD_BADBLOCK_ERASEERROR', -# 'LFS_EMUBD_BADBLOCK_READERROR', -# 'LFS_EMUBD_BADBLOCK_PROGNOOP', -# 'LFS_EMUBD_BADBLOCK_ERASENOOP', -#] -#defines.NAMEMULT = 64 -#defines.FILEMULT = 1 -#code = ''' -# for (lfs_block_t i = 0; i < (BLOCK_COUNT-2)/2; i++) { -# lfs_emubd_setwear(cfg, i+2, 0xffffffff) => 0; -# } -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 1; i < 10; i++) { -# uint8_t buffer[1024]; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j] = '0'+i; -# } -# buffer[NAMEMULT] = '\0'; -# lfs_mkdir(&lfs, (char*)buffer) => 0; -# -# buffer[NAMEMULT] = '/'; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j+NAMEMULT+1] = '0'+i; -# } -# buffer[2*NAMEMULT+1] = '\0'; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, (char*)buffer, -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# lfs_size_t size = NAMEMULT; -# for (int j = 0; j < i*FILEMULT; j++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 1; i < 10; i++) { -# uint8_t buffer[1024]; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j] = '0'+i; -# } -# buffer[NAMEMULT] = '\0'; -# struct lfs_info info; -# lfs_stat(&lfs, (char*)buffer, &info) => 0; -# info.type => LFS_TYPE_DIR; -# -# buffer[NAMEMULT] = '/'; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j+NAMEMULT+1] = '0'+i; -# } -# buffer[2*NAMEMULT+1] = '\0'; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0; -# -# lfs_size_t size = NAMEMULT; -# for (int j = 0; j < i*FILEMULT; j++) { -# uint8_t rbuffer[1024]; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(buffer, rbuffer, size) => 0; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_badblocks_alternating_corruption] # (causes cascading failures) -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.ERASE_CYCLES = 0xffffffff -#defines.ERASE_VALUE = [0x00, 0xff, -1] -#defines.BADBLOCK_BEHAVIOR = [ -# 'LFS_EMUBD_BADBLOCK_PROGERROR', -# 'LFS_EMUBD_BADBLOCK_ERASEERROR', -# 'LFS_EMUBD_BADBLOCK_READERROR', -# 'LFS_EMUBD_BADBLOCK_PROGNOOP', -# 'LFS_EMUBD_BADBLOCK_ERASENOOP', -#] -#defines.NAMEMULT = 64 -#defines.FILEMULT = 1 -#code = ''' -# for (lfs_block_t i = 0; i < (BLOCK_COUNT-2)/2; i++) { -# lfs_emubd_setwear(cfg, (2*i) + 2, 0xffffffff) => 0; -# } -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 1; i < 10; i++) { -# uint8_t buffer[1024]; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j] = '0'+i; -# } -# buffer[NAMEMULT] = '\0'; -# lfs_mkdir(&lfs, (char*)buffer) => 0; -# -# buffer[NAMEMULT] = '/'; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j+NAMEMULT+1] = '0'+i; -# } -# buffer[2*NAMEMULT+1] = '\0'; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, (char*)buffer, -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# lfs_size_t size = NAMEMULT; -# for (int j = 0; j < i*FILEMULT; j++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 1; i < 10; i++) { -# uint8_t buffer[1024]; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j] = '0'+i; -# } -# buffer[NAMEMULT] = '\0'; -# struct lfs_info info; -# lfs_stat(&lfs, (char*)buffer, &info) => 0; -# info.type => LFS_TYPE_DIR; -# -# buffer[NAMEMULT] = '/'; -# for (int j = 0; j < NAMEMULT; j++) { -# buffer[j+NAMEMULT+1] = '0'+i; -# } -# buffer[2*NAMEMULT+1] = '\0'; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, (char*)buffer, LFS_O_RDONLY) => 0; -# -# lfs_size_t size = NAMEMULT; -# for (int j = 0; j < i*FILEMULT; j++) { -# uint8_t rbuffer[1024]; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(buffer, rbuffer, size) => 0; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -## other corner cases -#[cases.test_badblocks_superblocks] # (corrupt 1 or 0) -#defines.ERASE_CYCLES = 0xffffffff -#defines.ERASE_VALUE = [0x00, 0xff, -1] -#defines.BADBLOCK_BEHAVIOR = [ -# 'LFS_EMUBD_BADBLOCK_PROGERROR', -# 'LFS_EMUBD_BADBLOCK_ERASEERROR', -# 'LFS_EMUBD_BADBLOCK_READERROR', -# 'LFS_EMUBD_BADBLOCK_PROGNOOP', -# 'LFS_EMUBD_BADBLOCK_ERASENOOP', -#] -#code = ''' -# lfs_emubd_setwear(cfg, 0, 0xffffffff) => 0; -# lfs_emubd_setwear(cfg, 1, 0xffffffff) => 0; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => LFS_ERR_NOSPC; -# lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT; -#''' diff --git a/tests/test_bd.toml b/tests/test_bd.toml index dc961748..25910ef3 100644 --- a/tests/test_bd.toml +++ b/tests/test_bd.toml @@ -245,6 +245,3 @@ code = ''' } ''' - - - diff --git a/tests/test_dirs.toml b/tests/test_dirs.toml index 3810b527..6f661380 100644 --- a/tests/test_dirs.toml +++ b/tests/test_dirs.toml @@ -6952,937 +6952,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - - -#[cases.test_dirs_root] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_many_creation] -#defines.N = 'range(3, 100, 3)' -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "dir%03d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "dir%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_many_removal] -#defines.N = 'range(3, 100, 11)' -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "removeme%03d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "removeme%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "removeme%03d", i); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_many_rename] -#defines.N = 'range(3, 100, 11)' -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "test%03d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "test%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char oldpath[128]; -# char newpath[128]; -# sprintf(oldpath, "test%03d", i); -# sprintf(newpath, "tedd%03d", i); -# lfs_rename(&lfs, oldpath, newpath) => 0; -# } -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "tedd%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -#''' -# -#[cases.test_dirs_many_reentrant] -#defines.N = [5, 11] -#if = 'BLOCK_COUNT >= 4*N' -#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++) { -# char path[1024]; -# sprintf(path, "hi%03d", i); -# err = lfs_mkdir(&lfs, path); -# assert(err == 0 || err == LFS_ERR_EXIST); -# } -# -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hello%03d", i); -# err = lfs_remove(&lfs, path); -# assert(err == 0 || err == LFS_ERR_NOENT); -# } -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hi%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (int i = 0; i < N; i++) { -# char oldpath[128]; -# char newpath[128]; -# sprintf(oldpath, "hi%03d", i); -# sprintf(newpath, "hello%03d", i); -# // YES this can overwrite an existing newpath -# lfs_rename(&lfs, oldpath, newpath) => 0; -# } -# -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hello%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hello%03d", i); -# lfs_remove(&lfs, path) => 0; -# } -# -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_file_creation] -#defines.N = 'range(3, 100, 11)' -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "file%03d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "file%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -#''' -# -#[cases.test_dirs_file_removal] -#defines.N = 'range(3, 100, 11)' -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "removeme%03d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "removeme%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "removeme%03d", i); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_file_rename] -#defines.N = 'range(3, 100, 11)' -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "test%03d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "test%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < N; i++) { -# char oldpath[128]; -# char newpath[128]; -# sprintf(oldpath, "test%03d", i); -# sprintf(newpath, "tedd%03d", i); -# lfs_rename(&lfs, oldpath, newpath) => 0; -# } -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "tedd%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -#''' -# -#[cases.test_dirs_file_reentrant] -#defines.N = [5, 25] -#if = 'N < BLOCK_COUNT/2' -#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++) { -# char path[1024]; -# sprintf(path, "hi%03d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_close(&lfs, &file) => 0; -# } -# -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hello%03d", i); -# err = lfs_remove(&lfs, path); -# assert(err == 0 || err == LFS_ERR_NOENT); -# } -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hi%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (int i = 0; i < N; i++) { -# char oldpath[128]; -# char newpath[128]; -# sprintf(oldpath, "hi%03d", i); -# sprintf(newpath, "hello%03d", i); -# // YES this can overwrite an existing newpath -# lfs_rename(&lfs, oldpath, newpath) => 0; -# } -# -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hello%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "hello%03d", i); -# lfs_remove(&lfs, path) => 0; -# } -# -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_nested] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "potato") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "burito", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "potato/baked") => 0; -# lfs_mkdir(&lfs, "potato/sweet") => 0; -# lfs_mkdir(&lfs, "potato/fried") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "potato") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "baked") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "fried") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "sweet") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# -# // try removing? -# lfs_mount(&lfs, cfg) => 0; -# lfs_remove(&lfs, "potato") => LFS_ERR_NOTEMPTY; -# lfs_unmount(&lfs) => 0; -# -# // try renaming? -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "potato", "coldpotato") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "coldpotato", "warmpotato") => 0; -# lfs_rename(&lfs, "warmpotato", "hotpotato") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_remove(&lfs, "potato") => LFS_ERR_NOENT; -# lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOENT; -# lfs_remove(&lfs, "warmpotato") => LFS_ERR_NOENT; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_unmount(&lfs) => 0; -# -# // try cross-directory renaming -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "coldpotato") => 0; -# lfs_rename(&lfs, "hotpotato/baked", "coldpotato/baked") => 0; -# lfs_rename(&lfs, "coldpotato", "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_rename(&lfs, "hotpotato/fried", "coldpotato/fried") => 0; -# lfs_rename(&lfs, "coldpotato", "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_rename(&lfs, "hotpotato/sweet", "coldpotato/sweet") => 0; -# lfs_rename(&lfs, "coldpotato", "hotpotato") => 0; -# lfs_remove(&lfs, "coldpotato") => LFS_ERR_NOENT; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "hotpotato") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "baked") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "fried") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "sweet") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# -# // final remove -# lfs_mount(&lfs, cfg) => 0; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "hotpotato/baked") => 0; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "hotpotato/fried") => 0; -# lfs_remove(&lfs, "hotpotato") => LFS_ERR_NOTEMPTY; -# lfs_remove(&lfs, "hotpotato/sweet") => 0; -# lfs_remove(&lfs, "hotpotato") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# info.type => LFS_TYPE_DIR; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "burito") == 0); -# info.type => LFS_TYPE_REG; -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_recursive_remove] -#defines.N = [10, 100] -#if = 'N < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "prickly-pear") => 0; -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "prickly-pear/cactus%03d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "prickly-pear") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "cactus%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs); -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_remove(&lfs, "prickly-pear") => LFS_ERR_NOTEMPTY; -# -# lfs_dir_open(&lfs, &dir, "prickly-pear") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# for (int i = 0; i < N; i++) { -# char path[1024]; -# sprintf(path, "cactus%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, path) == 0); -# sprintf(path, "prickly-pear/%s", info.name); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_remove(&lfs, "prickly-pear") => 0; -# lfs_remove(&lfs, "prickly-pear") => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_remove(&lfs, "prickly-pear") => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_other_errors] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "potato") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "burito", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# -# lfs_mkdir(&lfs, "potato") => LFS_ERR_EXIST; -# lfs_mkdir(&lfs, "burito") => LFS_ERR_EXIST; -# lfs_file_open(&lfs, &file, "burito", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_EXIST; -# lfs_file_open(&lfs, &file, "potato", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_EXIST; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "tomato") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "burito") => LFS_ERR_NOTDIR; -# lfs_file_open(&lfs, &file, "tomato", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "potato", LFS_O_RDONLY) => LFS_ERR_ISDIR; -# lfs_file_open(&lfs, &file, "tomato", LFS_O_WRONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "potato", LFS_O_WRONLY) => LFS_ERR_ISDIR; -# lfs_file_open(&lfs, &file, "potato", -# LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR; -# -# lfs_mkdir(&lfs, "/") => LFS_ERR_EXIST; -# lfs_file_open(&lfs, &file, "/", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_EXIST; -# lfs_file_open(&lfs, &file, "/", LFS_O_RDONLY) => LFS_ERR_ISDIR; -# lfs_file_open(&lfs, &file, "/", LFS_O_WRONLY) => LFS_ERR_ISDIR; -# lfs_file_open(&lfs, &file, "/", -# LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR; -# -# // check that errors did not corrupt directory -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, "burito") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "potato") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_unmount(&lfs) => 0; -# -# // or on disk -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, ".") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "..") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_REG); -# assert(strcmp(info.name, "burito") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(info.type == LFS_TYPE_DIR); -# assert(strcmp(info.name, "potato") == 0); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_dirs_seek] -#defines.COUNT = [4, 128, 132] -#if = 'COUNT < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "hello") => 0; -# for (int i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "hello/kitty%03d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# for (int j = 2; j < COUNT; j++) { -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "hello") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_soff_t pos; -# for (int i = 0; i < j; i++) { -# char path[1024]; -# sprintf(path, "kitty%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# pos = lfs_dir_tell(&lfs, &dir); -# assert(pos >= 0); -# } -# -# lfs_dir_seek(&lfs, &dir, pos) => 0; -# char path[1024]; -# sprintf(path, "kitty%03d", j); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_rewind(&lfs, &dir) => 0; -# sprintf(path, "kitty%03u", 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_seek(&lfs, &dir, pos) => 0; -# sprintf(path, "kitty%03d", j); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# } -#''' -# -#[cases.test_dirs_toot_seek] -#defines.COUNT = [4, 128, 132] -#if = 'COUNT < BLOCK_COUNT/2' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# for (int i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "hi%03d", i); -# lfs_mkdir(&lfs, path) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# for (int j = 2; j < COUNT; j++) { -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_soff_t pos; -# for (int i = 0; i < j; i++) { -# char path[1024]; -# sprintf(path, "hi%03d", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# pos = lfs_dir_tell(&lfs, &dir); -# assert(pos >= 0); -# } -# -# lfs_dir_seek(&lfs, &dir, pos) => 0; -# char path[1024]; -# sprintf(path, "hi%03d", j); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_rewind(&lfs, &dir) => 0; -# sprintf(path, "hi%03u", 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_seek(&lfs, &dir, pos) => 0; -# sprintf(path, "hi%03d", j); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# } -#''' -# diff --git a/tests/test_entries.toml b/tests/test_entries.toml deleted file mode 100644 index 8febc1b9..00000000 --- a/tests/test_entries.toml +++ /dev/null @@ -1,642 +0,0 @@ -## These tests are for some specific corner cases with neighboring inline files. -## Note that these tests are intended for 512 byte inline sizes. They should -## still pass with other inline sizes but wouldn't be testing anything. -# -#defines.CACHE_SIZE = 512 -#if = 'CACHE_SIZE % PROG_SIZE == 0 && CACHE_SIZE == 512' -# -#[cases.test_entries_grow] -#code = ''' -# uint8_t wbuffer[1024]; -# uint8_t rbuffer[1024]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // write hi0 20 -# char path[1024]; -# lfs_size_t size; -# sprintf(path, "hi0"); size = 20; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi2 20 -# sprintf(path, "hi2"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi3 20 -# sprintf(path, "hi3"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi0 20 -# sprintf(path, "hi0"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi2 20 -# sprintf(path, "hi2"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 20 -# sprintf(path, "hi3"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_shrink] -#code = ''' -# uint8_t wbuffer[1024]; -# uint8_t rbuffer[1024]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // write hi0 20 -# char path[1024]; -# lfs_size_t size; -# sprintf(path, "hi0"); size = 20; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi2 20 -# sprintf(path, "hi2"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi3 20 -# sprintf(path, "hi3"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi0 20 -# sprintf(path, "hi0"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi2 20 -# sprintf(path, "hi2"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 20 -# sprintf(path, "hi3"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_spill] -#code = ''' -# uint8_t wbuffer[1024]; -# uint8_t rbuffer[1024]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // write hi0 200 -# char path[1024]; -# lfs_size_t size; -# sprintf(path, "hi0"); size = 200; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi0 200 -# sprintf(path, "hi0"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_push_spill] -#code = ''' -# uint8_t wbuffer[1024]; -# uint8_t rbuffer[1024]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // write hi0 200 -# char path[1024]; -# lfs_size_t size; -# sprintf(path, "hi0"); size = 200; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi0 200 -# sprintf(path, "hi0"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_push_spill_two] -#code = ''' -# uint8_t wbuffer[1024]; -# uint8_t rbuffer[1024]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // write hi0 200 -# char path[1024]; -# lfs_size_t size; -# sprintf(path, "hi0"); size = 200; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi4 200 -# sprintf(path, "hi4"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi1 20 -# sprintf(path, "hi1"); size = 20; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# // read hi0 200 -# sprintf(path, "hi0"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi4 200 -# sprintf(path, "hi4"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_drop] -#code = ''' -# uint8_t wbuffer[1024]; -# uint8_t rbuffer[1024]; -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // write hi0 200 -# char path[1024]; -# lfs_size_t size; -# sprintf(path, "hi0"); size = 200; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi1 200 -# sprintf(path, "hi1"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# // write hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_remove(&lfs, "hi1") => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "hi1", &info) => LFS_ERR_NOENT; -# // read hi0 200 -# sprintf(path, "hi0"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi2 200 -# sprintf(path, "hi2"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_remove(&lfs, "hi2") => 0; -# lfs_stat(&lfs, "hi2", &info) => LFS_ERR_NOENT; -# // read hi0 200 -# sprintf(path, "hi0"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# // read hi3 200 -# sprintf(path, "hi3"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_remove(&lfs, "hi3") => 0; -# lfs_stat(&lfs, "hi3", &info) => LFS_ERR_NOENT; -# // read hi0 200 -# sprintf(path, "hi0"); size = 200; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_remove(&lfs, "hi0") => 0; -# lfs_stat(&lfs, "hi0", &info) => LFS_ERR_NOENT; -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_create_too_big] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# char path[1024]; -# memset(path, 'm', 200); -# path[200] = '\0'; -# -# lfs_size_t size = 400; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# uint8_t wbuffer[1024]; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# size = 400; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# uint8_t rbuffer[1024]; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_entries_resize_too_big] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# char path[1024]; -# memset(path, 'm', 200); -# path[200] = '\0'; -# -# lfs_size_t size = 40; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# uint8_t wbuffer[1024]; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# size = 40; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# uint8_t rbuffer[1024]; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# size = 400; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# memset(wbuffer, 'c', size); -# lfs_file_write(&lfs, &file, wbuffer, size) => size; -# lfs_file_close(&lfs, &file) => 0; -# -# size = 400; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# memcmp(rbuffer, wbuffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_evil.toml b/tests/test_evil.toml deleted file mode 100644 index d7aebc32..00000000 --- a/tests/test_evil.toml +++ /dev/null @@ -1,306 +0,0 @@ -## Tests for recovering from conditions which shouldn't normally -## happen during normal operation of littlefs -# -## invalid pointer tests (outside of block_count) -# -#[cases.test_evil_invalid_tail_pointer] -#defines.TAIL_TYPE = ['LFS_TYPE_HARDTAIL', 'LFS_TYPE_SOFTTAIL'] -#defines.INVALSET = [0x3, 0x1, 0x2] -#in = "lfs.c" -#code = ''' -# // create littlefs -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# // change tail-pointer to invalid pointers -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# lfs_dir_commit(&lfs, &mdir, LFS_MKATTRS( -# {LFS_MKTAG(LFS_TYPE_HARDTAIL, 0x3ff, 8), -# (lfs_block_t[2]){ -# (INVALSET & 0x1) ? 0xcccccccc : 0, -# (INVALSET & 0x2) ? 0xcccccccc : 0}})) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that mount fails gracefully -# lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT; -#''' -# -#[cases.test_evil_invalid_dir_pointer] -#defines.INVALSET = [0x3, 0x1, 0x2] -#in = "lfs.c" -#code = ''' -# // create littlefs -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# // make a dir -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "dir_here") => 0; -# lfs_unmount(&lfs) => 0; -# -# // change the dir pointer to be invalid -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# // make sure id 1 == our directory -# uint8_t buffer[1024]; -# lfs_dir_get(&lfs, &mdir, -# LFS_MKTAG(0x700, 0x3ff, 0), -# LFS_MKTAG(LFS_TYPE_NAME, 1, strlen("dir_here")), buffer) -# => LFS_MKTAG(LFS_TYPE_DIR, 1, strlen("dir_here")); -# assert(memcmp((char*)buffer, "dir_here", strlen("dir_here")) == 0); -# // change dir pointer -# lfs_dir_commit(&lfs, &mdir, LFS_MKATTRS( -# {LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 1, 8), -# (lfs_block_t[2]){ -# (INVALSET & 0x1) ? 0xcccccccc : 0, -# (INVALSET & 0x2) ? 0xcccccccc : 0}})) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that accessing our bad dir fails, note there's a number -# // of ways to access the dir, some can fail, but some don't -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "dir_here", &info) => 0; -# assert(strcmp(info.name, "dir_here") == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "dir_here") => LFS_ERR_CORRUPT; -# lfs_stat(&lfs, "dir_here/file_here", &info) => LFS_ERR_CORRUPT; -# lfs_dir_open(&lfs, &dir, "dir_here/dir_here") => LFS_ERR_CORRUPT; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "dir_here/file_here", -# LFS_O_RDONLY) => LFS_ERR_CORRUPT; -# lfs_file_open(&lfs, &file, "dir_here/file_here", -# LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_CORRUPT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_evil_invalid_file_pointer] -#in = "lfs.c" -#defines.SIZE = [10, 1000, 100000] # faked file size -#code = ''' -# // create littlefs -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# // make a file -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "file_here", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# // change the file pointer to be invalid -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# // make sure id 1 == our file -# uint8_t buffer[1024]; -# lfs_dir_get(&lfs, &mdir, -# LFS_MKTAG(0x700, 0x3ff, 0), -# LFS_MKTAG(LFS_TYPE_NAME, 1, strlen("file_here")), buffer) -# => LFS_MKTAG(LFS_TYPE_REG, 1, strlen("file_here")); -# assert(memcmp((char*)buffer, "file_here", strlen("file_here")) == 0); -# // change file pointer -# lfs_dir_commit(&lfs, &mdir, LFS_MKATTRS( -# {LFS_MKTAG(LFS_TYPE_CTZSTRUCT, 1, sizeof(struct lfs_ctz)), -# &(struct lfs_ctz){0xcccccccc, lfs_tole32(SIZE)}})) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that accessing our bad file fails, note there's a number -# // of ways to access the dir, some can fail, but some don't -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "file_here", &info) => 0; -# assert(strcmp(info.name, "file_here") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == SIZE); -# -# lfs_file_open(&lfs, &file, "file_here", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, SIZE) => LFS_ERR_CORRUPT; -# lfs_file_close(&lfs, &file) => 0; -# -# // any allocs that traverse CTZ must unfortunately must fail -# if (SIZE > 2*BLOCK_SIZE) { -# lfs_mkdir(&lfs, "dir_here") => LFS_ERR_CORRUPT; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_evil_invalid_ctz_pointer] # invalid pointer in CTZ skip-list test -#defines.SIZE = ['2*BLOCK_SIZE', '3*BLOCK_SIZE', '4*BLOCK_SIZE'] -#in = "lfs.c" -#code = ''' -# // create littlefs -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# // make a file -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "file_here", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# for (int i = 0; i < SIZE; i++) { -# char c = 'c'; -# lfs_file_write(&lfs, &file, &c, 1) => 1; -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# // change pointer in CTZ skip-list to be invalid -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# // make sure id 1 == our file and get our CTZ structure -# uint8_t buffer[4*BLOCK_SIZE]; -# lfs_dir_get(&lfs, &mdir, -# LFS_MKTAG(0x700, 0x3ff, 0), -# LFS_MKTAG(LFS_TYPE_NAME, 1, strlen("file_here")), buffer) -# => LFS_MKTAG(LFS_TYPE_REG, 1, strlen("file_here")); -# assert(memcmp((char*)buffer, "file_here", strlen("file_here")) == 0); -# struct lfs_ctz ctz; -# lfs_dir_get(&lfs, &mdir, -# LFS_MKTAG(0x700, 0x3ff, 0), -# LFS_MKTAG(LFS_TYPE_STRUCT, 1, sizeof(struct lfs_ctz)), &ctz) -# => LFS_MKTAG(LFS_TYPE_CTZSTRUCT, 1, sizeof(struct lfs_ctz)); -# lfs_ctz_fromle32(&ctz); -# // rewrite block to contain bad pointer -# uint8_t bbuffer[BLOCK_SIZE]; -# cfg->read(cfg, ctz.head, 0, bbuffer, BLOCK_SIZE) => 0; -# uint32_t bad = lfs_tole32(0xcccccccc); -# memcpy(&bbuffer[0], &bad, sizeof(bad)); -# memcpy(&bbuffer[4], &bad, sizeof(bad)); -# cfg->erase(cfg, ctz.head) => 0; -# cfg->prog(cfg, ctz.head, 0, bbuffer, BLOCK_SIZE) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that accessing our bad file fails, note there's a number -# // of ways to access the dir, some can fail, but some don't -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "file_here", &info) => 0; -# assert(strcmp(info.name, "file_here") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == SIZE); -# -# lfs_file_open(&lfs, &file, "file_here", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, SIZE) => LFS_ERR_CORRUPT; -# lfs_file_close(&lfs, &file) => 0; -# -# // any allocs that traverse CTZ must unfortunately must fail -# if (SIZE > 2*BLOCK_SIZE) { -# lfs_mkdir(&lfs, "dir_here") => LFS_ERR_CORRUPT; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -# -#[cases.test_evil_invalid_gstate_pointer] -#defines.INVALSET = [0x3, 0x1, 0x2] -#in = "lfs.c" -#code = ''' -# // create littlefs -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# // create an invalid gstate -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# lfs_fs_prepmove(&lfs, 1, (lfs_block_t [2]){ -# (INVALSET & 0x1) ? 0xcccccccc : 0, -# (INVALSET & 0x2) ? 0xcccccccc : 0}); -# lfs_dir_commit(&lfs, &mdir, NULL, 0) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that mount fails gracefully -# // mount may not fail, but our first alloc should fail when -# // we try to fix the gstate -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "should_fail") => LFS_ERR_CORRUPT; -# lfs_unmount(&lfs) => 0; -#''' -# -## cycle detection/recovery tests -# -#[cases.test_evil_mdir_loop] # metadata-pair threaded-list loop test -#in = "lfs.c" -#code = ''' -# // create littlefs -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# // change tail-pointer to point to ourself -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# lfs_dir_commit(&lfs, &mdir, LFS_MKATTRS( -# {LFS_MKTAG(LFS_TYPE_HARDTAIL, 0x3ff, 8), -# (lfs_block_t[2]){0, 1}})) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that mount fails gracefully -# lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT; -#''' -# -#[cases.test_evil_mdir_loop2] # metadata-pair threaded-list 2-length loop test -#in = "lfs.c" -#code = ''' -# // create littlefs with child dir -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "child") => 0; -# lfs_unmount(&lfs) => 0; -# -# // find child -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_block_t pair[2]; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# lfs_dir_get(&lfs, &mdir, -# LFS_MKTAG(0x7ff, 0x3ff, 0), -# LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 1, sizeof(pair)), pair) -# => LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 1, sizeof(pair)); -# lfs_pair_fromle32(pair); -# // change tail-pointer to point to root -# lfs_dir_fetch(&lfs, &mdir, pair) => 0; -# lfs_dir_commit(&lfs, &mdir, LFS_MKATTRS( -# {LFS_MKTAG(LFS_TYPE_HARDTAIL, 0x3ff, 8), -# (lfs_block_t[2]){0, 1}})) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that mount fails gracefully -# lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT; -#''' -# -#[cases.test_evil_mdir_loop_child] # metadata-pair threaded-list 1-length child loop test -#in = "lfs.c" -#code = ''' -# // create littlefs with child dir -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "child") => 0; -# lfs_unmount(&lfs) => 0; -# -# // find child -# lfs_init(&lfs, cfg) => 0; -# lfs_mdir_t mdir; -# lfs_block_t pair[2]; -# lfs_dir_fetch(&lfs, &mdir, (lfs_block_t[2]){0, 1}) => 0; -# lfs_dir_get(&lfs, &mdir, -# LFS_MKTAG(0x7ff, 0x3ff, 0), -# LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 1, sizeof(pair)), pair) -# => LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 1, sizeof(pair)); -# lfs_pair_fromle32(pair); -# // change tail-pointer to point to ourself -# lfs_dir_fetch(&lfs, &mdir, pair) => 0; -# lfs_dir_commit(&lfs, &mdir, LFS_MKATTRS( -# {LFS_MKTAG(LFS_TYPE_HARDTAIL, 0x3ff, 8), pair})) => 0; -# lfs_deinit(&lfs) => 0; -# -# // test that mount fails gracefully -# lfs_mount(&lfs, cfg) => LFS_ERR_CORRUPT; -#''' diff --git a/tests/test_exhaustion.toml b/tests/test_exhaustion.toml index f0354d09..ff8fb2c9 100644 --- a/tests/test_exhaustion.toml +++ b/tests/test_exhaustion.toml @@ -1804,511 +1804,3 @@ code = ''' assert(run_ops[1]*110/100 > 2*run_ops[0]); ''' - - - -## test running a filesystem to exhaustion -#[cases.test_exhaustion_normal] -#defines.ERASE_CYCLES = 10 -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.BLOCK_CYCLES = 'ERASE_CYCLES / 2' -#defines.BADBLOCK_BEHAVIOR = [ -# 'LFS_EMUBD_BADBLOCK_PROGERROR', -# 'LFS_EMUBD_BADBLOCK_ERASEERROR', -# 'LFS_EMUBD_BADBLOCK_READERROR', -# 'LFS_EMUBD_BADBLOCK_PROGNOOP', -# 'LFS_EMUBD_BADBLOCK_ERASENOOP', -#] -#defines.FILES = 10 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "roadrunner") => 0; -# lfs_unmount(&lfs) => 0; -# -# uint32_t cycle = 0; -# while (true) { -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // chose name, roughly random seed, and random 2^n size -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# lfs_ssize_t res = lfs_file_write(&lfs, &file, &c, 1); -# assert(res == 1 || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# if (err == LFS_ERR_NOSPC) { -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# char r; -# lfs_file_read(&lfs, &file, &r, 1) => 1; -# assert(r == c); -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# cycle += 1; -# } -# -#exhausted: -# // should still be readable -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# struct lfs_info info; -# lfs_stat(&lfs, path, &info) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# LFS_WARN("completed %d cycles", cycle); -#''' -# -## test running a filesystem to exhaustion -## which also requires expanding superblocks -#[cases.test_exhaustion_superblocks] -#defines.ERASE_CYCLES = 10 -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.BLOCK_CYCLES = 'ERASE_CYCLES / 2' -#defines.BADBLOCK_BEHAVIOR = [ -# 'LFS_EMUBD_BADBLOCK_PROGERROR', -# 'LFS_EMUBD_BADBLOCK_ERASEERROR', -# 'LFS_EMUBD_BADBLOCK_READERROR', -# 'LFS_EMUBD_BADBLOCK_PROGNOOP', -# 'LFS_EMUBD_BADBLOCK_ERASENOOP', -#] -#defines.FILES = 10 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# uint32_t cycle = 0; -# while (true) { -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // chose name, roughly random seed, and random 2^n size -# char path[1024]; -# sprintf(path, "test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# lfs_ssize_t res = lfs_file_write(&lfs, &file, &c, 1); -# assert(res == 1 || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# if (err == LFS_ERR_NOSPC) { -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# sprintf(path, "test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# char r; -# lfs_file_read(&lfs, &file, &r, 1) => 1; -# assert(r == c); -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# cycle += 1; -# } -# -#exhausted: -# // should still be readable -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# struct lfs_info info; -# sprintf(path, "test%d", i); -# lfs_stat(&lfs, path, &info) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# LFS_WARN("completed %d cycles", cycle); -#''' -# -## These are a sort of high-level litmus test for wear-leveling. One definition -## of wear-leveling is that increasing a block device's space translates directly -## into increasing the block devices lifetime. This is something we can actually -## check for. -# -## wear-level test running a filesystem to exhaustion -#[cases.test_exhuastion_wear_leveling] -#defines.ERASE_CYCLES = 20 -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.BLOCK_CYCLES = 'ERASE_CYCLES / 2' -#defines.FILES = 10 -#code = ''' -# uint32_t run_cycles[2]; -# const uint32_t run_block_count[2] = {BLOCK_COUNT/2, BLOCK_COUNT}; -# -# for (int run = 0; run < 2; run++) { -# for (lfs_block_t b = 0; b < BLOCK_COUNT; b++) { -# lfs_emubd_setwear(cfg, b, -# (b < run_block_count[run]) ? 0 : ERASE_CYCLES) => 0; -# } -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "roadrunner") => 0; -# lfs_unmount(&lfs) => 0; -# -# uint32_t cycle = 0; -# while (true) { -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // chose name, roughly random seed, and random 2^n size -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# lfs_ssize_t res = lfs_file_write(&lfs, &file, &c, 1); -# assert(res == 1 || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# if (err == LFS_ERR_NOSPC) { -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# char r; -# lfs_file_read(&lfs, &file, &r, 1) => 1; -# assert(r == c); -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# cycle += 1; -# } -# -#exhausted: -# // should still be readable -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# struct lfs_info info; -# sprintf(path, "roadrunner/test%d", i); -# lfs_stat(&lfs, path, &info) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# run_cycles[run] = cycle; -# LFS_WARN("completed %d blocks %d cycles", -# run_block_count[run], run_cycles[run]); -# } -# -# // check we increased the lifetime by 2x with ~10% error -# LFS_ASSERT(run_cycles[1]*110/100 > 2*run_cycles[0]); -#''' -# -## wear-level test + expanding superblock -#[cases.test_exhaustion_wear_leveling_superblocks] -#defines.ERASE_CYCLES = 20 -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.BLOCK_CYCLES = 'ERASE_CYCLES / 2' -#defines.FILES = 10 -#code = ''' -# uint32_t run_cycles[2]; -# const uint32_t run_block_count[2] = {BLOCK_COUNT/2, BLOCK_COUNT}; -# -# for (int run = 0; run < 2; run++) { -# for (lfs_block_t b = 0; b < BLOCK_COUNT; b++) { -# lfs_emubd_setwear(cfg, b, -# (b < run_block_count[run]) ? 0 : ERASE_CYCLES) => 0; -# } -# -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# uint32_t cycle = 0; -# while (true) { -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // chose name, roughly random seed, and random 2^n size -# char path[1024]; -# sprintf(path, "test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# lfs_ssize_t res = lfs_file_write(&lfs, &file, &c, 1); -# assert(res == 1 || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# if (err == LFS_ERR_NOSPC) { -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# sprintf(path, "test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << ((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# char r; -# lfs_file_read(&lfs, &file, &r, 1) => 1; -# assert(r == c); -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# cycle += 1; -# } -# -#exhausted: -# // should still be readable -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# struct lfs_info info; -# sprintf(path, "test%d", i); -# lfs_stat(&lfs, path, &info) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# run_cycles[run] = cycle; -# LFS_WARN("completed %d blocks %d cycles", -# run_block_count[run], run_cycles[run]); -# } -# -# // check we increased the lifetime by 2x with ~10% error -# LFS_ASSERT(run_cycles[1]*110/100 > 2*run_cycles[0]); -#''' -# -## test that we wear blocks roughly evenly -#[cases.test_exhaustion_wear_distribution] -#defines.ERASE_CYCLES = 0xffffffff -#defines.BLOCK_COUNT = 256 # small bd so test runs faster -#defines.BLOCK_CYCLES = [5, 4, 3, 2, 1] -#defines.CYCLES = 100 -#defines.FILES = 10 -#if = 'BLOCK_CYCLES < CYCLES/10' -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "roadrunner") => 0; -# lfs_unmount(&lfs) => 0; -# -# uint32_t cycle = 0; -# while (cycle < CYCLES) { -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // chose name, roughly random seed, and random 2^n size -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << 4; //((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# lfs_ssize_t res = lfs_file_write(&lfs, &file, &c, 1); -# assert(res == 1 || res == LFS_ERR_NOSPC); -# if (res == LFS_ERR_NOSPC) { -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# int err = lfs_file_close(&lfs, &file); -# assert(err == 0 || err == LFS_ERR_NOSPC); -# if (err == LFS_ERR_NOSPC) { -# lfs_unmount(&lfs) => 0; -# goto exhausted; -# } -# } -# -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# sprintf(path, "roadrunner/test%d", i); -# uint32_t prng = cycle * i; -# lfs_size_t size = 1 << 4; //((TEST_PRNG(&prng) % 10)+2); -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# for (lfs_size_t j = 0; j < size; j++) { -# char c = 'a' + (TEST_PRNG(&prng) % 26); -# char r; -# lfs_file_read(&lfs, &file, &r, 1) => 1; -# assert(r == c); -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# cycle += 1; -# } -# -#exhausted: -# // should still be readable -# lfs_mount(&lfs, cfg) => 0; -# for (uint32_t i = 0; i < FILES; i++) { -# // check for errors -# char path[1024]; -# struct lfs_info info; -# sprintf(path, "roadrunner/test%d", i); -# lfs_stat(&lfs, path, &info) => 0; -# } -# lfs_unmount(&lfs) => 0; -# -# LFS_WARN("completed %d cycles", cycle); -# -# // check the wear on our block device -# lfs_emubd_wear_t minwear = -1; -# lfs_emubd_wear_t totalwear = 0; -# lfs_emubd_wear_t maxwear = 0; -# // skip 0 and 1 as superblock movement is intentionally avoided -# for (lfs_block_t b = 2; b < BLOCK_COUNT; b++) { -# lfs_emubd_wear_t wear = lfs_emubd_wear(cfg, b); -# printf("%08x: wear %d\n", b, wear); -# assert(wear >= 0); -# if (wear < minwear) { -# minwear = wear; -# } -# if (wear > maxwear) { -# maxwear = wear; -# } -# totalwear += wear; -# } -# lfs_emubd_wear_t avgwear = totalwear / BLOCK_COUNT; -# LFS_WARN("max wear: %d cycles", maxwear); -# LFS_WARN("avg wear: %d cycles", totalwear / (int)BLOCK_COUNT); -# LFS_WARN("min wear: %d cycles", minwear); -# -# // find standard deviation^2 -# lfs_emubd_wear_t dev2 = 0; -# for (lfs_block_t b = 2; b < BLOCK_COUNT; b++) { -# lfs_emubd_wear_t wear = lfs_emubd_wear(cfg, b); -# assert(wear >= 0); -# lfs_emubd_swear_t diff = wear - avgwear; -# dev2 += diff*diff; -# } -# dev2 /= totalwear; -# LFS_WARN("std dev^2: %d", dev2); -# assert(dev2 < 8); -#''' -# diff --git a/tests/test_files.toml b/tests/test_files.toml index b6a8d8b7..d079fc75 100644 --- a/tests/test_files.toml +++ b/tests/test_files.toml @@ -3310,17 +3310,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - -# TODO -# [cases.test_files_multi_readers] -# [cases.test_files_multi_readers_one_writer] -# [cases.test_files_multi_writers] -# [cases.test_files_multi_readers_multi_writers] - -# [cases.test_files_interleaved] -# [cases.test_files_interleaved_fuzz] -# [cases.test_files_interleaved_fuzz_fuzz] -# [cases.test_files_dtree_fuzz] -# [cases.test_files_dtree_fuzz_fuzz] - - diff --git a/tests/test_interspersed.toml b/tests/test_interspersed.toml deleted file mode 100644 index d30d1738..00000000 --- a/tests/test_interspersed.toml +++ /dev/null @@ -1,270 +0,0 @@ -# -#[cases.test_interspersed_files] -#defines.SIZE = [10, 100] -#defines.FILES = [4, 10, 26] -#code = ''' -# lfs_t lfs; -# lfs_file_t files[FILES]; -# const char alphas[] = "abcdefghijklmnopqrstuvwxyz"; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_file_open(&lfs, &files[j], path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# } -# -# for (int i = 0; i < SIZE; i++) { -# for (int j = 0; j < FILES; j++) { -# lfs_file_write(&lfs, &files[j], &alphas[j], 1) => 1; -# } -# } -# -# for (int j = 0; j < FILES; j++) { -# lfs_file_close(&lfs, &files[j]); -# } -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == SIZE); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_file_open(&lfs, &files[j], path, LFS_O_RDONLY) => 0; -# } -# -# for (int i = 0; i < 10; i++) { -# for (int j = 0; j < FILES; j++) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &files[j], buffer, 1) => 1; -# assert(buffer[0] == alphas[j]); -# } -# } -# -# for (int j = 0; j < FILES; j++) { -# lfs_file_close(&lfs, &files[j]); -# } -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_interspersed_remove_files] -#defines.SIZE = [10, 100] -#defines.FILES = [4, 10, 26] -#code = ''' -# lfs_t lfs; -# const char alphas[] = "abcdefghijklmnopqrstuvwxyz"; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; -# for (int i = 0; i < SIZE; i++) { -# lfs_file_write(&lfs, &file, &alphas[j], 1) => 1; -# } -# lfs_file_close(&lfs, &file); -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "zzz", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# for (int j = 0; j < FILES; j++) { -# lfs_file_write(&lfs, &file, (const void*)"~", 1) => 1; -# lfs_file_sync(&lfs, &file) => 0; -# -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_file_close(&lfs, &file); -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "zzz") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == FILES); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "zzz", LFS_O_RDONLY) => 0; -# for (int i = 0; i < FILES; i++) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 1) => 1; -# assert(buffer[0] == '~'); -# } -# lfs_file_close(&lfs, &file); -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_interspersed_remove_inconveniently] -#defines.SIZE = [10, 100] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t files[3]; -# lfs_file_open(&lfs, &files[0], "e", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_open(&lfs, &files[1], "f", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_open(&lfs, &files[2], "g", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# for (int i = 0; i < SIZE/2; i++) { -# lfs_file_write(&lfs, &files[0], (const void*)"e", 1) => 1; -# lfs_file_write(&lfs, &files[1], (const void*)"f", 1) => 1; -# lfs_file_write(&lfs, &files[2], (const void*)"g", 1) => 1; -# } -# -# lfs_remove(&lfs, "f") => 0; -# -# for (int i = 0; i < SIZE/2; i++) { -# lfs_file_write(&lfs, &files[0], (const void*)"e", 1) => 1; -# lfs_file_write(&lfs, &files[1], (const void*)"f", 1) => 1; -# lfs_file_write(&lfs, &files[2], (const void*)"g", 1) => 1; -# } -# -# lfs_file_close(&lfs, &files[0]); -# lfs_file_close(&lfs, &files[1]); -# lfs_file_close(&lfs, &files[2]); -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "e") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == SIZE); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "g") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == SIZE); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &files[0], "e", LFS_O_RDONLY) => 0; -# lfs_file_open(&lfs, &files[1], "g", LFS_O_RDONLY) => 0; -# for (int i = 0; i < SIZE; i++) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &files[0], buffer, 1) => 1; -# assert(buffer[0] == 'e'); -# lfs_file_read(&lfs, &files[1], buffer, 1) => 1; -# assert(buffer[0] == 'g'); -# } -# lfs_file_close(&lfs, &files[0]); -# lfs_file_close(&lfs, &files[1]); -# -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_interspersed_reentrant_files] -#defines.SIZE = [10, 100] -#defines.FILES = [4, 10, 26] -#reentrant = true -#code = ''' -# lfs_t lfs; -# lfs_file_t files[FILES]; -# const char alphas[] = "abcdefghijklmnopqrstuvwxyz"; -# -# int err = lfs_mount(&lfs, cfg); -# if (err) { -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# } -# -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_file_open(&lfs, &files[j], path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# } -# -# for (int i = 0; i < SIZE; i++) { -# for (int j = 0; j < FILES; j++) { -# lfs_ssize_t size = lfs_file_size(&lfs, &files[j]); -# assert(size >= 0); -# if ((int)size <= i) { -# lfs_file_write(&lfs, &files[j], &alphas[j], 1) => 1; -# lfs_file_sync(&lfs, &files[j]) => 0; -# } -# } -# } -# -# for (int j = 0; j < FILES; j++) { -# lfs_file_close(&lfs, &files[j]); -# } -# -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# struct lfs_info info; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, path) == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == SIZE); -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (int j = 0; j < FILES; j++) { -# char path[1024]; -# sprintf(path, "%c", alphas[j]); -# lfs_file_open(&lfs, &files[j], path, LFS_O_RDONLY) => 0; -# } -# -# for (int i = 0; i < 10; i++) { -# for (int j = 0; j < FILES; j++) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &files[j], buffer, 1) => 1; -# assert(buffer[0] == alphas[j]); -# } -# } -# -# for (int j = 0; j < FILES; j++) { -# lfs_file_close(&lfs, &files[j]); -# } -# -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_move.toml b/tests/test_move.toml deleted file mode 100644 index ea913b90..00000000 --- a/tests/test_move.toml +++ /dev/null @@ -1,1897 +0,0 @@ -#[cases.test_move_file] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hola\n", 5) => 5; -# lfs_file_write(&lfs, &file, "bonjour\n", 8) => 8; -# lfs_file_write(&lfs, &file, "ohayo\n", 6) => 6; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hello", "c/hello") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_nop] # yes this is legal -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "hi") => 0; -# lfs_rename(&lfs, "hi", "hi") => 0; -# lfs_mkdir(&lfs, "hi/hi") => 0; -# lfs_rename(&lfs, "hi/hi", "hi/hi") => 0; -# lfs_mkdir(&lfs, "hi/hi/hi") => 0; -# lfs_rename(&lfs, "hi/hi/hi", "hi/hi/hi") => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "hi/hi/hi", &info) => 0; -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_file_corrupt_source] -#in = "lfs.c" -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hola\n", 5) => 5; -# lfs_file_write(&lfs, &file, "bonjour\n", 8) => 8; -# lfs_file_write(&lfs, &file, "ohayo\n", 6) => 6; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hello", "c/hello") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the source -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -## move file corrupt source and dest -#[cases.test_move_file_corrupt_source_dest] -#in = "lfs.c" -#if = 'PROG_SIZE <= 0x3fe' # only works with one crc per commit -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hola\n", 5) => 5; -# lfs_file_write(&lfs, &file, "bonjour\n", 8) => 8; -# lfs_file_write(&lfs, &file, "ohayo\n", 6) => 6; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hello", "c/hello") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the source -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# // corrupt the destination -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_file_after_corrupt] -#in = "lfs.c" -#if = 'PROG_SIZE <= 0x3fe' # only works with one crc per commit -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hola\n", 5) => 5; -# lfs_file_write(&lfs, &file, "bonjour\n", 8) => 8; -# lfs_file_write(&lfs, &file, "ohayo\n", 6) => 6; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hello", "c/hello") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the source -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# // corrupt the destination -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# // continue move -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hello", "c/hello") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_reentrant_file] -#reentrant = true -#code = ''' -# lfs_t lfs; -# int err = lfs_mount(&lfs, cfg); -# if (err) { -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# } -# err = lfs_mkdir(&lfs, "a"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "b"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "c"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "d"); -# assert(!err || err == LFS_ERR_EXIST); -# lfs_unmount(&lfs) => 0; -# -# while (true) { -# lfs_mount(&lfs, cfg) => 0; -# // there should never exist _2_ hello files -# int count = 0; -# struct lfs_info info; -# if (lfs_stat(&lfs, "a/hello", &info) == 0) { -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6 || info.size == 0); -# count += 1; -# } -# if (lfs_stat(&lfs, "b/hello", &info) == 0) { -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# count += 1; -# } -# if (lfs_stat(&lfs, "c/hello", &info) == 0) { -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# count += 1; -# } -# if (lfs_stat(&lfs, "d/hello", &info) == 0) { -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# count += 1; -# } -# assert(count <= 1); -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# if (lfs_stat(&lfs, "a/hello", &info) == 0 && info.size > 0) { -# lfs_rename(&lfs, "a/hello", "b/hello") => 0; -# } else if (lfs_stat(&lfs, "b/hello", &info) == 0) { -# lfs_rename(&lfs, "b/hello", "c/hello") => 0; -# } else if (lfs_stat(&lfs, "c/hello", &info) == 0) { -# lfs_rename(&lfs, "c/hello", "d/hello") => 0; -# } else if (lfs_stat(&lfs, "d/hello", &info) == 0) { -# // success -# lfs_unmount(&lfs) => 0; -# break; -# } else { -# // create file -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "hola\n", 5) => 5; -# lfs_file_write(&lfs, &file, "bonjour\n", 8) => 8; -# lfs_file_write(&lfs, &file, "ohayo\n", 6) => 6; -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_unmount(&lfs) => 0; -# } -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "d") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hello") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 5+8+6); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_dir] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_mkdir(&lfs, "a/hi") => 0; -# lfs_mkdir(&lfs, "a/hi/hola") => 0; -# lfs_mkdir(&lfs, "a/hi/bonjour") => 0; -# lfs_mkdir(&lfs, "a/hi/ohayo") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hi", "c/hi") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "a/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "b/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "c/hi") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "bonjour") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hola") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "ohayo") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "d/hi") => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_dir_corrupt_source] -#in = "lfs.c" -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_mkdir(&lfs, "a/hi") => 0; -# lfs_mkdir(&lfs, "a/hi/hola") => 0; -# lfs_mkdir(&lfs, "a/hi/bonjour") => 0; -# lfs_mkdir(&lfs, "a/hi/ohayo") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hi", "c/hi") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the source -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "a/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "b/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "c/hi") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "bonjour") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hola") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "ohayo") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "d/hi") => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_dir_corrupt_source_dest] -#in = "lfs.c" -#if = 'PROG_SIZE <= 0x3fe' # only works with one crc per commit -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_mkdir(&lfs, "a/hi") => 0; -# lfs_mkdir(&lfs, "a/hi/hola") => 0; -# lfs_mkdir(&lfs, "a/hi/bonjour") => 0; -# lfs_mkdir(&lfs, "a/hi/ohayo") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hi", "c/hi") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the source -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# // corrupt the destination -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "a/hi") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "bonjour") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hola") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "ohayo") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "b/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "c/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "d/hi") => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_dir_after_corrupt] -#in = "lfs.c" -#if = 'PROG_SIZE <= 0x3fe' # only works with one crc per commit -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_mkdir(&lfs, "a/hi") => 0; -# lfs_mkdir(&lfs, "a/hi/hola") => 0; -# lfs_mkdir(&lfs, "a/hi/bonjour") => 0; -# lfs_mkdir(&lfs, "a/hi/ohayo") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hi", "c/hi") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the source -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# // corrupt the destination -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# // continue move -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hi", "c/hi") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "c") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "a/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "b/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "c/hi") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "bonjour") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hola") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "ohayo") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "d/hi") => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_reentrant_dir] -#reentrant = true -#code = ''' -# lfs_t lfs; -# int err = lfs_mount(&lfs, cfg); -# if (err) { -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# } -# err = lfs_mkdir(&lfs, "a"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "b"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "c"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "d"); -# assert(!err || err == LFS_ERR_EXIST); -# lfs_unmount(&lfs) => 0; -# -# while (true) { -# lfs_mount(&lfs, cfg) => 0; -# // there should never exist _2_ hi directories -# int count = 0; -# struct lfs_info info; -# if (lfs_stat(&lfs, "a/hi", &info) == 0) { -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# count += 1; -# } -# if (lfs_stat(&lfs, "b/hi", &info) == 0) { -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# count += 1; -# } -# if (lfs_stat(&lfs, "c/hi", &info) == 0) { -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# count += 1; -# } -# if (lfs_stat(&lfs, "d/hi", &info) == 0) { -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# count += 1; -# } -# assert(count <= 1); -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# if (lfs_stat(&lfs, "a/hi", &info) == 0) { -# lfs_rename(&lfs, "a/hi", "b/hi") => 0; -# } else if (lfs_stat(&lfs, "b/hi", &info) == 0) { -# lfs_rename(&lfs, "b/hi", "c/hi") => 0; -# } else if (lfs_stat(&lfs, "c/hi", &info) == 0) { -# lfs_rename(&lfs, "c/hi", "d/hi") => 0; -# } else if (lfs_stat(&lfs, "d/hi", &info) == 0) { -# lfs_unmount(&lfs) => 0; -# break; // success -# } else { -# // create dir and rename for atomicity -# err = lfs_mkdir(&lfs, "temp"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "temp/hola"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "temp/bonjour"); -# assert(!err || err == LFS_ERR_EXIST); -# err = lfs_mkdir(&lfs, "temp/ohayo"); -# assert(!err || err == LFS_ERR_EXIST); -# lfs_rename(&lfs, "temp", "a/hi") => 0; -# } -# lfs_unmount(&lfs) => 0; -# } -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "a") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_dir_open(&lfs, &dir, "d") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hi") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "a/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "b/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "c/hi") => LFS_ERR_NOENT; -# lfs_dir_open(&lfs, &dir, "d/hi") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "bonjour") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "hola") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "ohayo") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_move_state_stealing] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "a") => 0; -# lfs_mkdir(&lfs, "b") => 0; -# lfs_mkdir(&lfs, "c") => 0; -# lfs_mkdir(&lfs, "d") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hola\n", 5) => 5; -# lfs_file_write(&lfs, &file, "bonjour\n", 8) => 8; -# lfs_file_write(&lfs, &file, "ohayo\n", 6) => 6; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "a/hello", "b/hello") => 0; -# lfs_unmount(&lfs) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "b/hello", "c/hello") => 0; -# lfs_unmount(&lfs) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_rename(&lfs, "c/hello", "d/hello") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_remove(&lfs, "b") => 0; -# lfs_remove(&lfs, "c") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "a", &info) => 0; -# lfs_stat(&lfs, "b", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "c", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "d", &info) => 0; -# lfs_file_open(&lfs, &file, "a/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "b/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "c/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 5) => 5; -# memcmp(buffer, "hola\n", 5) => 0; -# lfs_file_read(&lfs, &file, buffer, 8) => 8; -# memcmp(buffer, "bonjour\n", 8) => 0; -# lfs_file_read(&lfs, &file, buffer, 6) => 6; -# memcmp(buffer, "ohayo\n", 6) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## Other specific corner cases -# -## create + delete in same commit with neighbors -#[cases.test_move_create_delete_same] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // littlefs keeps files sorted, so we know the order these will be in -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.1", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/2.in_between", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.2", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/4.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.3", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_t files[3]; -# lfs_file_open(&lfs, &files[0], "0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "2.in_between", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "4.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.4", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.5", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.6", 7) => 7; -# -# // rename file while everything is open, this triggers both -# // a create and delete simultaneously -# lfs_rename(&lfs, "/1.move_me", "/3.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# -# // check that nothing was corrupted -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.in_between") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "3.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "4.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/0.before", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.4") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/2.in_between", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.5") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/4.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.6") == 0); -# lfs_file_close(&lfs, &file) => 0; -# -# // now move back -# lfs_file_open(&lfs, &files[0], "0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "2.in_between", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "4.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.7", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.8", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.9", 7) => 7; -# -# // rename file while everything is open, this triggers both -# // a create and delete simultaneously -# lfs_rename(&lfs, "/3.move_me", "/1.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# -# // and check that nothing was corrupted again -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "1.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.in_between") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "4.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.7") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/2.in_between", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.8") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/4.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.9") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## create + delete + delete in same commit with neighbors -#[cases.test_move_create_delete_delete_same] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // littlefs keeps files sorted, so we know the order these will be in -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/3.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "remove me", -# sizeof("remove me")) => sizeof("remove me"); -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.1", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/2.in_between", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.2", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/4.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.3", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_t files[3]; -# lfs_file_open(&lfs, &files[0], "0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "2.in_between", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "4.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.4", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.5", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.6", 7) => 7; -# -# // rename file while everything is open, this triggers both -# // a create and delete simultaneously -# lfs_rename(&lfs, "/1.move_me", "/3.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# -# // check that nothing was corrupted -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.in_between") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "3.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "4.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/0.before", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.4") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/2.in_between", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.5") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/4.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.6") == 0); -# lfs_file_close(&lfs, &file) => 0; -# -# // now move back -# lfs_file_open(&lfs, &file, "/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "remove me", -# sizeof("remove me")) => sizeof("remove me"); -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &files[0], "0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "2.in_between", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "4.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.7", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.8", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.9", 7) => 7; -# -# // rename file while everything is open, this triggers both -# // a create and delete simultaneously -# lfs_rename(&lfs, "/3.move_me", "/1.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# -# // and check that nothing was corrupted again -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "1.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.in_between") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "4.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.7") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/2.in_between", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.8") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/4.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.9") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## create + delete in different dirs with neighbors -#[cases.test_move_create_delete_different] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# // littlefs keeps files sorted, so we know the order these will be in -# lfs_mkdir(&lfs, "/dir.1") => 0; -# lfs_mkdir(&lfs, "/dir.2") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "/dir.1/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.2/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "remove me", -# sizeof("remove me")) => sizeof("remove me"); -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/dir.1/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.1", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.1/2.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.2", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/dir.2/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.3", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.2/2.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.4", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_t files[4]; -# lfs_file_open(&lfs, &files[0], "/dir.1/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "/dir.1/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "/dir.2/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[3], "/dir.2/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.5", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.6", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.7", 7) => 7; -# lfs_file_write(&lfs, &files[3], "test.8", 7) => 7; -# -# // rename file while everything is open, this triggers both -# // a create and delete as it overwrites the destination file -# lfs_rename(&lfs, "/dir.1/1.move_me", "/dir.2/1.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# lfs_file_close(&lfs, &files[3]) => 0; -# -# // check that nothing was corrupted -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "dir.1") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "dir.2") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/dir.1") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/dir.2") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "1.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/dir.1/0.before", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.5") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.1/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.6") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.2/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.7") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.2/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.8") == 0); -# lfs_file_close(&lfs, &file) => 0; -# -# // now move back -# lfs_file_open(&lfs, &file, "/dir.1/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "remove me", -# sizeof("remove me")) => sizeof("remove me"); -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &files[0], "/dir.1/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "/dir.1/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "/dir.2/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[3], "/dir.2/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.9", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.a", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.b", 7) => 7; -# lfs_file_write(&lfs, &files[3], "test.c", 7) => 7; -# -# // rename file while everything is open, this triggers both -# // a create and delete simultaneously -# lfs_rename(&lfs, "/dir.2/1.move_me", "/dir.1/1.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# lfs_file_close(&lfs, &files[3]) => 0; -# -# // and check that nothing was corrupted again -# lfs_dir_open(&lfs, &dir, "/") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "dir.1") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "dir.2") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/dir.1") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "1.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 0); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/dir.2") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/dir.1/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.9") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.1/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.a") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.2/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.b") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/dir.2/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.c") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## move fix in relocation -#[cases.test_move_fix_relocation] -#in = "lfs.c" -#defines.RELOCATIONS = 'range(4)' -#defines.ERASE_CYCLES = 0xffffffff -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# lfs_mkdir(&lfs, "/parent") => 0; -# lfs_mkdir(&lfs, "/parent/child") => 0; -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "/parent/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "move me", -# sizeof("move me")) => sizeof("move me"); -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/parent/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.1", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/2.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.2", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.3", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/2.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.4", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_t files[4]; -# lfs_file_open(&lfs, &files[0], "/parent/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "/parent/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "/parent/child/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[3], "/parent/child/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.5", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.6", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.7", 7) => 7; -# lfs_file_write(&lfs, &files[3], "test.8", 7) => 7; -# -# // force specific directories to relocate -# if (RELOCATIONS & 0x1) { -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/parent"); -# lfs_emubd_setwear(cfg, dir.m.pair[0], 0xffffffff) => 0; -# lfs_emubd_setwear(cfg, dir.m.pair[1], 0xffffffff) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# } -# if (RELOCATIONS & 0x2) { -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/parent/child"); -# lfs_emubd_setwear(cfg, dir.m.pair[0], 0xffffffff) => 0; -# lfs_emubd_setwear(cfg, dir.m.pair[1], 0xffffffff) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# } -# -# // ok, now we move the file, this creates a move that needs to be -# // fixed, possibly in a metadata-pair that needs to be relocated -# // -# // the worst case is if we need to relocate and we need to implicit -# // fix the move in our parent before it falls out of date -# lfs_rename(&lfs, "/parent/1.move_me", "/parent/child/1.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# lfs_file_close(&lfs, &files[3]) => 0; -# -# // check that nothing was corrupted -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "/parent") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "child") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/parent/child") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "1.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == sizeof("move me")); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/parent/0.before", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.5") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.6") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.7") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.8") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## move fix in relocation with predecessor -#[cases.test_move_fix_relocation_predecessor] -#in = "lfs.c" -#defines.RELOCATIONS = 'range(8)' -#defines.ERASE_CYCLES = 0xffffffff -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# lfs_mkdir(&lfs, "/parent") => 0; -# lfs_mkdir(&lfs, "/parent/child") => 0; -# lfs_mkdir(&lfs, "/parent/sibling") => 0; -# -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "/parent/sibling/1.move_me", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "move me", -# sizeof("move me")) => sizeof("move me"); -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "/parent/sibling/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.1", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/sibling/2.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.2", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/0.before", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.3", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/2.after", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_write(&lfs, &file, "test.4", 7) => 7; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_t files[4]; -# lfs_file_open(&lfs, &files[0], "/parent/sibling/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[1], "/parent/sibling/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[2], "/parent/child/0.before", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_open(&lfs, &files[3], "/parent/child/2.after", -# LFS_O_WRONLY | LFS_O_TRUNC) => 0; -# lfs_file_write(&lfs, &files[0], "test.5", 7) => 7; -# lfs_file_write(&lfs, &files[1], "test.6", 7) => 7; -# lfs_file_write(&lfs, &files[2], "test.7", 7) => 7; -# lfs_file_write(&lfs, &files[3], "test.8", 7) => 7; -# -# // force specific directories to relocate -# if (RELOCATIONS & 0x1) { -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/parent"); -# lfs_emubd_setwear(cfg, dir.m.pair[0], 0xffffffff) => 0; -# lfs_emubd_setwear(cfg, dir.m.pair[1], 0xffffffff) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# } -# if (RELOCATIONS & 0x2) { -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/parent/sibling"); -# lfs_emubd_setwear(cfg, dir.m.pair[0], 0xffffffff) => 0; -# lfs_emubd_setwear(cfg, dir.m.pair[1], 0xffffffff) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# } -# if (RELOCATIONS & 0x4) { -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "/parent/child"); -# lfs_emubd_setwear(cfg, dir.m.pair[0], 0xffffffff) => 0; -# lfs_emubd_setwear(cfg, dir.m.pair[1], 0xffffffff) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# } -# -# // ok, now we move the file, this creates a move that needs to be -# // fixed, possibly in a metadata-pair that needs to be relocated -# // -# // and now relocations can force us to need to fix our move in either -# // the parent or child before things break -# lfs_rename(&lfs, -# "/parent/sibling/1.move_me", -# "/parent/child/1.move_me") => 0; -# -# lfs_file_close(&lfs, &files[0]) => 0; -# lfs_file_close(&lfs, &files[1]) => 0; -# lfs_file_close(&lfs, &files[2]) => 0; -# lfs_file_close(&lfs, &files[3]) => 0; -# -# // check that nothing was corrupted -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "/parent") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "child") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "sibling") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/parent/sibling") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_dir_open(&lfs, &dir, "/parent/child") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, ".") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "..") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "0.before") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "1.move_me") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == sizeof("move me")); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# assert(strcmp(info.name, "2.after") == 0); -# assert(info.type == LFS_TYPE_REG); -# assert(info.size == 7); -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# lfs_file_open(&lfs, &file, "/parent/sibling/0.before", LFS_O_RDONLY) => 0; -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.5") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/sibling/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.6") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/0.before", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.7") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_file_open(&lfs, &file, "/parent/child/2.after", LFS_O_RDONLY) => 0; -# lfs_file_read(&lfs, &file, buffer, 7) => 7; -# assert(strcmp((char*)buffer, "test.8") == 0); -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_orphans.toml b/tests/test_orphans.toml deleted file mode 100644 index 4691f5b2..00000000 --- a/tests/test_orphans.toml +++ /dev/null @@ -1,129 +0,0 @@ -#[cases.test_orphans_normal] -#in = "lfs.c" -#if = 'PROG_SIZE <= 0x3fe' # only works with one crc per commit -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "parent") => 0; -# lfs_mkdir(&lfs, "parent/orphan") => 0; -# lfs_mkdir(&lfs, "parent/child") => 0; -# lfs_remove(&lfs, "parent/orphan") => 0; -# lfs_unmount(&lfs) => 0; -# -# // corrupt the child's most recent commit, this should be the update -# // to the linked-list entry, which should orphan the orphan. Note this -# // makes a lot of assumptions about the remove operation. -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "parent/child") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# uint8_t buffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# int off = BLOCK_SIZE-1; -# while (off >= 0 && buffer[off] == ERASE_VALUE) { -# off -= 1; -# } -# memset(&buffer[off-3], BLOCK_SIZE, 3); -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, buffer, BLOCK_SIZE) => 0; -# cfg->sync(cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "parent/child", &info) => 0; -# lfs_fs_size(&lfs) => 8; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "parent/child", &info) => 0; -# lfs_fs_size(&lfs) => 8; -# // this mkdir should both create a dir and deorphan, so size -# // should be unchanged -# lfs_mkdir(&lfs, "parent/otherchild") => 0; -# lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "parent/child", &info) => 0; -# lfs_stat(&lfs, "parent/otherchild", &info) => 0; -# lfs_fs_size(&lfs) => 8; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "parent/child", &info) => 0; -# lfs_stat(&lfs, "parent/otherchild", &info) => 0; -# lfs_fs_size(&lfs) => 8; -# lfs_unmount(&lfs) => 0; -#''' -# -## reentrant testing for orphans, basically just spam mkdir/remove -#[cases.test_orphans_reentrant] -#reentrant = true -## TODO fix this case, caused by non-DAG trees -#if = '!(DEPTH == 3 && CACHE_SIZE != 64)' -#defines = [ -# {FILES=6, DEPTH=1, CYCLES=20}, -# {FILES=26, DEPTH=1, CYCLES=20}, -# {FILES=3, DEPTH=3, CYCLES=20}, -#] -#code = ''' -# lfs_t lfs; -# int err = lfs_mount(&lfs, cfg); -# if (err) { -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# } -# -# uint32_t prng = 1; -# const char alpha[] = "abcdefghijklmnopqrstuvwxyz"; -# for (unsigned i = 0; i < CYCLES; i++) { -# // create random path -# char full_path[256]; -# for (unsigned d = 0; d < DEPTH; d++) { -# sprintf(&full_path[2*d], "/%c", alpha[TEST_PRNG(&prng) % FILES]); -# } -# -# // if it does not exist, we create it, else we destroy -# struct lfs_info info; -# int res = lfs_stat(&lfs, full_path, &info); -# if (res == LFS_ERR_NOENT) { -# // create each directory in turn, ignore if dir already exists -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# err = lfs_mkdir(&lfs, path); -# assert(!err || err == LFS_ERR_EXIST); -# } -# -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# lfs_stat(&lfs, path, &info) => 0; -# assert(strcmp(info.name, &path[2*d+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# } -# } else { -# // is valid dir? -# assert(strcmp(info.name, &full_path[2*(DEPTH-1)+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# // try to delete path in reverse order, ignore if dir is not empty -# for (int d = DEPTH-1; d >= 0; d--) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# err = lfs_remove(&lfs, path); -# assert(!err || err == LFS_ERR_NOTEMPTY); -# } -# -# lfs_stat(&lfs, full_path, &info) => LFS_ERR_NOENT; -# } -# } -# lfs_unmount(&lfs) => 0; -#''' -# diff --git a/tests/test_powerloss.toml b/tests/test_powerloss.toml index 4f4fbd99..dc37bc81 100644 --- a/tests/test_powerloss.toml +++ b/tests/test_powerloss.toml @@ -816,190 +816,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - - - - - -## There are already a number of tests that test general operations under -## power-loss (see the reentrant attribute). These tests are for explicitly -## testing specific corner cases. -# -## only a revision count -#[cases.test_powerloss_only_rev] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "notebook") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "notebook/paper", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# char buffer[256]; -# strcpy(buffer, "hello"); -# lfs_size_t size = strlen("hello"); -# for (int i = 0; i < 5; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_sync(&lfs, &file) => 0; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# char rbuffer[256]; -# lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0; -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# // get pair/rev count -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "notebook") => 0; -# lfs_block_t pair[2] = {dir.m.pair[0], dir.m.pair[1]}; -# uint32_t rev = dir.m.rev; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# -# // write just the revision count -# uint8_t bbuffer[BLOCK_SIZE]; -# cfg->read(cfg, pair[1], 0, bbuffer, BLOCK_SIZE) => 0; -# -# memcpy(bbuffer, &(uint32_t){lfs_tole32(rev+1)}, sizeof(uint32_t)); -# -# cfg->erase(cfg, pair[1]) => 0; -# cfg->prog(cfg, pair[1], 0, bbuffer, BLOCK_SIZE) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# -# // can read? -# lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0; -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // can write? -# lfs_file_open(&lfs, &file, "notebook/paper", -# LFS_O_WRONLY | LFS_O_APPEND) => 0; -# strcpy(buffer, "goodbye"); -# size = strlen("goodbye"); -# for (int i = 0; i < 5; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_sync(&lfs, &file) => 0; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0; -# strcpy(buffer, "hello"); -# size = strlen("hello"); -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# strcpy(buffer, "goodbye"); -# size = strlen("goodbye"); -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -## partial prog, may not be byte in order! -#[cases.test_powerloss_partial_prog] -#if = "PROG_SIZE < BLOCK_SIZE" -#defines.BYTE_OFF = ["0", "PROG_SIZE-1", "PROG_SIZE/2"] -#defines.BYTE_VALUE = [0x33, 0xcc] -#in = "lfs.c" -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "notebook") => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "notebook/paper", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# char buffer[256]; -# strcpy(buffer, "hello"); -# lfs_size_t size = strlen("hello"); -# for (int i = 0; i < 5; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_sync(&lfs, &file) => 0; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# char rbuffer[256]; -# lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0; -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# // imitate a partial prog, value should not matter, if littlefs -# // doesn't notice the partial prog testbd will assert -# -# // get offset to next prog -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# lfs_dir_open(&lfs, &dir, "notebook") => 0; -# lfs_block_t block = dir.m.pair[0]; -# lfs_off_t off = dir.m.off; -# lfs_dir_close(&lfs, &dir) => 0; -# lfs_unmount(&lfs) => 0; -# -# // tweak byte -# uint8_t bbuffer[BLOCK_SIZE]; -# cfg->read(cfg, block, 0, bbuffer, BLOCK_SIZE) => 0; -# -# bbuffer[off + BYTE_OFF] = BYTE_VALUE; -# -# cfg->erase(cfg, block) => 0; -# cfg->prog(cfg, block, 0, bbuffer, BLOCK_SIZE) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# -# // can read? -# lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0; -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# -# // can write? -# lfs_file_open(&lfs, &file, "notebook/paper", -# LFS_O_WRONLY | LFS_O_APPEND) => 0; -# strcpy(buffer, "goodbye"); -# size = strlen("goodbye"); -# for (int i = 0; i < 5; i++) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_sync(&lfs, &file) => 0; -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "notebook/paper", LFS_O_RDONLY) => 0; -# strcpy(buffer, "hello"); -# size = strlen("hello"); -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# strcpy(buffer, "goodbye"); -# size = strlen("goodbye"); -# for (int i = 0; i < 5; i++) { -# lfs_file_read(&lfs, &file, rbuffer, size) => size; -# assert(memcmp(rbuffer, buffer, size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_rbyd.toml b/tests/test_rbyd.toml index ecc1f1bf..682197bb 100644 --- a/tests/test_rbyd.toml +++ b/tests/test_rbyd.toml @@ -122,11 +122,6 @@ code = ''' lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.blocks[0], 0) => 0; ''' -# [cases.test_rbyd_atomic_fetchmatch] -# [cases.test_rbyd_fetchmatch] - -# TODO we really need to test dense keys... - [cases.test_rbyd_atomic_lookup] in = 'lfs.c' code = ''' diff --git a/tests/test_relocations.toml b/tests/test_relocations.toml index cdaf1dc9..2c015bed 100644 --- a/tests/test_relocations.toml +++ b/tests/test_relocations.toml @@ -2051,348 +2051,3 @@ code = ''' lfsr_unmount(&lfs) => 0; ''' - - -## specific corner cases worth explicitly testing for -#[cases.test_relocations_dangling_split_dir] -#defines.ITERATIONS = 20 -#defines.COUNT = 10 -#defines.BLOCK_CYCLES = [8, 1] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# // fill up filesystem so only ~16 blocks are left -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "padding", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# uint8_t buffer[512]; -# memset(buffer, 0, 512); -# while (BLOCK_COUNT - lfs_fs_size(&lfs) > 16) { -# lfs_file_write(&lfs, &file, buffer, 512) => 512; -# } -# lfs_file_close(&lfs, &file) => 0; -# // make a child dir to use in bounded space -# lfs_mkdir(&lfs, "child") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (unsigned j = 0; j < ITERATIONS; j++) { -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_file_open(&lfs, &file, path, LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "child") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "test%03d_loooooooooooooooooong_name", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# strcmp(info.name, path) => 0; -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# if (j == (unsigned)ITERATIONS-1) { -# break; -# } -# -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_remove(&lfs, path) => 0; -# } -# } -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "child") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "test%03d_loooooooooooooooooong_name", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# strcmp(info.name, path) => 0; -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_remove(&lfs, path) => 0; -# } -# lfs_unmount(&lfs) => 0; -#''' -# -#[cases.test_relocations_outdated_head] -#defines.ITERATIONS = 20 -#defines.COUNT = 10 -#defines.BLOCK_CYCLES = [8, 1] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# // fill up filesystem so only ~16 blocks are left -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "padding", LFS_O_CREAT | LFS_O_WRONLY) => 0; -# uint8_t buffer[512]; -# memset(buffer, 0, 512); -# while (BLOCK_COUNT - lfs_fs_size(&lfs) > 16) { -# lfs_file_write(&lfs, &file, buffer, 512) => 512; -# } -# lfs_file_close(&lfs, &file) => 0; -# // make a child dir to use in bounded space -# lfs_mkdir(&lfs, "child") => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# for (unsigned j = 0; j < ITERATIONS; j++) { -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_file_open(&lfs, &file, path, LFS_O_CREAT | LFS_O_WRONLY) => 0; -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_dir_t dir; -# struct lfs_info info; -# lfs_dir_open(&lfs, &dir, "child") => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "test%03d_loooooooooooooooooong_name", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# strcmp(info.name, path) => 0; -# info.size => 0; -# -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_file_open(&lfs, &file, path, LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hi", 2) => 2; -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# -# lfs_dir_rewind(&lfs, &dir) => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "test%03d_loooooooooooooooooong_name", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# strcmp(info.name, path) => 0; -# info.size => 2; -# -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_file_open(&lfs, &file, path, LFS_O_WRONLY) => 0; -# lfs_file_write(&lfs, &file, "hi", 2) => 2; -# lfs_file_close(&lfs, &file) => 0; -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# -# lfs_dir_rewind(&lfs, &dir) => 0; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# lfs_dir_read(&lfs, &dir, &info) => 1; -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "test%03d_loooooooooooooooooong_name", i); -# lfs_dir_read(&lfs, &dir, &info) => 1; -# strcmp(info.name, path) => 0; -# info.size => 2; -# } -# lfs_dir_read(&lfs, &dir, &info) => 0; -# lfs_dir_close(&lfs, &dir) => 0; -# -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "child/test%03d_loooooooooooooooooong_name", i); -# lfs_remove(&lfs, path) => 0; -# } -# } -# lfs_unmount(&lfs) => 0; -#''' -# -## reentrant testing for relocations, this is the same as the -## orphan testing, except here we also set block_cycles so that -## almost every tree operation needs a relocation -#[cases.test_relocations_reentrant] -#reentrant = true -## TODO fix this case, caused by non-DAG trees -## NOTE the second condition is required -#if = '!(DEPTH == 3 && CACHE_SIZE != 64) && 2*FILES < BLOCK_COUNT' -#defines = [ -# {FILES=6, DEPTH=1, CYCLES=20, BLOCK_CYCLES=1}, -# {FILES=26, DEPTH=1, CYCLES=20, BLOCK_CYCLES=1}, -# {FILES=3, DEPTH=3, CYCLES=20, BLOCK_CYCLES=1}, -#] -#code = ''' -# lfs_t lfs; -# int err = lfs_mount(&lfs, cfg); -# if (err) { -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# } -# -# uint32_t prng = 1; -# const char alpha[] = "abcdefghijklmnopqrstuvwxyz"; -# for (unsigned i = 0; i < CYCLES; i++) { -# // create random path -# char full_path[256]; -# for (unsigned d = 0; d < DEPTH; d++) { -# sprintf(&full_path[2*d], "/%c", alpha[TEST_PRNG(&prng) % FILES]); -# } -# -# // if it does not exist, we create it, else we destroy -# struct lfs_info info; -# int res = lfs_stat(&lfs, full_path, &info); -# if (res == LFS_ERR_NOENT) { -# // create each directory in turn, ignore if dir already exists -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# err = lfs_mkdir(&lfs, path); -# assert(!err || err == LFS_ERR_EXIST); -# } -# -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# lfs_stat(&lfs, path, &info) => 0; -# assert(strcmp(info.name, &path[2*d+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# } -# } else { -# // is valid dir? -# assert(strcmp(info.name, &full_path[2*(DEPTH-1)+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# // try to delete path in reverse order, ignore if dir is not empty -# for (unsigned d = DEPTH-1; d+1 > 0; d--) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# err = lfs_remove(&lfs, path); -# assert(!err || err == LFS_ERR_NOTEMPTY); -# } -# -# lfs_stat(&lfs, full_path, &info) => LFS_ERR_NOENT; -# } -# } -# lfs_unmount(&lfs) => 0; -#''' -# -## reentrant testing for relocations, but now with random renames! -#[cases.test_relocations_reentrant_renames] -#reentrant = true -## TODO fix this case, caused by non-DAG trees -## NOTE the second condition is required -#if = '!(DEPTH == 3 && CACHE_SIZE != 64) && 2*FILES < BLOCK_COUNT' -#defines = [ -# {FILES=6, DEPTH=1, CYCLES=20, BLOCK_CYCLES=1}, -# {FILES=26, DEPTH=1, CYCLES=20, BLOCK_CYCLES=1}, -# {FILES=3, DEPTH=3, CYCLES=20, BLOCK_CYCLES=1}, -#] -#code = ''' -# lfs_t lfs; -# int err = lfs_mount(&lfs, cfg); -# if (err) { -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# } -# -# uint32_t prng = 1; -# const char alpha[] = "abcdefghijklmnopqrstuvwxyz"; -# for (unsigned i = 0; i < CYCLES; i++) { -# // create random path -# char full_path[256]; -# for (unsigned d = 0; d < DEPTH; d++) { -# sprintf(&full_path[2*d], "/%c", alpha[TEST_PRNG(&prng) % FILES]); -# } -# -# // if it does not exist, we create it, else we destroy -# struct lfs_info info; -# int res = lfs_stat(&lfs, full_path, &info); -# assert(!res || res == LFS_ERR_NOENT); -# if (res == LFS_ERR_NOENT) { -# // create each directory in turn, ignore if dir already exists -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# err = lfs_mkdir(&lfs, path); -# assert(!err || err == LFS_ERR_EXIST); -# } -# -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# lfs_stat(&lfs, path, &info) => 0; -# assert(strcmp(info.name, &path[2*d+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# } -# } else { -# assert(strcmp(info.name, &full_path[2*(DEPTH-1)+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# // create new random path -# char new_path[256]; -# for (unsigned d = 0; d < DEPTH; d++) { -# sprintf(&new_path[2*d], "/%c", alpha[TEST_PRNG(&prng) % FILES]); -# } -# -# // if new path does not exist, rename, otherwise destroy -# res = lfs_stat(&lfs, new_path, &info); -# assert(!res || res == LFS_ERR_NOENT); -# if (res == LFS_ERR_NOENT) { -# // stop once some dir is renamed -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(&path[2*d], &full_path[2*d]); -# path[2*d+2] = '\0'; -# strcpy(&path[128+2*d], &new_path[2*d]); -# path[128+2*d+2] = '\0'; -# err = lfs_rename(&lfs, path, path+128); -# assert(!err || err == LFS_ERR_NOTEMPTY); -# if (!err) { -# strcpy(path, path+128); -# } -# } -# -# for (unsigned d = 0; d < DEPTH; d++) { -# char path[1024]; -# strcpy(path, new_path); -# path[2*d+2] = '\0'; -# lfs_stat(&lfs, path, &info) => 0; -# assert(strcmp(info.name, &path[2*d+1]) == 0); -# assert(info.type == LFS_TYPE_DIR); -# } -# -# lfs_stat(&lfs, full_path, &info) => LFS_ERR_NOENT; -# } else { -# // try to delete path in reverse order, -# // ignore if dir is not empty -# for (unsigned d = DEPTH-1; d+1 > 0; d--) { -# char path[1024]; -# strcpy(path, full_path); -# path[2*d+2] = '\0'; -# err = lfs_remove(&lfs, path); -# assert(!err || err == LFS_ERR_NOTEMPTY); -# } -# -# lfs_stat(&lfs, full_path, &info) => LFS_ERR_NOENT; -# } -# } -# } -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_seek.toml b/tests/test_seek.toml deleted file mode 100644 index 98f6c14d..00000000 --- a/tests/test_seek.toml +++ /dev/null @@ -1,403 +0,0 @@ -# -## simple file seek -#[cases.test_seek_read] -#defines = [ -# {COUNT=132, SKIP=4}, -# {COUNT=132, SKIP=128}, -# {COUNT=200, SKIP=10}, -# {COUNT=200, SKIP=100}, -# {COUNT=4, SKIP=1}, -# {COUNT=4, SKIP=2}, -#] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "kitty", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# size_t size = strlen("kittycatcat"); -# uint8_t buffer[1024]; -# memcpy(buffer, "kittycatcat", size); -# for (int j = 0; j < COUNT; j++) { -# lfs_file_write(&lfs, &file, buffer, size); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "kitty", LFS_O_RDONLY) => 0; -# -# lfs_soff_t pos = -1; -# size = strlen("kittycatcat"); -# for (int i = 0; i < SKIP; i++) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# pos = lfs_file_tell(&lfs, &file); -# } -# assert(pos >= 0); -# -# lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_rewind(&lfs, &file) => 0; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, size, LFS_SEEK_CUR) => 3*size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, -size, LFS_SEEK_CUR) => pos; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# size = lfs_file_size(&lfs, &file); -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## simple file seek and write -#[cases.test_seek_write] -#defines = [ -# {COUNT=132, SKIP=4}, -# {COUNT=132, SKIP=128}, -# {COUNT=200, SKIP=10}, -# {COUNT=200, SKIP=100}, -# {COUNT=4, SKIP=1}, -# {COUNT=4, SKIP=2}, -#] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "kitty", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# size_t size = strlen("kittycatcat"); -# uint8_t buffer[1024]; -# memcpy(buffer, "kittycatcat", size); -# for (int j = 0; j < COUNT; j++) { -# lfs_file_write(&lfs, &file, buffer, size); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0; -# -# lfs_soff_t pos = -1; -# size = strlen("kittycatcat"); -# for (int i = 0; i < SKIP; i++) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# pos = lfs_file_tell(&lfs, &file); -# } -# assert(pos >= 0); -# -# memcpy(buffer, "doggodogdog", size); -# lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos; -# lfs_file_write(&lfs, &file, buffer, size) => size; -# -# lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "doggodogdog", size) => 0; -# -# lfs_file_rewind(&lfs, &file) => 0; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, pos, LFS_SEEK_SET) => pos; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "doggodogdog", size) => 0; -# -# lfs_file_seek(&lfs, &file, -size, LFS_SEEK_END) >= 0 => 1; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# size = lfs_file_size(&lfs, &file); -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_CUR) => size; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## boundary seek and writes -#[cases.test_seek_boundary_write] -#defines.COUNT = 132 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "kitty", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# size_t size = strlen("kittycatcat"); -# uint8_t buffer[1024]; -# memcpy(buffer, "kittycatcat", size); -# for (int j = 0; j < COUNT; j++) { -# lfs_file_write(&lfs, &file, buffer, size); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0; -# -# size = strlen("hedgehoghog"); -# const lfs_soff_t offsets[] = {512, 1020, 513, 1021, 511, 1019, 1441}; -# -# for (unsigned i = 0; i < sizeof(offsets) / sizeof(offsets[0]); i++) { -# lfs_soff_t off = offsets[i]; -# memcpy(buffer, "hedgehoghog", size); -# lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off; -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hedgehoghog", size) => 0; -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hedgehoghog", size) => 0; -# -# lfs_file_sync(&lfs, &file) => 0; -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "kittycatcat", size) => 0; -# -# lfs_file_seek(&lfs, &file, off, LFS_SEEK_SET) => off; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hedgehoghog", size) => 0; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## out of bounds seek -#[cases.test_seek_out_of_bounds] -#defines = [ -# {COUNT=132, SKIP=4}, -# {COUNT=132, SKIP=128}, -# {COUNT=200, SKIP=10}, -# {COUNT=200, SKIP=100}, -# {COUNT=4, SKIP=2}, -# {COUNT=4, SKIP=3}, -#] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "kitty", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_APPEND) => 0; -# size_t size = strlen("kittycatcat"); -# uint8_t buffer[1024]; -# memcpy(buffer, "kittycatcat", size); -# for (int j = 0; j < COUNT; j++) { -# lfs_file_write(&lfs, &file, buffer, size); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0; -# -# size = strlen("kittycatcat"); -# lfs_file_size(&lfs, &file) => COUNT*size; -# lfs_file_seek(&lfs, &file, (COUNT+SKIP)*size, -# LFS_SEEK_SET) => (COUNT+SKIP)*size; -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# -# memcpy(buffer, "porcupineee", size); -# lfs_file_write(&lfs, &file, buffer, size) => size; -# -# lfs_file_seek(&lfs, &file, (COUNT+SKIP)*size, -# LFS_SEEK_SET) => (COUNT+SKIP)*size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "porcupineee", size) => 0; -# -# lfs_file_seek(&lfs, &file, COUNT*size, -# LFS_SEEK_SET) => COUNT*size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "\0\0\0\0\0\0\0\0\0\0\0", size) => 0; -# -# lfs_file_seek(&lfs, &file, -((COUNT+SKIP)*size), -# LFS_SEEK_CUR) => LFS_ERR_INVAL; -# lfs_file_tell(&lfs, &file) => (COUNT+1)*size; -# -# lfs_file_seek(&lfs, &file, -((COUNT+2*SKIP)*size), -# LFS_SEEK_END) => LFS_ERR_INVAL; -# lfs_file_tell(&lfs, &file) => (COUNT+1)*size; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## inline write and seek -#[cases.test_seek_inline_write] -#defines.SIZE = [2, 4, 128, 132] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "tinykitty", -# LFS_O_RDWR | LFS_O_CREAT) => 0; -# int j = 0; -# int k = 0; -# -# uint8_t buffer[1024]; -# memcpy(buffer, "abcdefghijklmnopqrstuvwxyz", 26); -# for (unsigned i = 0; i < SIZE; i++) { -# lfs_file_write(&lfs, &file, &buffer[j++ % 26], 1) => 1; -# lfs_file_tell(&lfs, &file) => i+1; -# lfs_file_size(&lfs, &file) => i+1; -# } -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# lfs_file_tell(&lfs, &file) => 0; -# lfs_file_size(&lfs, &file) => SIZE; -# for (unsigned i = 0; i < SIZE; i++) { -# uint8_t c; -# lfs_file_read(&lfs, &file, &c, 1) => 1; -# c => buffer[k++ % 26]; -# } -# -# lfs_file_sync(&lfs, &file) => 0; -# lfs_file_tell(&lfs, &file) => SIZE; -# lfs_file_size(&lfs, &file) => SIZE; -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# for (unsigned i = 0; i < SIZE; i++) { -# lfs_file_write(&lfs, &file, &buffer[j++ % 26], 1) => 1; -# lfs_file_tell(&lfs, &file) => i+1; -# lfs_file_size(&lfs, &file) => SIZE; -# lfs_file_sync(&lfs, &file) => 0; -# lfs_file_tell(&lfs, &file) => i+1; -# lfs_file_size(&lfs, &file) => SIZE; -# if (i < SIZE-2) { -# uint8_t c[3]; -# lfs_file_seek(&lfs, &file, -1, LFS_SEEK_CUR) => i; -# lfs_file_read(&lfs, &file, &c, 3) => 3; -# lfs_file_tell(&lfs, &file) => i+3; -# lfs_file_size(&lfs, &file) => SIZE; -# lfs_file_seek(&lfs, &file, i+1, LFS_SEEK_SET) => i+1; -# lfs_file_tell(&lfs, &file) => i+1; -# lfs_file_size(&lfs, &file) => SIZE; -# } -# } -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# lfs_file_tell(&lfs, &file) => 0; -# lfs_file_size(&lfs, &file) => SIZE; -# for (unsigned i = 0; i < SIZE; i++) { -# uint8_t c; -# lfs_file_read(&lfs, &file, &c, 1) => 1; -# c => buffer[k++ % 26]; -# } -# -# lfs_file_sync(&lfs, &file) => 0; -# lfs_file_tell(&lfs, &file) => SIZE; -# lfs_file_size(&lfs, &file) => SIZE; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## file seek and write with power-loss -#[cases.test_seek_reentrant_write] -## must be power-of-2 for quadratic probing to be exhaustive -#defines.COUNT = [4, 64, 128] -#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_file_t file; -# uint8_t buffer[1024]; -# err = lfs_file_open(&lfs, &file, "kitty", LFS_O_RDONLY); -# assert(!err || err == LFS_ERR_NOENT); -# if (!err) { -# if (lfs_file_size(&lfs, &file) != 0) { -# lfs_file_size(&lfs, &file) => 11*COUNT; -# for (int j = 0; j < COUNT; j++) { -# memset(buffer, 0, 11+1); -# lfs_file_read(&lfs, &file, buffer, 11) => 11; -# assert(memcmp(buffer, "kittycatcat", 11) == 0 || -# memcmp(buffer, "doggodogdog", 11) == 0); -# } -# } -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_file_open(&lfs, &file, "kitty", LFS_O_WRONLY | LFS_O_CREAT) => 0; -# if (lfs_file_size(&lfs, &file) == 0) { -# for (int j = 0; j < COUNT; j++) { -# strcpy((char*)buffer, "kittycatcat"); -# size_t size = strlen((char*)buffer); -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# } -# lfs_file_close(&lfs, &file) => 0; -# -# strcpy((char*)buffer, "doggodogdog"); -# size_t size = strlen((char*)buffer); -# -# lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => COUNT*size; -# // seek and write using quadratic probing to touch all -# // 11-byte words in the file -# lfs_off_t off = 0; -# for (int j = 0; j < COUNT; j++) { -# off = (5*off + 1) % COUNT; -# lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, "kittycatcat", size) == 0 || -# memcmp(buffer, "doggodogdog", size) == 0); -# if (memcmp(buffer, "doggodogdog", size) != 0) { -# lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size; -# strcpy((char*)buffer, "doggodogdog"); -# lfs_file_write(&lfs, &file, buffer, size) => size; -# lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, "doggodogdog", size) == 0); -# lfs_file_sync(&lfs, &file) => 0; -# lfs_file_seek(&lfs, &file, off*size, LFS_SEEK_SET) => off*size; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, "doggodogdog", size) == 0); -# } -# } -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "kitty", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => COUNT*size; -# for (int j = 0; j < COUNT; j++) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# assert(memcmp(buffer, "doggodogdog", size) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' diff --git a/tests/test_superblocks.toml b/tests/test_superblocks.toml deleted file mode 100644 index 95da01b9..00000000 --- a/tests/test_superblocks.toml +++ /dev/null @@ -1,211 +0,0 @@ -## 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; -##''' diff --git a/tests/test_truncate.toml b/tests/test_truncate.toml deleted file mode 100644 index 7644a216..00000000 --- a/tests/test_truncate.toml +++ /dev/null @@ -1,477 +0,0 @@ -## simple truncate -#[cases.test_truncate_simple] -#defines.MEDIUMSIZE = [32, 2048] -#defines.LARGESIZE = 8192 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "baldynoop", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "hair"); -# size_t size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < LARGESIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => LARGESIZE; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => LARGESIZE; -# -# lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# size = strlen("hair"); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## truncate and read -#[cases.test_truncate_read] -#defines.MEDIUMSIZE = [32, 2048] -#defines.LARGESIZE = 8192 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "baldyread", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "hair"); -# size_t size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < LARGESIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => LARGESIZE; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldyread", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => LARGESIZE; -# -# lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# size = strlen("hair"); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldyread", LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# size = strlen("hair"); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## write, truncate, and read -#[cases.test_truncate_write_read] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "sequence", -# LFS_O_RDWR | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# uint8_t buffer[1024]; -# size_t size = lfs_min(lfs.cfg->cache_size, sizeof(buffer)/2); -# lfs_size_t qsize = size / 4; -# uint8_t *wb = buffer; -# uint8_t *rb = buffer + size; -# for (lfs_off_t j = 0; j < size; ++j) { -# wb[j] = j; -# } -# -# /* Spread sequence over size */ -# lfs_file_write(&lfs, &file, wb, size) => size; -# lfs_file_size(&lfs, &file) => size; -# lfs_file_tell(&lfs, &file) => size; -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# lfs_file_tell(&lfs, &file) => 0; -# -# /* Chop off the last quarter */ -# lfs_size_t trunc = size - qsize; -# lfs_file_truncate(&lfs, &file, trunc) => 0; -# lfs_file_tell(&lfs, &file) => 0; -# lfs_file_size(&lfs, &file) => trunc; -# -# /* Read should produce first 3/4 */ -# lfs_file_read(&lfs, &file, rb, size) => trunc; -# memcmp(rb, wb, trunc) => 0; -# -# /* Move to 1/4 */ -# lfs_file_size(&lfs, &file) => trunc; -# lfs_file_seek(&lfs, &file, qsize, LFS_SEEK_SET) => qsize; -# lfs_file_tell(&lfs, &file) => qsize; -# -# /* Chop to 1/2 */ -# trunc -= qsize; -# lfs_file_truncate(&lfs, &file, trunc) => 0; -# lfs_file_tell(&lfs, &file) => qsize; -# lfs_file_size(&lfs, &file) => trunc; -# -# /* Read should produce second quarter */ -# lfs_file_read(&lfs, &file, rb, size) => trunc - qsize; -# memcmp(rb, wb + qsize, trunc - qsize) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## truncate and write -#[cases.test_truncate_write] -#defines.MEDIUMSIZE = [32, 2048] -#defines.LARGESIZE = 8192 -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "baldywrite", -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "hair"); -# size_t size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < LARGESIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => LARGESIZE; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => LARGESIZE; -# -# lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# strcpy((char*)buffer, "bald"); -# size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# size = strlen("bald"); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "bald", size) => 0; -# } -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## truncate write under powerloss -#[cases.test_truncate_reentrant_write] -#defines.SMALLSIZE = [4, 512] -#defines.MEDIUMSIZE = [32, 1024] -#defines.LARGESIZE = 2048 -#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_file_t file; -# err = lfs_file_open(&lfs, &file, "baldy", LFS_O_RDONLY); -# assert(!err || err == LFS_ERR_NOENT); -# if (!err) { -# size_t size = lfs_file_size(&lfs, &file); -# assert(size == 0 || -# size == (size_t)LARGESIZE || -# size == (size_t)MEDIUMSIZE || -# size == (size_t)SMALLSIZE); -# for (lfs_off_t j = 0; j < size; j += 4) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, 4) => 4; -# assert(memcmp(buffer, "hair", 4) == 0 || -# memcmp(buffer, "bald", 4) == 0 || -# memcmp(buffer, "comb", 4) == 0); -# } -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_file_open(&lfs, &file, "baldy", -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# lfs_file_size(&lfs, &file) => 0; -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "hair"); -# size_t size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < LARGESIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => LARGESIZE; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => LARGESIZE; -# lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# strcpy((char*)buffer, "bald"); -# size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# lfs_file_truncate(&lfs, &file, SMALLSIZE) => 0; -# lfs_file_size(&lfs, &file) => SMALLSIZE; -# strcpy((char*)buffer, "comb"); -# size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < SMALLSIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => SMALLSIZE; -# lfs_file_close(&lfs, &file) => 0; -# -# lfs_unmount(&lfs) => 0; -#''' -# -## more aggressive general truncation tests -#[cases.test_truncate_aggressive] -#defines.CONFIG = 'range(6)' -#defines.SMALLSIZE = 32 -#defines.MEDIUMSIZE = 2048 -#defines.LARGESIZE = 8192 -#code = ''' -# lfs_t lfs; -# #define COUNT 5 -# const struct { -# lfs_off_t startsizes[COUNT]; -# lfs_off_t startseeks[COUNT]; -# lfs_off_t hotsizes[COUNT]; -# lfs_off_t coldsizes[COUNT]; -# } configs[] = { -# // cold shrinking -# {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}}, -# // cold expanding -# {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}}, -# // warm shrinking truncate -# {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}, -# { 0, 0, 0, 0, 0}}, -# // warm expanding truncate -# {{ 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}, -# { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}}, -# // mid-file shrinking truncate -# {{2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# { LARGESIZE, LARGESIZE, LARGESIZE, LARGESIZE, LARGESIZE}, -# { 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}, -# { 0, 0, 0, 0, 0}}, -# // mid-file expanding truncate -# {{ 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE, 2*LARGESIZE}, -# { 0, 0, SMALLSIZE, MEDIUMSIZE, LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}, -# {2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE, 2*LARGESIZE}}, -# }; -# -# const lfs_off_t *startsizes = configs[CONFIG].startsizes; -# const lfs_off_t *startseeks = configs[CONFIG].startseeks; -# const lfs_off_t *hotsizes = configs[CONFIG].hotsizes; -# const lfs_off_t *coldsizes = configs[CONFIG].coldsizes; -# -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "hairyhead%d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC) => 0; -# -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "hair"); -# size_t size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < startsizes[i]; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# } -# lfs_file_size(&lfs, &file) => startsizes[i]; -# -# if (startseeks[i] != startsizes[i]) { -# lfs_file_seek(&lfs, &file, -# startseeks[i], LFS_SEEK_SET) => startseeks[i]; -# } -# -# lfs_file_truncate(&lfs, &file, hotsizes[i]) => 0; -# lfs_file_size(&lfs, &file) => hotsizes[i]; -# -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "hairyhead%d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => hotsizes[i]; -# -# size_t size = strlen("hair"); -# lfs_off_t j = 0; -# for (; j < startsizes[i] && j < hotsizes[i]; j += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# -# for (; j < hotsizes[i]; j += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "\0\0\0\0", size) => 0; -# } -# -# lfs_file_truncate(&lfs, &file, coldsizes[i]) => 0; -# lfs_file_size(&lfs, &file) => coldsizes[i]; -# -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_unmount(&lfs) => 0; -# -# lfs_mount(&lfs, cfg) => 0; -# -# for (unsigned i = 0; i < COUNT; i++) { -# char path[1024]; -# sprintf(path, "hairyhead%d", i); -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) => 0; -# lfs_file_size(&lfs, &file) => coldsizes[i]; -# -# size_t size = strlen("hair"); -# lfs_off_t j = 0; -# for (; j < startsizes[i] && j < hotsizes[i] && j < coldsizes[i]; -# j += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# -# for (; j < coldsizes[i]; j += size) { -# uint8_t buffer[1024]; -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "\0\0\0\0", size) => 0; -# } -# -# lfs_file_close(&lfs, &file) => 0; -# } -# -# lfs_unmount(&lfs) => 0; -#''' -# -## noop truncate -#[cases.test_truncate_nop] -#defines.MEDIUMSIZE = [32, 2048] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "baldynoop", -# LFS_O_RDWR | LFS_O_CREAT) => 0; -# -# uint8_t buffer[1024]; -# strcpy((char*)buffer, "hair"); -# size_t size = strlen((char*)buffer); -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_write(&lfs, &file, buffer, size) => size; -# -# // this truncate should do nothing -# lfs_file_truncate(&lfs, &file, j+size) => 0; -# } -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# lfs_file_seek(&lfs, &file, 0, LFS_SEEK_SET) => 0; -# // should do nothing again -# lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -# -# // still there after reboot? -# lfs_mount(&lfs, cfg) => 0; -# lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0; -# lfs_file_size(&lfs, &file) => MEDIUMSIZE; -# for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) { -# lfs_file_read(&lfs, &file, buffer, size) => size; -# memcmp(buffer, "hair", size) => 0; -# } -# lfs_file_read(&lfs, &file, buffer, size) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_unmount(&lfs) => 0; -#'''