From b2e5a13525f1f8aad61456f06ddf048e3c6e41ea Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sat, 8 Jun 2024 13:30:37 -0500 Subject: [PATCH] Readded test_paths for path-related corner cases These are simple tests, but good to have. --- tests/test_paths.toml | 662 +++++++++++++++++++++--------------------- 1 file changed, 326 insertions(+), 336 deletions(-) diff --git a/tests/test_paths.toml b/tests/test_paths.toml index 3e082067..ab801b67 100644 --- a/tests/test_paths.toml +++ b/tests/test_paths.toml @@ -1,336 +1,326 @@ -# -## simple path test -#[cases.test_paths_normal] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "tea") => 0; -# lfs_mkdir(&lfs, "tea/hottea") => 0; -# lfs_mkdir(&lfs, "tea/warmtea") => 0; -# lfs_mkdir(&lfs, "tea/coldtea") => 0; -# -# struct lfs_info info; -# lfs_stat(&lfs, "tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "/tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# -# lfs_mkdir(&lfs, "/milk") => 0; -# lfs_stat(&lfs, "/milk", &info) => 0; -# assert(strcmp(info.name, "milk") == 0); -# lfs_stat(&lfs, "milk", &info) => 0; -# assert(strcmp(info.name, "milk") == 0); -# lfs_unmount(&lfs) => 0; -#''' -# -## redundant slashes -#[cases.test_paths_redundant_slashes] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "tea") => 0; -# lfs_mkdir(&lfs, "tea/hottea") => 0; -# lfs_mkdir(&lfs, "tea/warmtea") => 0; -# lfs_mkdir(&lfs, "tea/coldtea") => 0; -# -# struct lfs_info info; -# lfs_stat(&lfs, "/tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "//tea//hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "///tea///hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# -# lfs_mkdir(&lfs, "////milk") => 0; -# lfs_stat(&lfs, "////milk", &info) => 0; -# assert(strcmp(info.name, "milk") == 0); -# lfs_stat(&lfs, "milk", &info) => 0; -# assert(strcmp(info.name, "milk") == 0); -# lfs_unmount(&lfs) => 0; -#''' -# -## dot path test -#[cases.test_paths_dot] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "tea") => 0; -# lfs_mkdir(&lfs, "tea/hottea") => 0; -# lfs_mkdir(&lfs, "tea/warmtea") => 0; -# lfs_mkdir(&lfs, "tea/coldtea") => 0; -# -# struct lfs_info info; -# lfs_stat(&lfs, "./tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "/./tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "/././tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "/./tea/./hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# -# lfs_mkdir(&lfs, "/./milk") => 0; -# lfs_stat(&lfs, "/./milk", &info) => 0; -# assert(strcmp(info.name, "milk") == 0); -# lfs_stat(&lfs, "milk", &info) => 0; -# assert(strcmp(info.name, "milk") == 0); -# lfs_unmount(&lfs) => 0; -#''' -# -## dot dot path test -#[cases.test_paths_dot_dot] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "tea") => 0; -# lfs_mkdir(&lfs, "tea/hottea") => 0; -# lfs_mkdir(&lfs, "tea/warmtea") => 0; -# lfs_mkdir(&lfs, "tea/coldtea") => 0; -# lfs_mkdir(&lfs, "coffee") => 0; -# lfs_mkdir(&lfs, "coffee/hotcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/warmcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/coldcoffee") => 0; -# -# struct lfs_info info; -# lfs_stat(&lfs, "coffee/../tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "tea/coldtea/../hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "coffee/coldcoffee/../../tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "coffee/../coffee/../tea/hottea", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# -# lfs_mkdir(&lfs, "coffee/../milk") => 0; -# lfs_stat(&lfs, "coffee/../milk", &info) => 0; -# strcmp(info.name, "milk") => 0; -# lfs_stat(&lfs, "milk", &info) => 0; -# strcmp(info.name, "milk") => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## trailing dot path test -#[cases.test_paths_trailing_dot] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "tea") => 0; -# lfs_mkdir(&lfs, "tea/hottea") => 0; -# lfs_mkdir(&lfs, "tea/warmtea") => 0; -# lfs_mkdir(&lfs, "tea/coldtea") => 0; -# -# struct lfs_info info; -# lfs_stat(&lfs, "tea/hottea/", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "tea/hottea/.", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "tea/hottea/./.", &info) => 0; -# assert(strcmp(info.name, "hottea") == 0); -# lfs_stat(&lfs, "tea/hottea/..", &info) => 0; -# assert(strcmp(info.name, "tea") == 0); -# lfs_stat(&lfs, "tea/hottea/../.", &info) => 0; -# assert(strcmp(info.name, "tea") == 0); -# lfs_unmount(&lfs) => 0; -#''' -# -## leading dot path test -#[cases.test_paths_leading_dot] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, ".milk") => 0; -# struct lfs_info info; -# lfs_stat(&lfs, ".milk", &info) => 0; -# strcmp(info.name, ".milk") => 0; -# lfs_stat(&lfs, "tea/.././.milk", &info) => 0; -# strcmp(info.name, ".milk") => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## root dot dot path test -#[cases.test_paths_root_dot_dot] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "tea") => 0; -# lfs_mkdir(&lfs, "tea/hottea") => 0; -# lfs_mkdir(&lfs, "tea/warmtea") => 0; -# lfs_mkdir(&lfs, "tea/coldtea") => 0; -# lfs_mkdir(&lfs, "coffee") => 0; -# lfs_mkdir(&lfs, "coffee/hotcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/warmcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/coldcoffee") => 0; -# -# struct lfs_info info; -# lfs_stat(&lfs, "coffee/../../../../../../tea/hottea", &info) => 0; -# strcmp(info.name, "hottea") => 0; -# -# lfs_mkdir(&lfs, "coffee/../../../../../../milk") => 0; -# lfs_stat(&lfs, "coffee/../../../../../../milk", &info) => 0; -# strcmp(info.name, "milk") => 0; -# lfs_stat(&lfs, "milk", &info) => 0; -# strcmp(info.name, "milk") => 0; -# lfs_unmount(&lfs) => 0; -#''' -# -## invalid path tests -#[cases.test_paths_invalid] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg); -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "dirt", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "dirt/ground", &info) => LFS_ERR_NOENT; -# lfs_stat(&lfs, "dirt/ground/earth", &info) => LFS_ERR_NOENT; -# -# lfs_remove(&lfs, "dirt") => LFS_ERR_NOENT; -# lfs_remove(&lfs, "dirt/ground") => LFS_ERR_NOENT; -# lfs_remove(&lfs, "dirt/ground/earth") => LFS_ERR_NOENT; -# -# lfs_mkdir(&lfs, "dirt/ground") => LFS_ERR_NOENT; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "dirt/ground", LFS_O_WRONLY | LFS_O_CREAT) -# => LFS_ERR_NOENT; -# lfs_mkdir(&lfs, "dirt/ground/earth") => LFS_ERR_NOENT; -# lfs_file_open(&lfs, &file, "dirt/ground/earth", LFS_O_WRONLY | LFS_O_CREAT) -# => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -## root operations -#[cases.test_paths_root] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "/", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# -# lfs_mkdir(&lfs, "/") => LFS_ERR_EXIST; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, "/", LFS_O_WRONLY | LFS_O_CREAT) -# => LFS_ERR_ISDIR; -# -# lfs_remove(&lfs, "/") => LFS_ERR_INVAL; -# lfs_unmount(&lfs) => 0; -#''' -# -## root representations -#[cases.test_paths_root_reprs] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "/", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_stat(&lfs, "", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_stat(&lfs, ".", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_stat(&lfs, "..", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_stat(&lfs, "//", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_stat(&lfs, "./", &info) => 0; -# assert(strcmp(info.name, "/") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_unmount(&lfs) => 0; -#''' -# -## superblock conflict test -#[cases.test_paths_superblock_conflict] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# struct lfs_info info; -# lfs_stat(&lfs, "littlefs", &info) => LFS_ERR_NOENT; -# lfs_remove(&lfs, "littlefs") => LFS_ERR_NOENT; -# -# lfs_mkdir(&lfs, "littlefs") => 0; -# lfs_stat(&lfs, "littlefs", &info) => 0; -# assert(strcmp(info.name, "littlefs") == 0); -# assert(info.type == LFS_TYPE_DIR); -# lfs_remove(&lfs, "littlefs") => 0; -# lfs_stat(&lfs, "littlefs", &info) => LFS_ERR_NOENT; -# lfs_unmount(&lfs) => 0; -#''' -# -## max path test -#[cases.test_paths_max] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "coffee") => 0; -# lfs_mkdir(&lfs, "coffee/hotcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/warmcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/coldcoffee") => 0; -# -# char path[1024]; -# memset(path, 'w', LFS_NAME_MAX+1); -# path[LFS_NAME_MAX+1] = '\0'; -# lfs_mkdir(&lfs, path) => LFS_ERR_NAMETOOLONG; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, LFS_O_WRONLY | LFS_O_CREAT) -# => LFS_ERR_NAMETOOLONG; -# -# memcpy(path, "coffee/", strlen("coffee/")); -# memset(path+strlen("coffee/"), 'w', LFS_NAME_MAX+1); -# path[strlen("coffee/")+LFS_NAME_MAX+1] = '\0'; -# lfs_mkdir(&lfs, path) => LFS_ERR_NAMETOOLONG; -# lfs_file_open(&lfs, &file, path, LFS_O_WRONLY | LFS_O_CREAT) -# => LFS_ERR_NAMETOOLONG; -# lfs_unmount(&lfs) => 0; -#''' -# -## really big path test -#[cases.test_paths_really_big] -#code = ''' -# lfs_t lfs; -# lfs_format(&lfs, cfg) => 0; -# lfs_mount(&lfs, cfg) => 0; -# lfs_mkdir(&lfs, "coffee") => 0; -# lfs_mkdir(&lfs, "coffee/hotcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/warmcoffee") => 0; -# lfs_mkdir(&lfs, "coffee/coldcoffee") => 0; -# -# char path[1024]; -# memset(path, 'w', LFS_NAME_MAX); -# path[LFS_NAME_MAX] = '\0'; -# lfs_mkdir(&lfs, path) => 0; -# lfs_remove(&lfs, path) => 0; -# lfs_file_t file; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_remove(&lfs, path) => 0; -# -# memcpy(path, "coffee/", strlen("coffee/")); -# memset(path+strlen("coffee/"), 'w', LFS_NAME_MAX); -# path[strlen("coffee/")+LFS_NAME_MAX] = '\0'; -# lfs_mkdir(&lfs, path) => 0; -# lfs_remove(&lfs, path) => 0; -# lfs_file_open(&lfs, &file, path, -# LFS_O_WRONLY | LFS_O_CREAT) => 0; -# lfs_file_close(&lfs, &file) => 0; -# lfs_remove(&lfs, path) => 0; -# lfs_unmount(&lfs) => 0; -#''' -# +# Test various path-related corner cases +after = 'test_dirs' + +# simple path test +[cases.test_paths_normal] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "tea") => 0; + lfsr_mkdir(&lfs, "tea/green") => 0; + lfsr_mkdir(&lfs, "tea/oolong") => 0; + lfsr_mkdir(&lfs, "tea/black") => 0; + + struct lfs_info info; + lfsr_stat(&lfs, "tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "/tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + + lfsr_mkdir(&lfs, "/milk") => 0; + lfsr_stat(&lfs, "/milk", &info) => 0; + assert(strcmp(info.name, "milk") == 0); + lfsr_stat(&lfs, "milk", &info) => 0; + assert(strcmp(info.name, "milk") == 0); + lfsr_unmount(&lfs) => 0; +''' + +# redundant slashes +[cases.test_paths_redundant_slashes] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "tea") => 0; + lfsr_mkdir(&lfs, "tea/green") => 0; + lfsr_mkdir(&lfs, "tea/oolong") => 0; + lfsr_mkdir(&lfs, "tea/black") => 0; + + struct lfs_info info; + lfsr_stat(&lfs, "/tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "//tea//green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "///tea///green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + + lfsr_mkdir(&lfs, "////milk") => 0; + lfsr_stat(&lfs, "////milk", &info) => 0; + assert(strcmp(info.name, "milk") == 0); + lfsr_stat(&lfs, "milk", &info) => 0; + assert(strcmp(info.name, "milk") == 0); + lfsr_unmount(&lfs) => 0; +''' + +# dot path test +[cases.test_paths_dot] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "tea") => 0; + lfsr_mkdir(&lfs, "tea/green") => 0; + lfsr_mkdir(&lfs, "tea/oolong") => 0; + lfsr_mkdir(&lfs, "tea/black") => 0; + + struct lfs_info info; + lfsr_stat(&lfs, "./tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "/./tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "/././tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "/./tea/./green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + + lfsr_mkdir(&lfs, "/./milk") => 0; + lfsr_stat(&lfs, "/./milk", &info) => 0; + assert(strcmp(info.name, "milk") == 0); + lfsr_stat(&lfs, "milk", &info) => 0; + assert(strcmp(info.name, "milk") == 0); + lfsr_unmount(&lfs) => 0; +''' + +# dot dot path test +[cases.test_paths_dot_dot] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "tea") => 0; + lfsr_mkdir(&lfs, "tea/green") => 0; + lfsr_mkdir(&lfs, "tea/oolong") => 0; + lfsr_mkdir(&lfs, "tea/black") => 0; + lfsr_mkdir(&lfs, "coffee") => 0; + lfsr_mkdir(&lfs, "coffee/drip") => 0; + lfsr_mkdir(&lfs, "coffee/espresso") => 0; + lfsr_mkdir(&lfs, "coffee/coldbrew") => 0; + + struct lfs_info info; + lfsr_stat(&lfs, "coffee/../tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "tea/black/../green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "coffee/coldbrew/../../tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "coffee/../coffee/../tea/green", &info) => 0; + assert(strcmp(info.name, "green") == 0); + + lfsr_mkdir(&lfs, "coffee/../milk") => 0; + lfsr_stat(&lfs, "coffee/../milk", &info) => 0; + strcmp(info.name, "milk") => 0; + lfsr_stat(&lfs, "milk", &info) => 0; + strcmp(info.name, "milk") => 0; + lfsr_unmount(&lfs) => 0; +''' + +# trailing dot path test +[cases.test_paths_trailing_dot] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "tea") => 0; + lfsr_mkdir(&lfs, "tea/green") => 0; + lfsr_mkdir(&lfs, "tea/oolong") => 0; + lfsr_mkdir(&lfs, "tea/black") => 0; + + struct lfs_info info; + lfsr_stat(&lfs, "tea/green/", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "tea/green/.", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "tea/green/./.", &info) => 0; + assert(strcmp(info.name, "green") == 0); + lfsr_stat(&lfs, "tea/green/..", &info) => 0; + assert(strcmp(info.name, "tea") == 0); + lfsr_stat(&lfs, "tea/green/../.", &info) => 0; + assert(strcmp(info.name, "tea") == 0); + lfsr_unmount(&lfs) => 0; +''' + +# leading dot path test +[cases.test_paths_leading_dot] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, ".milk") => 0; + struct lfs_info info; + lfsr_stat(&lfs, ".milk", &info) => 0; + strcmp(info.name, ".milk") => 0; + lfsr_stat(&lfs, "tea/.././.milk", &info) => 0; + strcmp(info.name, ".milk") => 0; + lfsr_unmount(&lfs) => 0; +''' + +# root dot dot path test +[cases.test_paths_root_dot_dot] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "tea") => 0; + lfsr_mkdir(&lfs, "tea/green") => 0; + lfsr_mkdir(&lfs, "tea/oolong") => 0; + lfsr_mkdir(&lfs, "tea/black") => 0; + lfsr_mkdir(&lfs, "coffee") => 0; + lfsr_mkdir(&lfs, "coffee/drip") => 0; + lfsr_mkdir(&lfs, "coffee/espresso") => 0; + lfsr_mkdir(&lfs, "coffee/coldbrew") => 0; + + struct lfs_info info; + lfsr_stat(&lfs, "coffee/../../../../../../tea/green", &info) => 0; + strcmp(info.name, "green") => 0; + + lfsr_mkdir(&lfs, "coffee/../../../../../../milk") => 0; + lfsr_stat(&lfs, "coffee/../../../../../../milk", &info) => 0; + strcmp(info.name, "milk") => 0; + lfsr_stat(&lfs, "milk", &info) => 0; + strcmp(info.name, "milk") => 0; + lfsr_unmount(&lfs) => 0; +''' + +# invalid path tests +[cases.test_paths_invalid] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG); + lfsr_mount(&lfs, CFG) => 0; + struct lfs_info info; + lfsr_stat(&lfs, "milk", &info) => LFS_ERR_NOENT; + lfsr_stat(&lfs, "milk/cream", &info) => LFS_ERR_NOENT; + lfsr_stat(&lfs, "milk/cream/foam", &info) => LFS_ERR_NOENT; + + lfsr_remove(&lfs, "milk") => LFS_ERR_NOENT; + lfsr_remove(&lfs, "milk/cream") => LFS_ERR_NOENT; + lfsr_remove(&lfs, "milk/cream/foam") => LFS_ERR_NOENT; + + lfsr_mkdir(&lfs, "milk/cream") => LFS_ERR_NOENT; + lfsr_file_t file; + lfsr_file_open(&lfs, &file, "milk/cream", + LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOENT; + lfsr_mkdir(&lfs, "milk/cream/foam") => LFS_ERR_NOENT; + lfsr_file_open(&lfs, &file, "milk/cream/foam", + LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOENT; + lfsr_unmount(&lfs) => 0; +''' + +# root operations +[cases.test_paths_root] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + struct lfs_info info; + lfsr_stat(&lfs, "/", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + + lfsr_mkdir(&lfs, "/") => LFS_ERR_INVAL; + lfsr_file_t file; + lfsr_file_open(&lfs, &file, "/", + LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_INVAL; + + lfsr_remove(&lfs, "/") => LFS_ERR_INVAL; + lfsr_unmount(&lfs) => 0; +''' + +# root representations +[cases.test_paths_root_reprs] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + struct lfs_info info; + lfsr_stat(&lfs, "/", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + lfsr_stat(&lfs, "", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + lfsr_stat(&lfs, ".", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + lfsr_stat(&lfs, "..", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + lfsr_stat(&lfs, "//", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + lfsr_stat(&lfs, "./", &info) => 0; + assert(strcmp(info.name, "/") == 0); + assert(info.type == LFS_TYPE_DIR); + assert(info.size == 0); + lfsr_unmount(&lfs) => 0; +''' + +# max path test +[cases.test_paths_max] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "coffee") => 0; + lfsr_mkdir(&lfs, "coffee/drip") => 0; + lfsr_mkdir(&lfs, "coffee/espresso") => 0; + lfsr_mkdir(&lfs, "coffee/coldbrew") => 0; + + char path[2*LFS_NAME_MAX+2]; + memset(path, 'w', LFS_NAME_MAX+1); + path[LFS_NAME_MAX+1] = '\0'; + lfsr_mkdir(&lfs, path) => LFS_ERR_NAMETOOLONG; + lfsr_file_t file; + lfsr_file_open(&lfs, &file, path, + LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NAMETOOLONG; + + memcpy(path, "coffee/", strlen("coffee/")); + memset(path+strlen("coffee/"), 'w', LFS_NAME_MAX+1); + path[strlen("coffee/")+LFS_NAME_MAX+1] = '\0'; + lfsr_mkdir(&lfs, path) => LFS_ERR_NAMETOOLONG; + lfsr_file_open(&lfs, &file, path, + LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NAMETOOLONG; + lfsr_unmount(&lfs) => 0; +''' + +# really big path test +[cases.test_paths_really_big] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + lfsr_mkdir(&lfs, "coffee") => 0; + lfsr_mkdir(&lfs, "coffee/drip") => 0; + lfsr_mkdir(&lfs, "coffee/espresso") => 0; + lfsr_mkdir(&lfs, "coffee/coldbrew") => 0; + + char path[2*LFS_NAME_MAX+2]; + memset(path, 'w', LFS_NAME_MAX); + path[LFS_NAME_MAX] = '\0'; + lfsr_mkdir(&lfs, path) => 0; + lfsr_remove(&lfs, path) => 0; + lfsr_file_t file; + lfsr_file_open(&lfs, &file, path, + LFS_O_WRONLY | LFS_O_CREAT) => 0; + lfsr_file_close(&lfs, &file) => 0; + lfsr_remove(&lfs, path) => 0; + + memcpy(path, "coffee/", strlen("coffee/")); + memset(path+strlen("coffee/"), 'w', LFS_NAME_MAX); + path[strlen("coffee/")+LFS_NAME_MAX] = '\0'; + lfsr_mkdir(&lfs, path) => 0; + lfsr_remove(&lfs, path) => 0; + lfsr_file_open(&lfs, &file, path, + LFS_O_WRONLY | LFS_O_CREAT) => 0; + lfsr_file_close(&lfs, &file) => 0; + lfsr_remove(&lfs, path) => 0; + lfsr_unmount(&lfs) => 0; +''' +