X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Ffs%2Fbattfs_test.c;h=e3996cab78a21894c35149c6ff486937229ce41f;hb=500fbef0b281c79719c73ba1a818db54057f74b7;hp=927048b224f097a35c80fd84ac9bf418895eb83b;hpb=5bf6908b6db5a4a038fc62ef16e065e351d520b4;p=bertos.git diff --git a/bertos/fs/battfs_test.c b/bertos/fs/battfs_test.c index 927048b2..e3996cab 100644 --- a/bertos/fs/battfs_test.c +++ b/bertos/fs/battfs_test.c @@ -126,7 +126,8 @@ static bool disk_close(struct BattFsSuper *d) static void testCheck(BattFsSuper *disk, pgcnt_t *reference) { - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); for (int i = 0; i < disk->page_count; i++) { @@ -148,12 +149,12 @@ static void testCheck(BattFsSuper *disk, pgcnt_t *reference) kprintf("%04d ", reference[i]); } kputchar('\n'); - battfs_close(disk); + battfs_umount(disk); exit(2); } } ASSERT(battfs_fsck(disk)); - battfs_close(disk); + battfs_umount(disk); } static void diskNew(BattFsSuper *disk) @@ -353,7 +354,8 @@ static void openFile(BattFsSuper *disk) fclose(fp); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(!battfs_fileExists(disk, INEXISTENT_INODE)); ASSERT(battfs_fileExists(disk, INODE)); @@ -389,7 +391,7 @@ static void openFile(BattFsSuper *disk) ASSERT(kfile_close(&fd2.fd) == 0); ASSERT(LIST_EMPTY(&disk->file_opened_list)); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("10: passed\n"); } @@ -419,7 +421,8 @@ static void readFile(BattFsSuper *disk) fclose(fp); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); ASSERT(fd1.fd.seek_pos == sizeof(buf)); @@ -428,7 +431,7 @@ static void readFile(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("11: passed\n"); } @@ -457,7 +460,8 @@ static void readAcross(BattFsSuper *disk) fclose(fp); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); @@ -488,7 +492,7 @@ static void readAcross(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("12: passed\n"); } @@ -522,7 +526,8 @@ static void writeFile(BattFsSuper *disk) for (size_t i = 0; i < sizeof(buf); i++) buf[i] = i; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); ASSERT(fd1.fd.seek_pos == sizeof(buf)); @@ -536,7 +541,7 @@ static void writeFile(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("13: passed\n"); } @@ -565,7 +570,8 @@ static void writeAcross(BattFsSuper *disk) fclose(fp); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); uint8_t val = 0; @@ -607,7 +613,7 @@ static void writeAcross(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("14: passed\n"); } @@ -626,7 +632,8 @@ static void createFile(BattFsSuper *disk) inode_t INODE = 0; unsigned int MODE = BATTFS_CREATE; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); for (int i = 0; i < FILE_SIZE / 2; i++) ASSERT(kfile_putc(i, &fd1.fd) != EOF); @@ -635,9 +642,10 @@ static void createFile(BattFsSuper *disk) ASSERT(fd1.fd.size == FILE_SIZE / 2); ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); ASSERT(fd1.fd.size == FILE_SIZE / 2); ASSERT(fd1.fd.seek_pos == 0); @@ -652,7 +660,7 @@ static void createFile(BattFsSuper *disk) ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("15: passed\n"); @@ -673,7 +681,8 @@ static void multipleWrite(BattFsSuper *disk) unsigned int MODE = BATTFS_CREATE; uint8_t buf[1000]; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); int j; @@ -696,9 +705,10 @@ static void multipleWrite(BattFsSuper *disk) } ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); ASSERT(fd1.fd.size == sizeof(buf)); @@ -708,7 +718,7 @@ static void multipleWrite(BattFsSuper *disk) ASSERT(buf[i] == ((j-1+i) & 0xff)); ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("16: passed\n"); @@ -729,7 +739,8 @@ static void increaseFile(BattFsSuper *disk) unsigned int MODE = BATTFS_CREATE; uint8_t buf[1000]; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE1, MODE)); ASSERT(battfs_fileopen(disk, &fd2, INODE2, MODE)); for (unsigned i = 0; i < sizeof(buf); i++) @@ -754,7 +765,7 @@ static void increaseFile(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(kfile_close(&fd2.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("17: passed\n"); } @@ -784,7 +795,8 @@ static void readEOF(BattFsSuper *disk) fclose(fp); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(kfile_seek(&fd1.fd, fd1.fd.size + 10, SEEK_SET) == fd1.fd.size + 10); ASSERT(fd1.fd.seek_pos == fd1.fd.size + 10); @@ -792,7 +804,7 @@ static void readEOF(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("18: passed\n"); } @@ -815,7 +827,8 @@ static void writeEOF(BattFsSuper *disk) for (int i = 0; i < 2; i++) buf[i] = i; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); disk_size_t prev_free = disk->free_bytes; ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(fd1.fd.size == 0); @@ -871,17 +884,128 @@ static void writeEOF(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("19: passed\n"); } +static void endOfSpace(BattFsSuper *disk) +{ + TRACEMSG("20: what happens when disk space is over?\n"); + BattFs fd1; + uint8_t buf[(PAGE_SIZE - BATTFS_HEADER_LEN) * 5]; + + fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + + disk->erase(disk, 0); + disk->erase(disk, 1); + disk->erase(disk, 2); + disk->erase(disk, 3); + fclose(fp); + + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == PAGE_FILL * 4); + ASSERT(fd1.fd.size == (kfile_off_t)(PAGE_FILL * 4)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)(PAGE_FILL * 4)); + ASSERT(disk->free_bytes == 0); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("20: passed\n"); +} + + +static void multipleFilesRW(BattFsSuper *disk) +{ + TRACEMSG("21: multiple files read/write test\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + #define N_FILES 10 + BattFs fd[N_FILES]; + unsigned int MODE = BATTFS_CREATE; + uint32_t buf[FILE_SIZE / (4 * N_FILES * sizeof(uint32_t))]; + + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + for (inode_t i = 0; i < N_FILES; i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); + + for (int i = N_FILES - 1; i >= 0; i--) + { + for (uint32_t j = 0; j < countof(buf); j++) + buf[j] = j+i; + + ASSERT(kfile_write(&fd[i].fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd[i].fd.size == sizeof(buf)); + ASSERT(fd[i].fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd[i].fd, 0, SEEK_SET) == 0); + } + + for (inode_t i = 0; i < N_FILES; i++) + { + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd[i].fd, buf, sizeof(buf)) == sizeof(buf)); + + for (uint32_t j = 0; j < countof(buf); j++) + ASSERT(buf[j] == j+i); + + ASSERT(fd[i].fd.size == sizeof(buf)); + ASSERT(fd[i].fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd[i].fd, 0, SEEK_SET) == 0); + } + + for (inode_t i = 0; i < N_FILES; i++) + ASSERT(kfile_close(&fd[i].fd) == 0); + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + + for (inode_t i = 0; i < N_FILES; i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, 0)); + + for (inode_t i = 0; i < N_FILES; i++) + { + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd[i].fd, buf, sizeof(buf)) == sizeof(buf)); + + for (uint32_t j = 0; j < countof(buf); j++) + ASSERT(buf[j] == j+i); + + ASSERT(fd[i].fd.size == sizeof(buf)); + ASSERT(fd[i].fd.seek_pos == sizeof(buf)); + ASSERT(kfile_seek(&fd[i].fd, 0, SEEK_SET) == 0); + } + + for (inode_t i = 0; i < N_FILES; i++) + ASSERT(kfile_close(&fd[i].fd) == 0); + + ASSERT(battfs_umount(disk)); + TRACEMSG("21: passed\n"); +} + int battfs_testRun(void) { BattFsSuper disk; + disk.page_size = PAGE_SIZE; disk.open = disk_open; disk.read = disk_page_read; disk.load = disk_page_load; @@ -908,6 +1032,8 @@ int battfs_testRun(void) increaseFile(&disk); readEOF(&disk); writeEOF(&disk); + endOfSpace(&disk); + multipleFilesRW(&disk); kprintf("All tests passed!\n");