Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/littlefs-project/littlefs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lfs.c5
-rwxr-xr-xtests/test_truncate.sh144
2 files changed, 147 insertions, 2 deletions
diff --git a/lfs.c b/lfs.c
index b0e6819..71dad3a 100644
--- a/lfs.c
+++ b/lfs.c
@@ -2867,13 +2867,14 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) {
// lookup new head in ctz skip list
err = lfs_ctz_find(lfs, NULL, &file->cache,
file->ctz.head, file->ctz.size,
- size, &file->ctz.head, &(lfs_off_t){0});
+ size, &file->block, &file->off);
if (err) {
return err;
}
+ file->ctz.head = file->block;
file->ctz.size = size;
- file->flags |= LFS_F_DIRTY;
+ file->flags |= LFS_F_DIRTY | LFS_F_READING;
} else if (size > oldsize) {
lfs_off_t pos = file->pos;
diff --git a/tests/test_truncate.sh b/tests/test_truncate.sh
index 053b2e0..c12fc0d 100755
--- a/tests/test_truncate.sh
+++ b/tests/test_truncate.sh
@@ -11,6 +11,150 @@ tests/test.py << TEST
lfs_format(&lfs, &cfg) => 0;
TEST
+echo "--- Simple truncate ---"
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldynoop",
+ LFS_O_WRONLY | LFS_O_CREAT) => 0;
+
+ strcpy((char*)buffer, "hair");
+ size = strlen((char*)buffer);
+ for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
+ lfs_file_write(&lfs, &file[0], buffer, size) => size;
+ }
+ lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldynoop", LFS_O_RDWR) => 0;
+ lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
+
+ lfs_file_truncate(&lfs, &file[0], $MEDIUMSIZE) => 0;
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldynoop", LFS_O_RDONLY) => 0;
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ size = strlen("hair");
+ for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
+ lfs_file_read(&lfs, &file[0], buffer, size) => size;
+ memcmp(buffer, "hair", size) => 0;
+ }
+ lfs_file_read(&lfs, &file[0], buffer, size) => 0;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+
+echo "--- Truncate and read ---"
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldyread",
+ LFS_O_WRONLY | LFS_O_CREAT) => 0;
+
+ strcpy((char*)buffer, "hair");
+ size = strlen((char*)buffer);
+ for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
+ lfs_file_write(&lfs, &file[0], buffer, size) => size;
+ }
+ lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldyread", LFS_O_RDWR) => 0;
+ lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
+
+ lfs_file_truncate(&lfs, &file[0], $MEDIUMSIZE) => 0;
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ size = strlen("hair");
+ for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
+ lfs_file_read(&lfs, &file[0], buffer, size) => size;
+ memcmp(buffer, "hair", size) => 0;
+ }
+ lfs_file_read(&lfs, &file[0], buffer, size) => 0;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldyread", LFS_O_RDONLY) => 0;
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ size = strlen("hair");
+ for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
+ lfs_file_read(&lfs, &file[0], buffer, size) => size;
+ memcmp(buffer, "hair", size) => 0;
+ }
+ lfs_file_read(&lfs, &file[0], buffer, size) => 0;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+
+echo "--- Truncate and write ---"
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldywrite",
+ LFS_O_WRONLY | LFS_O_CREAT) => 0;
+
+ strcpy((char*)buffer, "hair");
+ size = strlen((char*)buffer);
+ for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
+ lfs_file_write(&lfs, &file[0], buffer, size) => size;
+ }
+ lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldywrite", LFS_O_RDWR) => 0;
+ lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
+
+ lfs_file_truncate(&lfs, &file[0], $MEDIUMSIZE) => 0;
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ strcpy((char*)buffer, "bald");
+ size = strlen((char*)buffer);
+ for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
+ lfs_file_write(&lfs, &file[0], buffer, size) => size;
+ }
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &cfg) => 0;
+ lfs_file_open(&lfs, &file[0], "baldywrite", LFS_O_RDONLY) => 0;
+ lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
+
+ size = strlen("bald");
+ for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
+ lfs_file_read(&lfs, &file[0], buffer, size) => size;
+ memcmp(buffer, "bald", size) => 0;
+ }
+ lfs_file_read(&lfs, &file[0], buffer, size) => 0;
+
+ lfs_file_close(&lfs, &file[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+
+# More aggressive general truncation tests
truncate_test() {
STARTSIZES="$1"
STARTSEEKS="$2"