Made delete remove the path from the tree completely, fixed failing tests

This commit is contained in:
Christopher Haster
2023-01-03 22:25:53 -06:00
parent 045a1098fd
commit 788e98a989
2 changed files with 499 additions and 424 deletions
+350 -348
View File
@@ -3030,9 +3030,9 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 2, "\xbb\xbb", 2, NULL))))) => 0;
LFS_MKRATTR(UATTR, 1, 2, "\xbb\xbb", 2, NULL))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 2, NULL, 0, NULL)) => 0;
@@ -3040,12 +3040,12 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xaa\xaa\xaa\xaa", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xaa\xaa", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
@@ -3053,12 +3053,12 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xaa\xaa\xaa\xaa", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xaa\xaa", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> LFS_ERR_NOENT;
// try to delete the other id
@@ -3066,9 +3066,9 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 2, "\xbb\xbb", 2, NULL))))) => 0;
LFS_MKRATTR(UATTR, 1, 2, "\xbb\xbb", 2, NULL))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0, NULL)) => 0;
@@ -3076,12 +3076,12 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xbb\xbb\xbb\xbb", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xbb\xbb", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
@@ -3089,12 +3089,12 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xbb\xbb\xbb\xbb", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xbb\xbb", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> LFS_ERR_NOENT;
// try to delete the largest of three
@@ -3102,11 +3102,11 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 2, "\xbb\xbb", 2,
LFS_MKRATTR(UATTR, 1, 2, "\xbb\xbb", 2,
LFS_MKRATTR(CREATEREG, 0, 3, "\xcc\xcc\xcc\xcc", 4,
LFS_MKRATTR(UATTR, 0, 3, "\xcc\xcc", 2, NULL))))))) => 0;
LFS_MKRATTR(UATTR, 1, 3, "\xcc\xcc", 2, NULL))))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 3, NULL, 0, NULL)) => 0;
@@ -3114,18 +3114,18 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xaa\xaa\xaa\xaa", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xaa\xaa", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xbb\xbb\xbb\xbb", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xbb\xbb", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 3), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
@@ -3133,18 +3133,18 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xaa\xaa\xaa\xaa", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xaa\xaa", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xbb\xbb\xbb\xbb", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xbb\xbb", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 3), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 3), buffer, 4)
=> LFS_ERR_NOENT;
// try to delete the smallest of three
@@ -3152,11 +3152,11 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 2, "\xbb\xbb", 2,
LFS_MKRATTR(UATTR, 1, 2, "\xbb\xbb", 2,
LFS_MKRATTR(CREATEREG, 0, 3, "\xcc\xcc\xcc\xcc", 4,
LFS_MKRATTR(UATTR, 0, 3, "\xcc\xcc", 2, NULL))))))) => 0;
LFS_MKRATTR(UATTR, 1, 3, "\xcc\xcc", 2, NULL))))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0, NULL)) => 0;
@@ -3164,18 +3164,18 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xbb\xbb\xbb\xbb", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xbb\xbb", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xcc\xcc\xcc\xcc", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xcc\xcc", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 3), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
@@ -3183,18 +3183,18 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xbb\xbb\xbb\xbb", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xbb\xbb", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xcc\xcc\xcc\xcc", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xcc\xcc", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 3), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 3), buffer, 4)
=> LFS_ERR_NOENT;
// try to delete the middle
@@ -3202,11 +3202,11 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 2, "\xbb\xbb", 2,
LFS_MKRATTR(UATTR, 1, 2, "\xbb\xbb", 2,
LFS_MKRATTR(CREATEREG, 0, 3, "\xcc\xcc\xcc\xcc", 4,
LFS_MKRATTR(UATTR, 0, 3, "\xcc\xcc", 2, NULL))))))) => 0;
LFS_MKRATTR(UATTR, 1, 3, "\xcc\xcc", 2, NULL))))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 2, NULL, 0, NULL)) => 0;
@@ -3214,18 +3214,18 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xaa\xaa\xaa\xaa", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xaa\xaa", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xcc\xcc\xcc\xcc", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xcc\xcc", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 3), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
@@ -3233,18 +3233,18 @@ code = '''
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 1), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xaa\xaa\xaa\xaa", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 1), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 1), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xaa\xaa", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 2), buffer, 4)
=> 4;
assert(memcmp(buffer, "\xcc\xcc\xcc\xcc", 4) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 2), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 2), buffer, 4)
=> 2;
assert(memcmp(buffer, "\xcc\xcc", 2) == 0);
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(CREATEREG, 0, 3), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 0, 3), buffer, 4)
lfs_rbyd_get(&lfs, &rbyd, LFS_MKRTAG(UATTR, 1, 3), buffer, 4)
=> LFS_ERR_NOENT;
'''
@@ -3432,7 +3432,7 @@ code = '''
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, id+1, names[perm[j] % 6], 4,
// note uattrs have a smaller size
LFS_MKRATTR(UATTR, 0, id+1, names[perm[j] % 6], 2,
LFS_MKRATTR(UATTR, 1, id+1, names[perm[j] % 6], 2,
NULL))) => 0;
}
assert(rbyd.count == N);
@@ -3468,7 +3468,7 @@ code = '''
}
lfs_rbyd_get(&lfs, &rbyd,
LFS_MKRTAG(UATTR, 0, k+1), buffer, 4) => 2;
LFS_MKRTAG(UATTR, 1, k+1), buffer, 4) => 2;
if (k >= j) {
assert(memcmp(buffer, names[(k+1) % 6], 2) == 0);
} else {
@@ -3479,7 +3479,7 @@ code = '''
LFS_MKRTAG(CREATEREG, 0, N-1+1), buffer, 4)
=> LFS_ERR_NOENT;
lfs_rbyd_get(&lfs, &rbyd,
LFS_MKRTAG(UATTR, 0, N-1+1), buffer, 4)
LFS_MKRTAG(UATTR, 1, N-1+1), buffer, 4)
=> LFS_ERR_NOENT;
}
@@ -3642,7 +3642,7 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2, NULL))) => 0;
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2, NULL))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0, NULL)) => 0;
@@ -3660,9 +3660,9 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xbb\xbb", 2, NULL))))) => 0;
LFS_MKRATTR(UATTR, 1, 1, "\xbb\xbb", 2, NULL))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0, NULL))) => 0;
@@ -3681,9 +3681,9 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xbb\xbb", 2, NULL))))) => 0;
LFS_MKRATTR(UATTR, 1, 1, "\xbb\xbb", 2, NULL))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 2, NULL, 0,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0, NULL))) => 0;
@@ -3702,11 +3702,11 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xbb\xbb", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xbb\xbb", 2,
LFS_MKRATTR(CREATEREG, 0, 3, "\xcc\xcc\xcc\xcc", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xcc\xcc", 2, NULL))))))) => 0;
LFS_MKRATTR(UATTR, 1, 1, "\xcc\xcc", 2, NULL))))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0,
LFS_MKRATTR(DELETE, 0, 1, NULL, 0,
@@ -3726,11 +3726,11 @@ code = '''
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, 1, "\xaa\xaa\xaa\xaa", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xaa\xaa", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xaa\xaa", 2,
LFS_MKRATTR(CREATEREG, 0, 2, "\xbb\xbb\xbb\xbb", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xbb\xbb", 2,
LFS_MKRATTR(UATTR, 1, 1, "\xbb\xbb", 2,
LFS_MKRATTR(CREATEREG, 0, 3, "\xcc\xcc\xcc\xcc", 4,
LFS_MKRATTR(UATTR, 0, 1, "\xcc\xcc", 2, NULL))))))) => 0;
LFS_MKRATTR(UATTR, 1, 1, "\xcc\xcc", 2, NULL))))))) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, 3, NULL, 0,
LFS_MKRATTR(DELETE, 0, 2, NULL, 0,
@@ -3893,7 +3893,7 @@ code = '''
for (unsigned j = 0; j < N; j++) {
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, j+1, names[j % 6], 4,
LFS_MKRATTR(UATTR, 0, j+1, names[j % 6], 2,
LFS_MKRATTR(UATTR, 1, j+1, names[j % 6], 2,
NULL))) => 0;
}
assert(rbyd.count == N);
@@ -3973,298 +3973,300 @@ code = '''
}
'''
# TODO test delete-to-zero with fetches after explicitly?
# TODO also remove-to-zero for removes
# [cases.test_rbyd_delete_create_permutations]
# defines.N = 'range(1, 6)'
# in = 'lfs.c'
# code = '''
# lfs_t lfs;
# lfs_init(&lfs, cfg) => 0;
#
# lfs_rbyd_t init_rbyd = {
# .block = 0,
# .trunk = 0,
# .off = 0,
# .rev = 1,
# .crc = 0,
# .count = 0,
# .erased = true,
# };
# lfs_rbyd_t rbyd;
# const uint8_t names[6][6] = {
# "\xaa\xaa\xaa\xaa\xaa\xaa",
# "\xbb\xbb\xbb\xbb\xbb\xbb",
# "\xcc\xcc\xcc\xcc\xcc\xcc",
# "\xdd\xdd\xdd\xdd\xdd\xdd",
# "\xee\xee\xee\xee\xee\xee",
# "\xff\xff\xff\xff\xff\xff",
# };
# uint8_t buffer[6];
#
# // test all permutations of a given size
# uint16_t perm[N];
# unsigned stack[N];
# for (uint16_t i = 0; i < N; i++) {
# perm[i] = i;
# stack[i] = 0;
# }
#
# unsigned i = 1;
# while (i < N) {
# // print permutation to help debugging
# printf("--- permutation: [");
# for (unsigned j = 0; j < N; j++) {
# if (j > 0) {
# printf(", ");
# }
# printf("%d", perm[j]+1);
# }
# printf("] ---\n");
#
# // create given permutation with multiple commits
# rbyd = init_rbyd;
# lfs_bd_erase(&lfs, rbyd.block) => 0;
#
# for (unsigned j = 0; j < N; j++) {
# // adjust id based on future insertions
# uint16_t id = perm[j];
# for (unsigned k = j+1; k < N; k++) {
# if (perm[j] > perm[k]) {
# id -= 1;
# }
# }
#
# lfs_rbyd_commit(&lfs, &rbyd,
# LFS_MKRATTR(CREATEREG, 0, id+1, names[perm[j] % 6], 4,
# NULL)) => 0;
# }
# assert(rbyd.count == N);
#
# // copy block so we can reset after each delete
# lfs_rbyd_t backup_rbyd = rbyd;
# uint8_t backup_block[BLOCK_SIZE];
# lfs_bd_read(&lfs, NULL, &lfs.rcache, rbyd.off,
# rbyd.block, 0, backup_block, rbyd.off) => 0;
#
# // try deleting each id
# for (unsigned j = 0; j < N; j++) {
# for (unsigned l = 0; l < N; l++) {
# // print what we are deleting to help debugging
# printf("--- delete: %d, create: %d ---\n", j+1, l+1);
#
# rbyd = backup_rbyd;
# lfs_bd_erase(&lfs, rbyd.block) => 0;
# lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
# rbyd.block, 0, backup_block, rbyd.off) => 0;
#
# // delete
# lfs_rbyd_commit(&lfs, &rbyd,
# LFS_MKRATTR(DELETE, 0, j+1, NULL, 0,
# NULL)) => 0;
# assert(rbyd.count == N-1);
#
# // try creating each tag to make sure the rbyd tree
# // is still usable
# lfs_rbyd_commit(&lfs, &rbyd,
# LFS_MKRATTR(CREATEREG, 0, l+1, names[l % 6], 6,
# NULL)) => 0;
# assert(rbyd.count == N);
#
# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
# for (unsigned k = 0; k < N; k++) {
# lfs_ssize_t size = lfs_rbyd_get(&lfs, &rbyd,
# LFS_MKRTAG(CREATEREG, 0, k+1), buffer, 6);
# if (k == l) {
# assert(size == 6);
# assert(memcmp(buffer, names[l % 6], 6) == 0);
# } else {
# uint16_t expected = k;
# if (expected > l) {
# expected -= 1;
# }
# if (expected >= j) {
# expected += 1;
# }
# assert(size == 4);
# assert(memcmp(buffer, names[expected % 6], 4) == 0);
# }
# }
# }
# }
#
# // next permutation using Heap's algorithm
# if (stack[i] < i) {
# if (i % 2 == 0) {
# uint16_t t = perm[0];
# perm[0] = perm[i];
# perm[i] = t;
# } else {
# uint16_t t = perm[stack[i]];
# perm[stack[i]] = perm[i];
# perm[i] = t;
# }
# stack[i] += 1;
# i = 1;
# } else {
# stack[i] = 0;
# i += 1;
# }
# }
# '''
#
# [cases.test_rbyd_delete_create_range_permutations]
# defines.N = 'range(1, 6)'
# in = 'lfs.c'
# code = '''
# lfs_t lfs;
# lfs_init(&lfs, cfg) => 0;
#
# lfs_rbyd_t init_rbyd = {
# .block = 0,
# .trunk = 0,
# .off = 0,
# .rev = 1,
# .crc = 0,
# .count = 0,
# .erased = true,
# };
# lfs_rbyd_t rbyd;
# const uint8_t names[6][6] = {
# "\xaa\xaa\xaa\xaa\xaa\xaa",
# "\xbb\xbb\xbb\xbb\xbb\xbb",
# "\xcc\xcc\xcc\xcc\xcc\xcc",
# "\xdd\xdd\xdd\xdd\xdd\xdd",
# "\xee\xee\xee\xee\xee\xee",
# "\xff\xff\xff\xff\xff\xff",
# };
# uint8_t buffer[6];
#
# // test all permutations of a given size
# uint16_t perm[N];
# unsigned stack[N];
# for (uint16_t i = 0; i < N; i++) {
# perm[i] = i;
# stack[i] = 0;
# }
#
# unsigned i = 1;
# while (i < N) {
# // print permutation to help debugging
# printf("--- permutation: [");
# for (unsigned j = 0; j < N; j++) {
# if (j > 0) {
# printf(", ");
# }
# printf("%d", perm[j]+1);
# }
# printf("] ---\n");
#
# // create given permutation with multiple commits
# rbyd = init_rbyd;
# lfs_bd_erase(&lfs, rbyd.block) => 0;
#
# for (unsigned j = 0; j < N; j++) {
# // adjust id based on future insertions
# uint16_t id = perm[j];
# for (unsigned k = j+1; k < N; k++) {
# if (perm[j] > perm[k]) {
# id -= 1;
# }
# }
#
# lfs_rbyd_commit(&lfs, &rbyd,
# LFS_MKRATTR(CREATEREG, 0, id+1, names[perm[j] % 6], 4,
# LFS_MKRATTR(UATTR, 0, id+1, names[perm[j] % 6], 2,
# NULL))) => 0;
# }
# assert(rbyd.count == N);
#
# // copy block so we can reset after each delete
# lfs_rbyd_t backup_rbyd = rbyd;
# uint8_t backup_block[BLOCK_SIZE];
# lfs_bd_read(&lfs, NULL, &lfs.rcache, rbyd.off,
# rbyd.block, 0, backup_block, rbyd.off) => 0;
#
# // try deleting each id
# for (unsigned j = 0; j < N; j++) {
# for (unsigned l = 0; l < N; l++) {
# // print what we are deleting to help debugging
# printf("--- delete: %d, create: %d ---\n", j+1, l+1);
#
# rbyd = backup_rbyd;
# lfs_bd_erase(&lfs, rbyd.block) => 0;
# lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
# rbyd.block, 0, backup_block, rbyd.off) => 0;
#
# // delete
# lfs_rbyd_commit(&lfs, &rbyd,
# LFS_MKRATTR(DELETE, 0, j+1, NULL, 0,
# NULL)) => 0;
# assert(rbyd.count == N-1);
#
# // try creating each tag to make sure the rbyd tree
# // is still usable
# lfs_rbyd_commit(&lfs, &rbyd,
# LFS_MKRATTR(CREATEREG, 0, l+1, names[l % 6], 6,
# LFS_MKRATTR(UATTR, 0, l+1, names[l % 6], 3,
# NULL))) => 0;
# assert(rbyd.count == N);
#
# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
# for (unsigned k = 0; k < N; k++) {
# lfs_ssize_t size = lfs_rbyd_get(&lfs, &rbyd,
# LFS_MKRTAG(CREATEREG, 0, k+1), buffer, 6);
# if (k == l) {
# assert(size == 6);
# assert(memcmp(buffer, names[l % 6], 6) == 0);
# } else {
# uint16_t expected = k;
# if (expected > l) {
# expected -= 1;
# }
# if (expected >= j) {
# expected += 1;
# }
# assert(size == 4);
# assert(memcmp(buffer, names[expected % 6], 4) == 0);
# }
#
# size = lfs_rbyd_get(&lfs, &rbyd,
# LFS_MKRTAG(UATTR, 0, k+1), buffer, 6);
# if (k == l) {
# assert(size == 3);
# assert(memcmp(buffer, names[l % 6], 3) == 0);
# } else {
# uint16_t expected = k;
# if (expected > l) {
# expected -= 1;
# }
# if (expected >= j) {
# expected += 1;
# }
# assert(size == 2);
# assert(memcmp(buffer, names[expected % 6], 2) == 0);
# }
# }
# }
# }
#
# // next permutation using Heap's algorithm
# if (stack[i] < i) {
# if (i % 2 == 0) {
# uint16_t t = perm[0];
# perm[0] = perm[i];
# perm[i] = t;
# } else {
# uint16_t t = perm[stack[i]];
# perm[stack[i]] = perm[i];
# perm[i] = t;
# }
# stack[i] += 1;
# i = 1;
# } else {
# stack[i] = 0;
# i += 1;
# }
# }
# '''
[cases.test_rbyd_delete_create_permutations]
defines.N = 'range(1, 6)'
in = 'lfs.c'
code = '''
lfs_t lfs;
lfs_init(&lfs, cfg) => 0;
lfs_rbyd_t init_rbyd = {
.block = 0,
.trunk = 0,
.off = 0,
.rev = 1,
.crc = 0,
.count = 0,
.erased = true,
};
lfs_rbyd_t rbyd;
const uint8_t names[6][6] = {
"\xaa\xaa\xaa\xaa\xaa\xaa",
"\xbb\xbb\xbb\xbb\xbb\xbb",
"\xcc\xcc\xcc\xcc\xcc\xcc",
"\xdd\xdd\xdd\xdd\xdd\xdd",
"\xee\xee\xee\xee\xee\xee",
"\xff\xff\xff\xff\xff\xff",
};
uint8_t buffer[6];
// test all permutations of a given size
uint16_t perm[N];
unsigned stack[N];
for (uint16_t i = 0; i < N; i++) {
perm[i] = i;
stack[i] = 0;
}
unsigned i = 1;
while (i < N) {
// print permutation to help debugging
printf("--- permutation: [");
for (unsigned j = 0; j < N; j++) {
if (j > 0) {
printf(", ");
}
printf("%d", perm[j]+1);
}
printf("] ---\n");
// create given permutation with multiple commits
rbyd = init_rbyd;
lfs_bd_erase(&lfs, rbyd.block) => 0;
for (unsigned j = 0; j < N; j++) {
// adjust id based on future insertions
uint16_t id = perm[j];
for (unsigned k = j+1; k < N; k++) {
if (perm[j] > perm[k]) {
id -= 1;
}
}
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, id+1, names[perm[j] % 6], 4,
NULL)) => 0;
}
assert(rbyd.count == N);
// copy block so we can reset after each delete
lfs_rbyd_t backup_rbyd = rbyd;
uint8_t backup_block[BLOCK_SIZE];
lfs_bd_read(&lfs, NULL, &lfs.rcache, rbyd.off,
rbyd.block, 0, backup_block, rbyd.off) => 0;
// try deleting each id
for (unsigned j = 0; j < N; j++) {
for (unsigned l = 0; l < N; l++) {
// print what we are deleting to help debugging
printf("--- delete: %d, create: %d ---\n", j+1, l+1);
rbyd = backup_rbyd;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
rbyd.block, 0, backup_block, rbyd.off) => 0;
// delete
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, j+1, NULL, 0,
NULL)) => 0;
assert(rbyd.count == N-1);
// try creating each tag to make sure the rbyd tree
// is still usable
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, l+1, names[l % 6], 6,
NULL)) => 0;
assert(rbyd.count == N);
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
for (unsigned k = 0; k < N; k++) {
lfs_ssize_t size = lfs_rbyd_get(&lfs, &rbyd,
LFS_MKRTAG(CREATEREG, 0, k+1), buffer, 6);
if (k == l) {
assert(size == 6);
assert(memcmp(buffer, names[l % 6], 6) == 0);
} else {
uint16_t expected = k;
if (expected > l) {
expected -= 1;
}
if (expected >= j) {
expected += 1;
}
assert(size == 4);
assert(memcmp(buffer, names[expected % 6], 4) == 0);
}
}
}
}
// next permutation using Heap's algorithm
if (stack[i] < i) {
if (i % 2 == 0) {
uint16_t t = perm[0];
perm[0] = perm[i];
perm[i] = t;
} else {
uint16_t t = perm[stack[i]];
perm[stack[i]] = perm[i];
perm[i] = t;
}
stack[i] += 1;
i = 1;
} else {
stack[i] = 0;
i += 1;
}
}
'''
[cases.test_rbyd_delete_create_range_permutations]
defines.N = 'range(1, 6)'
in = 'lfs.c'
code = '''
lfs_t lfs;
lfs_init(&lfs, cfg) => 0;
lfs_rbyd_t init_rbyd = {
.block = 0,
.trunk = 0,
.off = 0,
.rev = 1,
.crc = 0,
.count = 0,
.erased = true,
};
lfs_rbyd_t rbyd;
const uint8_t names[6][6] = {
"\xaa\xaa\xaa\xaa\xaa\xaa",
"\xbb\xbb\xbb\xbb\xbb\xbb",
"\xcc\xcc\xcc\xcc\xcc\xcc",
"\xdd\xdd\xdd\xdd\xdd\xdd",
"\xee\xee\xee\xee\xee\xee",
"\xff\xff\xff\xff\xff\xff",
};
uint8_t buffer[6];
// test all permutations of a given size
uint16_t perm[N];
unsigned stack[N];
for (uint16_t i = 0; i < N; i++) {
perm[i] = i;
stack[i] = 0;
}
unsigned i = 1;
while (i < N) {
// print permutation to help debugging
printf("--- permutation: [");
for (unsigned j = 0; j < N; j++) {
if (j > 0) {
printf(", ");
}
printf("%d", perm[j]+1);
}
printf("] ---\n");
// create given permutation with multiple commits
rbyd = init_rbyd;
lfs_bd_erase(&lfs, rbyd.block) => 0;
for (unsigned j = 0; j < N; j++) {
// adjust id based on future insertions
uint16_t id = perm[j];
for (unsigned k = j+1; k < N; k++) {
if (perm[j] > perm[k]) {
id -= 1;
}
}
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, id+1, names[perm[j] % 6], 4,
LFS_MKRATTR(UATTR, 1, id+1, names[perm[j] % 6], 2,
NULL))) => 0;
}
assert(rbyd.count == N);
// copy block so we can reset after each delete
lfs_rbyd_t backup_rbyd = rbyd;
uint8_t backup_block[BLOCK_SIZE];
lfs_bd_read(&lfs, NULL, &lfs.rcache, rbyd.off,
rbyd.block, 0, backup_block, rbyd.off) => 0;
// try deleting each id
for (unsigned j = 0; j < N; j++) {
for (unsigned l = 0; l < N; l++) {
// print what we are deleting to help debugging
printf("--- delete: %d, create: %d ---\n", j+1, l+1);
rbyd = backup_rbyd;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_bd_prog(&lfs, &lfs.pcache, &lfs.rcache, false,
rbyd.block, 0, backup_block, rbyd.off) => 0;
// delete
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(DELETE, 0, j+1, NULL, 0,
NULL)) => 0;
assert(rbyd.count == N-1);
// try creating each tag to make sure the rbyd tree
// is still usable
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(CREATEREG, 0, l+1, names[l % 6], 6,
LFS_MKRATTR(UATTR, 1, l+1, names[l % 6], 3,
NULL))) => 0;
assert(rbyd.count == N);
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
for (unsigned k = 0; k < N; k++) {
lfs_ssize_t size = lfs_rbyd_get(&lfs, &rbyd,
LFS_MKRTAG(CREATEREG, 0, k+1), buffer, 6);
if (k == l) {
assert(size == 6);
assert(memcmp(buffer, names[l % 6], 6) == 0);
} else {
uint16_t expected = k;
if (expected > l) {
expected -= 1;
}
if (expected >= j) {
expected += 1;
}
assert(size == 4);
assert(memcmp(buffer, names[expected % 6], 4) == 0);
}
size = lfs_rbyd_get(&lfs, &rbyd,
LFS_MKRTAG(UATTR, 1, k+1), buffer, 6);
if (k == l) {
assert(size == 3);
assert(memcmp(buffer, names[l % 6], 3) == 0);
} else {
uint16_t expected = k;
if (expected > l) {
expected -= 1;
}
if (expected >= j) {
expected += 1;
}
assert(size == 2);
assert(memcmp(buffer, names[expected % 6], 2) == 0);
}
}
}
}
// next permutation using Heap's algorithm
if (stack[i] < i) {
if (i % 2 == 0) {
uint16_t t = perm[0];
perm[0] = perm[i];
perm[i] = t;
} else {
uint16_t t = perm[stack[i]];
perm[stack[i]] = perm[i];
perm[i] = t;
}
stack[i] += 1;
i = 1;
} else {
stack[i] = 0;
i += 1;
}
}
'''