From dd7b04564c867373d1228edc0f7986fad54d666c Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 20 Jun 2024 14:46:02 -0500 Subject: [PATCH] t: Added a couple idempotent traversal mutation tests Just to makes sure this works as expected. Though internally the logic is pretty simple. --- tests/test_traversal.toml | 106 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/tests/test_traversal.toml b/tests/test_traversal.toml index 50e0a4d6..97832785 100644 --- a/tests/test_traversal.toml +++ b/tests/test_traversal.toml @@ -1782,6 +1782,112 @@ done:; lfsr_unmount(&lfs) => 0; ''' +# test that we don't get extra anything after end of traversal +[cases.test_traversal_mutation_idempotent] +defines.CKMETADATA = [false, true] +defines.CKDATA = [false, true] +defines.LOOKAHEAD = [false, true] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + + // try traversing + lfsr_traversal_t t; + lfsr_traversal_open(&lfs, &t, + ((CKMETADATA) ? LFS_T_CKMETADATA : 0) + | ((CKDATA) ? LFS_T_CKDATA : 0) + | ((LOOKAHEAD) ? LFS_T_LOOKAHEAD : 0)) => 0; + struct lfs_tinfo tinfo; + lfsr_traversal_read(&lfs, &t, &tinfo) => 0; + assert(tinfo.btype == LFS_BTYPE_MDIR); + assert(tinfo.block == 0 || tinfo.block == 1); + + // mutate + lfsr_file_t file; + lfsr_file_open(&lfs, &file, "spider", + LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; + lfsr_file_close(&lfs, &file) => 0; + + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + + // try another mutation just for good measure + lfsr_file_open(&lfs, &file, "tarantula", + LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; + lfsr_file_close(&lfs, &file) => 0; + + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT; + + lfsr_traversal_close(&lfs, &t) => 0; + + lfsr_unmount(&lfs) => 0; +''' + +[cases.test_traversal_mutation_excl_idempotent] +defines.CKMETADATA = [false, true] +defines.CKDATA = [false, true] +defines.LOOKAHEAD = [false, true] +code = ''' + lfs_t lfs; + lfsr_format(&lfs, CFG) => 0; + lfsr_mount(&lfs, CFG) => 0; + + // try traversing + lfsr_traversal_t t; + lfsr_traversal_open(&lfs, &t, + LFS_T_EXCL + | ((CKMETADATA) ? LFS_T_CKMETADATA : 0) + | ((CKDATA) ? LFS_T_CKDATA : 0) + | ((LOOKAHEAD) ? LFS_T_LOOKAHEAD : 0)) => 0; + struct lfs_tinfo tinfo; + lfsr_traversal_read(&lfs, &t, &tinfo) => 0; + assert(tinfo.btype == LFS_BTYPE_MDIR); + assert(tinfo.block == 0 || tinfo.block == 1); + + // mutate + lfsr_file_t file; + lfsr_file_open(&lfs, &file, "spider", + LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; + lfsr_file_close(&lfs, &file) => 0; + + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + + // try another mutation just for good measure + lfsr_file_open(&lfs, &file, "tarantula", + LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0; + lfsr_file_close(&lfs, &file) => 0; + + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY; + + lfsr_traversal_close(&lfs, &t) => 0; + + lfsr_unmount(&lfs) => 0; +''' + [cases.test_traversal_mutation_mkdir] defines.WHEN = [0, 1, 2] defines.EXCL = [false, true]