Expanded truncate tests to test more corner cases
Removed the weird alignment requirement from the general truncate tests. This explicitly hid off-by-one truncation errors. These tests now reveal the same issue as the block-sized truncation test while also testing for other potential off-by-one errors.
This commit is contained in:
+55
-67
@@ -1,6 +1,7 @@
|
|||||||
[[case]] # simple truncate
|
[[case]] # simple truncate
|
||||||
define.MEDIUMSIZE = [32, 2048]
|
define.MEDIUMSIZE = [31, 32, 33, 511, 512, 513, 2047, 2048, 2049]
|
||||||
define.LARGESIZE = 8192
|
define.LARGESIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
|
||||||
|
if = 'MEDIUMSIZE < LARGESIZE'
|
||||||
code = '''
|
code = '''
|
||||||
lfs_format(&lfs, &cfg) => 0;
|
lfs_format(&lfs, &cfg) => 0;
|
||||||
lfs_mount(&lfs, &cfg) => 0;
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
@@ -10,7 +11,8 @@ code = '''
|
|||||||
strcpy((char*)buffer, "hair");
|
strcpy((char*)buffer, "hair");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
|
||||||
|
=> lfs_min(size, LARGESIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => LARGESIZE;
|
lfs_file_size(&lfs, &file) => LARGESIZE;
|
||||||
|
|
||||||
@@ -33,8 +35,9 @@ code = '''
|
|||||||
|
|
||||||
size = strlen("hair");
|
size = strlen("hair");
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => size;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
memcmp(buffer, "hair", size) => 0;
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
||||||
|
|
||||||
@@ -43,8 +46,9 @@ code = '''
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
[[case]] # truncate and read
|
[[case]] # truncate and read
|
||||||
define.MEDIUMSIZE = [32, 2048]
|
define.MEDIUMSIZE = [31, 32, 33, 511, 512, 513, 2047, 2048, 2049]
|
||||||
define.LARGESIZE = 8192
|
define.LARGESIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
|
||||||
|
if = 'MEDIUMSIZE < LARGESIZE'
|
||||||
code = '''
|
code = '''
|
||||||
lfs_format(&lfs, &cfg) => 0;
|
lfs_format(&lfs, &cfg) => 0;
|
||||||
lfs_mount(&lfs, &cfg) => 0;
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
@@ -54,7 +58,8 @@ code = '''
|
|||||||
strcpy((char*)buffer, "hair");
|
strcpy((char*)buffer, "hair");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
|
||||||
|
=> lfs_min(size, LARGESIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => LARGESIZE;
|
lfs_file_size(&lfs, &file) => LARGESIZE;
|
||||||
|
|
||||||
@@ -70,8 +75,9 @@ code = '''
|
|||||||
|
|
||||||
size = strlen("hair");
|
size = strlen("hair");
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => size;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
memcmp(buffer, "hair", size) => 0;
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
||||||
|
|
||||||
@@ -84,8 +90,9 @@ code = '''
|
|||||||
|
|
||||||
size = strlen("hair");
|
size = strlen("hair");
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => size;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
memcmp(buffer, "hair", size) => 0;
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
||||||
|
|
||||||
@@ -146,8 +153,9 @@ code = '''
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
[[case]] # truncate and write
|
[[case]] # truncate and write
|
||||||
define.MEDIUMSIZE = [32, 2048]
|
define.MEDIUMSIZE = [31, 32, 33, 511, 512, 513, 2047, 2048, 2049]
|
||||||
define.LARGESIZE = 8192
|
define.LARGESIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
|
||||||
|
if = 'MEDIUMSIZE < LARGESIZE'
|
||||||
code = '''
|
code = '''
|
||||||
lfs_format(&lfs, &cfg) => 0;
|
lfs_format(&lfs, &cfg) => 0;
|
||||||
lfs_mount(&lfs, &cfg) => 0;
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
@@ -157,7 +165,8 @@ code = '''
|
|||||||
strcpy((char*)buffer, "hair");
|
strcpy((char*)buffer, "hair");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
|
||||||
|
=> lfs_min(size, LARGESIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => LARGESIZE;
|
lfs_file_size(&lfs, &file) => LARGESIZE;
|
||||||
|
|
||||||
@@ -168,13 +177,16 @@ code = '''
|
|||||||
lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDWR) => 0;
|
lfs_file_open(&lfs, &file, "baldywrite", LFS_O_RDWR) => 0;
|
||||||
lfs_file_size(&lfs, &file) => LARGESIZE;
|
lfs_file_size(&lfs, &file) => LARGESIZE;
|
||||||
|
|
||||||
|
/* truncate */
|
||||||
lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
|
lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
|
||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
|
|
||||||
|
/* and write */
|
||||||
strcpy((char*)buffer, "bald");
|
strcpy((char*)buffer, "bald");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
|
|
||||||
@@ -187,8 +199,9 @@ code = '''
|
|||||||
|
|
||||||
size = strlen("bald");
|
size = strlen("bald");
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => size;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
memcmp(buffer, "bald", size) => 0;
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
memcmp(buffer, "bald", lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
||||||
|
|
||||||
@@ -198,7 +211,7 @@ code = '''
|
|||||||
|
|
||||||
[[case]] # truncate write under powerloss
|
[[case]] # truncate write under powerloss
|
||||||
define.SMALLSIZE = [4, 512]
|
define.SMALLSIZE = [4, 512]
|
||||||
define.MEDIUMSIZE = [32, 1024]
|
define.MEDIUMSIZE = [0, 3, 4, 5, 31, 32, 33, 511, 512, 513, 1023, 1024, 1025]
|
||||||
define.LARGESIZE = 2048
|
define.LARGESIZE = 2048
|
||||||
reentrant = true
|
reentrant = true
|
||||||
code = '''
|
code = '''
|
||||||
@@ -216,10 +229,11 @@ code = '''
|
|||||||
size == MEDIUMSIZE ||
|
size == MEDIUMSIZE ||
|
||||||
size == SMALLSIZE);
|
size == SMALLSIZE);
|
||||||
for (lfs_off_t j = 0; j < size; j += 4) {
|
for (lfs_off_t j = 0; j < size; j += 4) {
|
||||||
lfs_file_read(&lfs, &file, buffer, 4) => 4;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(4, size-j))
|
||||||
assert(memcmp(buffer, "hair", 4) == 0 ||
|
=> lfs_min(4, size-j);
|
||||||
memcmp(buffer, "bald", 4) == 0 ||
|
assert(memcmp(buffer, "hair", lfs_min(4, size-j)) == 0 ||
|
||||||
memcmp(buffer, "comb", 4) == 0);
|
memcmp(buffer, "bald", lfs_min(4, size-j)) == 0 ||
|
||||||
|
memcmp(buffer, "comb", lfs_min(4, size-j)) == 0);
|
||||||
}
|
}
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
lfs_file_close(&lfs, &file) => 0;
|
||||||
}
|
}
|
||||||
@@ -230,19 +244,23 @@ code = '''
|
|||||||
strcpy((char*)buffer, "hair");
|
strcpy((char*)buffer, "hair");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
for (lfs_off_t j = 0; j < LARGESIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, LARGESIZE-j))
|
||||||
|
=> lfs_min(size, LARGESIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => LARGESIZE;
|
lfs_file_size(&lfs, &file) => LARGESIZE;
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
lfs_file_close(&lfs, &file) => 0;
|
||||||
|
|
||||||
lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0;
|
lfs_file_open(&lfs, &file, "baldy", LFS_O_RDWR) => 0;
|
||||||
lfs_file_size(&lfs, &file) => LARGESIZE;
|
lfs_file_size(&lfs, &file) => LARGESIZE;
|
||||||
|
/* truncate */
|
||||||
lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
|
lfs_file_truncate(&lfs, &file, MEDIUMSIZE) => 0;
|
||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
|
/* and write */
|
||||||
strcpy((char*)buffer, "bald");
|
strcpy((char*)buffer, "bald");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
lfs_file_close(&lfs, &file) => 0;
|
||||||
@@ -254,7 +272,8 @@ code = '''
|
|||||||
strcpy((char*)buffer, "comb");
|
strcpy((char*)buffer, "comb");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < SMALLSIZE; j += size) {
|
for (lfs_off_t j = 0; j < SMALLSIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, SMALLSIZE-j))
|
||||||
|
=> lfs_min(size, SMALLSIZE-j);
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => SMALLSIZE;
|
lfs_file_size(&lfs, &file) => SMALLSIZE;
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
lfs_file_close(&lfs, &file) => 0;
|
||||||
@@ -394,7 +413,7 @@ code = '''
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
[[case]] # noop truncate
|
[[case]] # noop truncate
|
||||||
define.MEDIUMSIZE = [32, 2048]
|
define.MEDIUMSIZE = [32, 33, 512, 513, 2048, 2049, 8192, 8193]
|
||||||
code = '''
|
code = '''
|
||||||
lfs_format(&lfs, &cfg) => 0;
|
lfs_format(&lfs, &cfg) => 0;
|
||||||
lfs_mount(&lfs, &cfg) => 0;
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
@@ -404,10 +423,11 @@ code = '''
|
|||||||
strcpy((char*)buffer, "hair");
|
strcpy((char*)buffer, "hair");
|
||||||
size = strlen((char*)buffer);
|
size = strlen((char*)buffer);
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_write(&lfs, &file, buffer, size) => size;
|
lfs_file_write(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
|
||||||
// this truncate should do nothing
|
// this truncate should do nothing
|
||||||
lfs_file_truncate(&lfs, &file, j+size) => 0;
|
lfs_file_truncate(&lfs, &file, j+lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
|
|
||||||
@@ -417,8 +437,9 @@ code = '''
|
|||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
|
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => size;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
memcmp(buffer, "hair", size) => 0;
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
||||||
|
|
||||||
@@ -430,44 +451,11 @@ code = '''
|
|||||||
lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0;
|
lfs_file_open(&lfs, &file, "baldynoop", LFS_O_RDWR) => 0;
|
||||||
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
lfs_file_size(&lfs, &file) => MEDIUMSIZE;
|
||||||
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
for (lfs_off_t j = 0; j < MEDIUMSIZE; j += size) {
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => size;
|
lfs_file_read(&lfs, &file, buffer, lfs_min(size, MEDIUMSIZE-j))
|
||||||
memcmp(buffer, "hair", size) => 0;
|
=> lfs_min(size, MEDIUMSIZE-j);
|
||||||
|
memcmp(buffer, "hair", lfs_min(size, MEDIUMSIZE-j)) => 0;
|
||||||
}
|
}
|
||||||
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
lfs_file_read(&lfs, &file, buffer, size) => 0;
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
lfs_file_close(&lfs, &file) => 0;
|
||||||
lfs_unmount(&lfs) => 0;
|
lfs_unmount(&lfs) => 0;
|
||||||
'''
|
'''
|
||||||
|
|
||||||
[[case]] # barrier truncate
|
|
||||||
code = '''
|
|
||||||
lfs_format(&lfs, &cfg) => 0;
|
|
||||||
lfs_mount(&lfs, &cfg) => 0;
|
|
||||||
lfs_file_open(&lfs, &file, "barrier",
|
|
||||||
LFS_O_RDWR | LFS_O_CREAT) => 0;
|
|
||||||
|
|
||||||
uint8_t bad_byte = 2;
|
|
||||||
uint8_t *rb = buffer + cfg.block_size;
|
|
||||||
|
|
||||||
/* Write a series of 1s to the first block */
|
|
||||||
memset(buffer, 1, cfg.block_size);
|
|
||||||
lfs_file_write(&lfs, &file, buffer,
|
|
||||||
cfg.block_size) => cfg.block_size;
|
|
||||||
|
|
||||||
/* Write a single non-one to the second block */
|
|
||||||
lfs_file_write(&lfs, &file, &bad_byte, 1) => 1;
|
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
|
||||||
|
|
||||||
lfs_file_open(&lfs, &file, "barrier", LFS_O_RDWR) => 0;
|
|
||||||
lfs_file_truncate(&lfs, &file, cfg.block_size) => 0;
|
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
|
||||||
|
|
||||||
/* Read the first block, which should match buffer */
|
|
||||||
lfs_file_open(&lfs, &file, "barrier", LFS_O_RDWR) => 0;
|
|
||||||
lfs_file_read(&lfs, &file, rb,
|
|
||||||
cfg.block_size) => cfg.block_size;
|
|
||||||
lfs_file_close(&lfs, &file) => 0;
|
|
||||||
|
|
||||||
lfs_unmount(&lfs) => 0;
|
|
||||||
|
|
||||||
memcmp(buffer, rb, cfg.block_size) => 0;
|
|
||||||
'''
|
|
||||||
|
|||||||
Reference in New Issue
Block a user